运维安全 v1.0.0
server-security-audit
Linux 服务器安全巡检。一键检查木马后门、敏感文件暴露、未授权访问、证书到期、SSH 爆破、磁盘与备份状态,输出分级报告和修复建议。适用于宝塔/Nginx/PHP 环境。
安装这个技能
一键安装
hermes skills install https://ai.heziya.com/skills/server-security-audit/SKILL.md --category devops 自动发现安装
hermes skills install well-known:https://ai.heziya.com/.well-known/skills/server-security-audit 下载文件(需登录)
Linux 服务器安全巡检
对一台生产服务器做只读体检,输出分级风险报告。不改任何配置,先诊断后建议。
使用时机
- 新接手的服务器要做基线检查
- 站点被黑、被挂马、被搜索引擎降权后排查
- 定期巡检(建议每周一次)
- 上线前的安全检查
巡检原则
- 只读优先:第一轮全部只读,不改任何文件
- 先取证后清理:发现可疑文件先复制到隔离区,再处理
- 不动其他站点:多站点服务器只检查,不擅自修改
- 每条结论都要有证据:命令 + 输出,不猜
巡检清单
一、系统基线
# 系统与运行时间
cat /etc/os-release | head -3
uptime
# 磁盘、内存、负载
df -h /
free -m
# 最近登录
last -n 10
判断标准:
- 根分区使用率 > 80% → 警告
- 可用内存 < 200MB → 警告
- 负载持续 > CPU 核数 → 排查进程
二、SSH 安全
# 爆破统计
grep -c "Failed password" /var/log/secure 2>/dev/null
# fail2ban 状态
fail2ban-client status sshd 2>/dev/null
# 当前登录会话
who
判断标准:
- 失败次数 > 10000 且无 fail2ban → 高危
- 存在陌生 IP 的成功登录 → 立即排查
三、木马与后门扫描
# 1. 站点目录下的可疑 PHP(一句话木马特征)
grep -rlE "eval\s*\(\s*\\\$_|assert\s*\(\s*\\\$_|base64_decode\s*\(\s*\\\$_|system\s*\(\s*\\\$_(GET|POST)" \
/www/wwwroot/ --include="*.php" 2>/dev/null | head -20
# 2. 近期被修改的 PHP 文件(7 天内)
find /www/wwwroot/ -name "*.php" -mtime -7 2>/dev/null | head -30
# 3. 权限异常的文件(777)
find /www/wwwroot/ -type f -perm 777 2>/dev/null | head -20
# 4. 非标准后缀的可执行文件
find /www/wwwroot/ -type f \( -name "*.php1" -o -name "*.php.bak" -o -name "*.phtml" \) 2>/dev/null | head -20
判断标准:
- 命中一句话木马特征 → 高危,立即隔离
- 777 权限的可执行 PHP → 高危
- 非标准后缀文件 → 中危,逐个确认
四、敏感文件暴露检查
对每个站点,用 curl 实测以下路径是否可下载(应全部 404/403):
for host in example.com www.example.com; do
for path in \
/wp-config.php.bak /wp-config.php~ /wp-config.php.save \
/.env /.git/config /config.php.bak /backup.sql /db.sql \
/phpinfo.php /install.php1 /1.txt; do
code=$(curl -s -o /dev/null -w "%{http_code}" -H "Host: $host" "http://127.0.0.1$path")
[ "$code" = "200" ] && echo "❌ 暴露: $host$path ($code)"
done
done
判断标准:
- 任一敏感文件返回 200 → 高危,立即移出网站目录
五、Nginx 配置检查
# 语法检查
nginx -t
# 是否误开了目录浏览
grep -rn "autoindex on" /www/server/panel/vhost/nginx/ 2>/dev/null
# PHP 是否在 uploads 目录可执行
grep -rn "uploads.*php" /www/server/panel/vhost/nginx/ 2>/dev/null
# 是否有拦截规则
ls /www/server/panel/vhost/nginx/extension/*/security-deny.conf 2>/dev/null
六、证书到期检查
for cert in /www/server/panel/vhost/cert/*/fullchain.pem; do
domain=$(basename $(dirname $cert))
end=$(openssl x509 -in "$cert" -noout -enddate 2>/dev/null | cut -d= -f2)
days=$(( ($(date -d "$end" +%s) - $(date +%s)) / 86400 ))
printf "%-30s %s 天后到期\n" "$domain" "$days"
done
判断标准:
- < 30 天 → 提醒续期
- < 0 天 → 高危,证书已过期
七、数据库安全
# 是否监听公网
ss -tlnp | grep 3306
# 慢查询与连接数
mysql -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null
判断标准:
- 3306 监听 0.0.0.0 → 高危(应只监听 127.0.0.1)
八、备份验证
# 备份目录与最近备份时间
ls -lht /www/backup/ 2>/dev/null | head -10
# 备份文件大小是否正常(0 字节说明备份失败)
find /www/backup/ -name "*.sql" -size 0 2>/dev/null
输出格式
按风险分级输出报告:
# 服务器安全巡检报告
巡检时间:2026-XX-XX
主机:xxx.xxx.xxx.xxx
## 🔴 高危(立即处理)
1. [问题描述]
- 证据:`命令输出`
- 建议:具体操作
## 🟡 中危(本周处理)
...
## 🟢 正常项
- SSH 防爆破:fail2ban 运行中,已拦截 N 次
- 证书:全部 30 天以上
...
## 总结
风险总数:X 高危 / Y 中危
建议优先处理:...
常见坑
- 直接删可疑文件 → 应先复制到隔离区再处理,否则丢失取证依据
- 只扫 PHP 不扫 JS → 黑帽 SEO 常在前端 JS 注入赌博/色情跳转
- 忘了看 HTML 文件 → 静态站被挂马往往改的是
.html - nginx -t 通过就以为没问题 → 配置语法对不代表规则安全
- 备份只看有没有文件 → 要验证大小、可解压、MD5
验证方法
修复后必须复验:
- 敏感文件 → 再 curl 一次,确认 404
- 木马文件 → 确认已隔离且站点正常
- 配置修改 →
nginx -t+nginx -s reload+ 实站访问 - 证书 →
openssl x509确认日期