每月一次:服务器安全巡检清单

安全不是配置一次就完事,系统在变、威胁在变,配置会漂移。小够整理了一份每月 20 分钟的安全巡检清单:更新状态、登录审计、用户密钥盘点、端口复查、备份验证、证书有效期,照着打勾,形成习惯。

我是小够。这个月讲了 SSH 加固、fail2ban、UFW、密钥管理、面板安全——配一次就够了吗?不够。系统会更新、业务会变化、配置会"漂移":当初关掉的端口,装新应用时又打开了;当初删掉的临时用户,早就忘了。安全是状态,不是动作,需要定期巡检。今天给一份每月 20 分钟的清单,照着打勾。

1. 更新状态(3 分钟)

sudo apt update && apt list --upgradable

看看有没有积压的安全更新。开了自动更新的话,这里应该经常是空的;如果攒了一堆,说明自动更新没生效,去查 unattended-upgrades 的日志。

2. 登录审计(5 分钟)

sudo grep "Accepted" /var/log/auth.log | tail -30
last -20

最近一个月的成功登录,每一条都要能解释:时间、IP、用户。重点找:凌晨登录、陌生 IP、不认识的用户。顺手看一眼 fail2ban 封了多少 IP:sudo fail2ban-client status sshd,如果某个 IP 反复出现,考虑永久拉黑。

3. 用户与密钥盘点(3 分钟)

cat /etc/passwd | grep -v nologin | grep -v false

能登录的用户列表,对着当初的记录核对:临时用户删了吗?离职同事的账号下了吗?再抽查一两个用户的 authorized_keys,公钥都有主、可解释。

4. 端口与防火墙复查(3 分钟)

sudo ss -tlnp
sudo ufw status numbered

本机监听的端口和防火墙规则对得上吗?这个月装的新应用有没有多开端口?规则顺序有没有被打乱?nmap 从外网扫一遍做交叉验证更好,抽空做一次。

5. 备份验证(3 分钟)

回答三个问题:备份任务上个月正常跑了吗?备份文件能下载/读取吗?(抽查一个月做一次真实恢复演练。)没验证过的备份等于没有备份,这句话每月提醒自己一遍。

6. 证书与域名有效期(2 分钟)

echo | openssl s_client -connect 你的域名:443 2>/dev/null | openssl x509 -noout -dates

Let’s Encrypt 自动续期偶尔会失败,提前发现,别等用户报"网站不安全"才知道。域名本身的有效期也顺手看一眼,过期赎回的代价巨大。

7. 磁盘与资源(1 分钟)

df -h

磁盘满了会导致服务异常、日志写不进,安全事件都记不下来。80% 以上就该清理或扩容了。

8. 面板与应用更新(2 分钟)

如果你用了宝塔/1Panel,看一眼面板有没有更新提示;WordPress 这类应用,看一眼核心和插件有没有安全更新。系统更新是自动的,应用更新很多要手动点——巡检时顺手处理掉,别攒。

巡检报告:写下来才算数

口头"我看过了"等于没看过。报告不用正式,一个清单打勾就行:

2025-05-31 巡检(xiaogou)
[x] 更新:无积压
[x] 登录审计:无异常(fail2ban 本月封 37 IP,无成功入侵)
[x] 用户:4 个可登录用户,均在册
[x] 端口:ss -tlnp 与上月一致,无新增
[x] 备份:5-30 备份成功,大小 2.1G
[x] 证书:到期 2025-08-15,正常
[x] 磁盘:/ 使用 62%
[ ] 应用更新:WordPress 有 1 个插件更新,已安排今晚升级

存成文档,下个月对比。连续几个月"一切正常",这份记录就是你的安全感来源;真出事了,它也是排查的第一手资料。

异常分级:发现不对劲怎么办

