17.8 入侵检测系统(IDS)
mtree 以种子值生成目录校验和规范,可事后比对以识别文件变更。本节介绍规范创建、模拟篡改和校验验证的完整流程。
17.8.1 入侵检测系统(IDS)
验证系统文件和二进制文件的完整性,是系统管理与安全团队掌握变更情况的重要手段。凡能监控系统变更的软件,统称为入侵检测系统(Intrusion Detection System, IDS)。
FreeBSD 原生内置基本 IDS——mtree。不过,每夜安全邮件虽会通报变更,但信息存储于本地,恶意用户仍有机会篡改记录以掩盖其操作。因此,应当另建一套独立的二进制签名,置于只读、属主为 root 的目录;存放在可移动 USB 磁盘或远程服务器上更佳。
建议在每次更新后运行 freebsd-update IDS。目前该命令与 pkgbase 不兼容,报错如下:
freebsd-update is incompatible with the use of packaged base. Please see
https://wiki.freebsd.org/PkgBase for more information.17.8.2 生成规范文件
内置的 mtree 工具可生成目录内容的规范。规范的生成依赖种子值(数值常量),后续检查同样需要它,以此判断文件或二进制文件是否遭修改。攻击者无法获知种子值,伪造或比对校验和将极其困难,甚至不可行。
建议为存放二进制和配置文件的目录,以及所有含敏感数据的目录生成规范。常见对象含 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/etc 和 /usr/local/etc。
下面的示例为 /bin 下的每个系统二进制文件生成一组 SHA-512 哈希值,并存入用户主目录下的隐藏文件 /home/ykla/.bin_chksum_mtree:
# mtree -s 123456789 -c -K cksum,sha512 -p /bin > /home/ykla/.bin_chksum_mtree123456789 代表种子值,应随机选取。种子值应牢记,且不应泄露。
输出应类似于以下内容:
mtree: /bin checksum: 492144657同时应防止恶意用户获取种子值与校验和输出结果。
17.8.3 规范文件结构
mtree 格式描述文件系统对象集合,通常用于创建或验证目录层次结构。
mtree 文件由一系列行组成,每行描述一个文件系统对象(mtree 始终忽略前导空白)。
FreeBSD 系统规范存放于 /etc/mtree 目录中。
前面创建的规范文件可说明其格式与内容:
# user: ykla # 创建规范的用户
# machine: ykla # 机器的主机名
# tree: /bin # 目录路径
# date: Mon May 4 18:35:28 2026 # 规范生成的日期和时间
# .
/set type=file uid=0 gid=0 mode=0555 nlink=1 flags=uarch # ①
. type=dir mode=0755 nlink=2 time=1777888070.971124000
\133 nlink=2 size=11384 time=1777874933.000000000 \
cksum=490895202 \ # ②
sha512=a86c4119b31f6b51a61de9b257e195f3809ed16360ba1bec7f75a13e10c24c2959338f59735f8fea76cf32b140194487080b2dd33374d09cf003ea0cf5ccfbf2
cat size=13424 time=1777874930.000000000 cksum=3028726120 \ # ③
sha512=3512dafe9764cd4dd94941cd0e9fb35f3c430bb39bd2897fe1011d33b7477bf2e7bf0dd4cc0268aef42ee87dafa987c6e1a3c96a8062ab27feb737849422ecc6
chflags size=7944 time=1777874930.000000000 cksum=3958012774 \ # ③
……以下省略部分输出……内容解释:
①:
/set特殊命令,定义从分析文件中提取的部分设置。②:引用解析目录,表示其类型、模式、硬链接数及 UNIX 格式修改时间等信息。
③:引用一份文件,展示其大小、时间及一系列完整性校验哈希值。
17.8.4 验证规范文件
要验证二进制文件是否发生变更,可将目录当前内容与先前规范进行比较,并将结果写入文件。
该命令需要生成原始规范时所用的种子值:
# mtree -s 123456789 -p /bin < /home/ykla/.bin_chksum_mtree >> /home/ykla/.bin_chksum_output该命令应当输出与创建规范时一致的 /bin 校验和。
mtree: /bin checksum: 492144657若目录中的二进制文件未曾变更,/home/ykla/.bin_chksum_output 将是一个空文件。
# cat /home/ykla/.bin_chksum_output
#为了模拟一次变更,可先用 touch 修改 /bin/cat 的时间戳,再执行验证命令:
# touch /bin/cat再次运行验证命令:
# mtree -s 123456789 -p /bin < /home/ykla/.bin_chksum_mtree >> /home/ykla/.bin_chksum_output
mtree: /bin checksum: 492144657然后检查 /home/ykla/.bin_chksum_output 文件的输出内容:
# cat /home/ykla/.bin_chksum_output输出应类似于以下内容:
cat: modification time (Mon May 4 14:08:50 2026, Mon May 4 18:42:53 2026)以上为命令输出示例,说明元数据修改后的情形。
17.8.5 课后习题
使用
mtree为 /etc 目录创建完整性基线,然后人为修改 /etc/motd 并添加一名用户,再次运行mtree检测变更。将检测输出与你的修改操作逐一对应,说明每条检测记录的含义。查阅 AIDE(Advanced Intrusion Detection Environment)的文档,比较
mtree与 AIDE 在功能特性上的差异,说明在生产环境中为何通常选择 AIDE 而非系统自带的mtree。设计一个实验:安装一个 rootkit 演示工具(如
chkrootkit),运行后阅读其检测逻辑,结合 IDS 的原理分析为什么完整性校验工具能够或不能检测出内核级 rootkit。