完整性监控回答的是一个杀毒软件和防火墙都不回答的问题:这台服务器上从上周到现在有什么变了。特征扫描器找的是已知的坏东西;AIDE 对「坏」一无所知,它只知道这个文件昨天不是这样。要找出被追加到既有文件末尾的后门,这是唯一管用的思路。
AIDE 两条命令就能装好。把它配置到让它的报告真的被读,才是更难的部分——而通常正是这一点让它夭折:第一份报告带着一万行来了,第二份没人打开,一个月后那个任务就被删掉了。
安装与第一份数据库
sudo apt install aide aide-common
sudo aideinit
初始化要花几分钟到半小时:会为每个文件计算散列。结果被放在工作数据库旁边,带 .new 后缀,需要把它投入使用:
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
此后检查这样运行:
sudo aide --check
为了让报告可读该排除什么
设置在 /etc/aide/aide.conf 和目录 /etc/aide/aide.conf.d/ 里。Debian 的标准配置检查得太多了,首先要做的就是把那些一直在自行变化的东西拿掉:
/var/log——每秒都在变;- 整个
/var/lib——数据库、软件包状态、服务状态; /var/cache、/tmp、/proc、/sys、/run;- 站点的上传和缓存目录——它们的内容是访客在改。
值得用最严格设置去检查的是一份很窄的清单:
/bin、/sbin、/usr/bin、/usr/sbin——系统的可执行文件;/lib、/usr/lib——库;/etc——配置;/root/.ssh以及你各用户的.ssh目录;- 站点的代码,但不含上传和缓存目录。
衡量标准是:一份普通的每日报告应当能放进一屏。再长的话就说明排除得不够,而它会不再被人读。
数据库放在哪里
一个常被漏掉的要点。如果别人拿到了 root,那么替换一个文件、随即更新 AIDE 的数据库对他毫无难度——而之后的检查会报告一切正常。放在同一台机器上、可写的数据库,只能防意外。
对单台服务器来说合理的最低限度是:
- 每次更新之后把数据库复制到另一台机器上,并把那份副本放回原位再执行检查;
- 或者至少把数据库的校验和单独保存下来,并在检查前核对它:
sha256sum /var/lib/aide/aide.db
哪怕是这么简单的措施,也能把一次悄无声息的调包变成一个可以察觉的事件。
更新数据库是一个有意识的动作
在合理的变更之后——系统更新、站点新版本上线——数据库要重建:
sudo aide --update
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
什么时候做这件事很重要。正确的做法是:读报告,确信每一处变更都能解释,然后再更新。错误而且非常常见的做法是:把 aide --update 挂到计划任务里,好让报告出来是干净的。在第二种情况下系统在跑、报告照来,而变更恰好在它发生的那一刻被记录为正常——也就是说,全部意义已经彻底丢失了。
计划与负载
aide-common 这个包会自己装上一个每日任务。检查会让磁盘和处理器忙上几分钟,所以值得放在安静的时段并降低优先级运行:
0 4 * * * ionice -c3 nice -n19 /usr/bin/aide --check
怎么读报告
三个部分:新增、删除和被改动的文件。对每一处变更它都会显示究竟哪里不同:内容、权限、属主、时间。
该优先反应的是:
- 在更新窗口之外,
/bin、/sbin、/usr/bin里任何文件的变化; - 系统目录里的新文件;
authorized_keys、/etc/passwd、/etc/sudoers、/etc/crontab和/etc/cron.d里的变化;- 出现了文件
/etc/ld.so.preload——它从来不会自己出现。
apt upgrade 之后立刻有一百个文件变了,这是正常的,而报告的时间戳能证实这一点。而在一个没有任何更新的星期三,/usr/bin 里有三个文件变了,那就是停下来查一查的理由。
AIDE 与 debsums
这两个工具解决的是相邻的问题,但它们的比对基准不同。AIDE 与你自己的快照比对——因此它能看到任何文件的变化,包括站点代码。debsums 与发行版软件包里的校验和比对——因此它无需任何事先准备就能看到被替换的系统文件,但对你在软件包之外装的东西一无所知。两个都留着是合理的;实践中通常先装 debsums,因为它既不需要配置也不需要数据库。
它们还共有一个弱点:报告是通过邮件来的,而邮件会丢。所以要紧的不是检查跑过了,而是有一个地方能看到它最新的结果。它是什么样子,见下面的演示页面。