公网服务器 24 小时被扫描爆破,一个人盯不过来。AI Agent(如 Hermes)正好能当安全管家:让它定期巡检、发现问题、给出修复建议,甚至自动封禁。本文讲原理、给命令,并附一次真实服务器巡检的完整过程和结论。
把 Hermes 当成一个能 SSH 到服务器、能看懂日志的运维助手,它可以:
一份合格的服务器安全巡检,至少覆盖 13 项:
| 类别 | 检查项 | 危险信号 |
|---|---|---|
| 暴露面 | 开放端口(ss -tlnp) | 非 22/80/443 的端口直接 0.0.0.0 对公网 |
| SSH | PasswordAuthentication | 开着 = 可被密码爆破 |
| PermitRootLogin | yes = 黑客可直接试 root | |
| 账号 | 有 shell 的用户 | 出现不认识的用户 |
| 补丁 | apt 待升级数量 | 几十上百个没更新 |
| 入侵痕迹 | SSH 失败登录日志 | 频繁 Invalid user / Failed password |
| 边界 | ufw / iptables | 防火墙 inactive / INPUT ACCEPT |
| 权限 | 敏感文件权限 | .env / key 文件不是 600 |
| 进程 | 可疑进程 | 不认识的常驻进程、挖矿进程 |
| 文件 | world-writable 文件 | /home /etc /opt 下有 777 文件 |
| 计划任务 | cron | 出现你从没加过的任务 |
| sudo | sudoers NOPASSWD | 普通用户 NOPASSWD:ALL |
| 服务健康 | systemd 状态 | 服务 restarting 循环 = 有故障 |
把下面这些写成脚本,SSH 到服务器跑一遍即可。也可以直接把整段丢给 Hermes,让它逐项解读。
# 1. 开放端口(看谁在公网裸奔) ss -tlnp | grep -vE '127.0.0.1|::1' # 2. SSH 安全配置 sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin' # 3. 有 shell 的用户 grep -E '/(bin/bash|bin/sh)$' /etc/passwd # 4. 待升级补丁数 apt list --upgradable | grep -c upgradable # 5. 近 7 天 SSH 爆破尝试 sudo journalctl -u ssh --since "7 days ago" | grep -c 'Failed password\|Invalid user' # 6. 防火墙 sudo ufw status # 7. 敏感文件权限(应都是 600) ls -la ~/.hermes/.env ~/wechat-auto-publisher/config/config.yaml 2>/dev/null # 8. 可疑进程(新近启动的) ps aux --sort=-start_time | head -8 # 9. world-writable 文件 sudo find /home /etc /opt /usr/local -xdev -type f -perm -0002 2>/dev/null | head # 10. sudo 免密范围 sudo grep -rE 'NOPASSWD' /etc/sudoers /etc/sudoers.d/ 2>/dev/null
下面是 2026-09-27 对一台阿里云 Ubuntu 24.04 服务器(公网环境,运行 166 天)的真实巡检结果。
✅ 做得好的:
🔴 发现的安全隐患:
结论:整体基础不错(密钥登录 + 权限规范 + 自动更新),但防火墙未开 + 5007 端口裸奔 + root 可直连是三个必须处理的高危项——尤其 5007 等于给公网开了个无鉴权入口。
按优先级给出修复命令(改前备份、逐条确认):
① 开防火墙,只放行必要端口(最优先):
ufw status 的 v6 列也放行了(22/80/443 的 IPv6 规则是命令自动生成的,但要确认没被手动挡掉)。sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable sudo ufw status # 确认 active
② 5007 端口要么关要么上 Nginx + 鉴权:
# 方案A:如果 某内部服务 不需要公网访问,改成只听 127.0.0.1 # 方案B:需要公网 → 关掉 5007 直连,改走 Nginx 反代 + 访问控制
curl http://127.0.0.1:5007/api/)+ 通过 nginx 域名各测一次(curl https://你的域名/应用路径/),都通才算完成。③ 禁止 root 直连 SSH:
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sudo systemctl restart ssh
④ 加 SSH 白名单(只允许自己):
echo 'AllowUsers admin' | sudo tee -a /etc/ssh/sshd_config sudo systemctl restart ssh
⑤ 更新系统补丁:
sudo apt update && sudo apt upgrade -y
⑥ 收窄 sudo 免密(只放行必需命令):
/etc/sudoers 里还有 admin ALL=(ALL) NOPASSWD:ALL,它会被最先匹配,sudoers.d 里的规则永远轮不到(实测:文件加了、行为没变)。正确做法:sudo visudo 删掉主文件那行,只在 sudoers.d 留精确白名单,删完用 sudo -n 白名单命令 验证免密、sudo -n 其他命令 验证要密码。# 把 NOPASSWD:ALL 改为只允许特定命令,如:
admin ALL=(ALL) NOPASSWD: /bin/systemctl restart onethingaday.service
⑦ 修 agent-collab 服务循环:journalctl -u agent-collab -n 20 看报错修复,或停掉。
让 Hermes 每周自动巡检一次,报告推到微信/QQ:
hermes cron create "every monday 9am" --prompt "
SSH 到我的服务器,做一次完整安全巡检
(开放端口/SSH 配置/用户/补丁/爆破日志/防火墙/权限),
把发现的问题按优先级列出并给修复命令,推送到微信"
之后每周一早上 9 点,管家自动巡逻并汇报。你只需要偶尔点开报告,决定改不改。
audit.sh 放服务器,cron 调它,输出解析后汇报。脚本只读、幂等、安全。