巡检时发现异常,按级别处理:

  • P3 记录观察:fail2ban 封禁数比平时多,但没有成功入侵。记下来,下个月对比趋势。
  • P2 当天处理:发现陌生用户、不明定时任务、磁盘异常增长。当天查清,备份数据。
  • P1 立即响应:发现不明成功登录、可疑进程。按"疑似入侵"流程走:断网(安全组先封)、备份证据(日志拷出来)、评估是否重装。

分级的好处:不至于"一有风吹草动就重装",也不至于"真出事了还觉得没事"。冷静分级,逐级响应。

半自动化:脚本 + 定时任务

巡检里 1-7 项大部分可以脚本化:写个 shell 脚本输出报告,cron 每月 1 号跑,结果发邮箱。人工只做"看报告、打勾、处理异常"这部分。脚本模板本站后续会单独出一篇,核心思路就是把上面的命令串起来。记住:自动化负责收集,人工负责判断,别反过来。

下面给一个能直接用的巡检脚本骨架,存成 ~/bin/monthly-audit.sh:

#!/bin/bash
REPORT=~/audit-$(date +%Y%m).txt
{
echo "===== 1. 待更新 ====="
apt list --upgradable 2>/dev/null | tail -n +2
echo "===== 2. 最近登录 ====="
last -20
echo "===== 3. 可登录用户 ====="
grep -v nologin /etc/passwd | grep -v false | cut -d: -f1
echo "===== 4. 监听端口 ====="
ss -tlnp
echo "===== 5. 磁盘 ====="
df -h /
echo "===== 6. fail2ban 状态 ====="
fail2ban-client status sshd 2>/dev/null | head -12
} > "$REPORT"
echo "巡检报告已生成:$REPORT"

cron 里加一行,每月 1 号早上 8 点跑:

0 8 1 * * /home/你的用户/bin/monthly-audit.sh

跑上三个月,你就有了一套完整的巡检档案。真出事需要追溯时,按月份翻报告,比临时抱佛脚强一百倍。

巡检日历:一年 12 次的节奏

每月 1 号是固定巡检日,但有些事不用每月做,排个年度节奏:

  • 每月:上面的 1-8 项常规巡检。
  • 每季度:做一次真实恢复演练(从备份恢复到测试机,确认能用);review 一次安全组/防火墙规则,删过期规则。
  • 每半年:轮换一次重要密码;检查一次密钥清单,该吊销的吊销。
  • 每年: review 一次整体架构——还用得上这台机器吗?配置要不要降?有没有更便宜的替代?安全投入要和业务规模匹配,别为吃灰的机器操心。

把这四个节奏写进日历,设重复提醒。安全习惯最怕"想起来才做",固定节奏才能持久。

团队版:多人服务器的分工

如果是小团队共用服务器,巡检要分工,不然就是"都觉得对方会看":

  • 指定一个人为"安全负责人",每月巡检他牵头,报告他归档。
  • 账号严格一人一号,禁用共用账号——出问题查日志,连是谁都定位不到,等于白记。
  • 人员离职当天:删账号、删公钥、换共用服务的密码。这三件事列入离职 checklist,别靠"记得"。

个人用户不用这么复杂,但"一人一号"的原则同样适用:给帮忙的朋友建临时账号,事办完就删,别把你的主力账号密码告诉别人。

巡检本身也要复盘

每半年回头看看巡检报告:有没有连续几个月都"一切正常"的项?有的话,可以考虑自动化掉,把人工时间腾给更重要的事。有没有每次都出问题的项?说明根因没解决,要升级处理(比如每月都磁盘告警,就该扩容而不是每月清理)。巡检不是为了打勾,是为了让系统越来越省心。

形成习惯

把这份清单存成文档,每月固定一天(比如 1 号)执行,打勾存档。20 分钟,换的是"我看过,没问题"的安全感。小够的运维哲学:自动化做日常,人工做巡检。机器负责 7×24 小时盯着,人负责每月看一次大局。两样都有,才算完整。