运维安全 v1.0.0

server-security-audit

Linux 服务器安全巡检。一键检查木马后门、敏感文件暴露、未授权访问、证书到期、SSH 爆破、磁盘与备份状态,输出分级报告和修复建议。适用于宝塔/Nginx/PHP 环境。

Linux 服务器安全巡检

对一台生产服务器做只读体检,输出分级风险报告。不改任何配置,先诊断后建议。

使用时机

  • 新接手的服务器要做基线检查
  • 站点被黑、被挂马、被搜索引擎降权后排查
  • 定期巡检(建议每周一次)
  • 上线前的安全检查

巡检原则

  1. 只读优先:第一轮全部只读,不改任何文件
  2. 先取证后清理:发现可疑文件先复制到隔离区,再处理
  3. 不动其他站点:多站点服务器只检查,不擅自修改
  4. 每条结论都要有证据:命令 + 输出,不猜

巡检清单

一、系统基线

# 系统与运行时间
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 中危
建议优先处理:...

常见坑

  1. 直接删可疑文件 → 应先复制到隔离区再处理,否则丢失取证依据
  2. 只扫 PHP 不扫 JS → 黑帽 SEO 常在前端 JS 注入赌博/色情跳转
  3. 忘了看 HTML 文件 → 静态站被挂马往往改的是 .html
  4. nginx -t 通过就以为没问题 → 配置语法对不代表规则安全
  5. 备份只看有没有文件 → 要验证大小、可解压、MD5

验证方法

修复后必须复验:

  1. 敏感文件 → 再 curl 一次,确认 404
  2. 木马文件 → 确认已隔离且站点正常
  3. 配置修改 → nginx -t + nginx -s reload + 实站访问
  4. 证书 → openssl x509 确认日期