Skip to content

17.8 入侵检测系统(IDS)

mtree 以种子值生成目录校验和规范,可事后比对以识别文件变更。本节介绍规范创建、模拟篡改和校验验证的完整流程。

17.8.1 入侵检测系统(IDS)

验证系统文件和二进制文件的完整性,是系统管理与安全团队掌握变更情况的重要手段。凡能监控系统变更的软件,统称为入侵检测系统(Intrusion Detection System, IDS)。

FreeBSD 原生内置基本 IDS——mtree。不过,每夜安全邮件虽会通报变更,但信息存储于本地,恶意用户仍有机会篡改记录以掩盖其操作。因此,应当另建一套独立的二进制签名,置于只读、属主为 root 的目录;存放在可移动 USB 磁盘或远程服务器上更佳。

建议在每次更新后运行 freebsd-update IDS。目前该命令与 pkgbase 不兼容,报错如下:

sh
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

sh
# mtree -s 123456789 -c -K cksum,sha512 -p /bin > /home/ykla/.bin_chksum_mtree

123456789 代表种子值,应随机选取。种子值应牢记,且不应泄露。

输出应类似于以下内容:

text
mtree: /bin checksum: 492144657

同时应防止恶意用户获取种子值与校验和输出结果。

17.8.3 规范文件结构

mtree 格式描述文件系统对象集合,通常用于创建或验证目录层次结构。

mtree 文件由一系列行组成,每行描述一个文件系统对象(mtree 始终忽略前导空白)。

FreeBSD 系统规范存放于 /etc/mtree 目录中。

前面创建的规范文件可说明其格式与内容:

text
#	   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 验证规范文件

要验证二进制文件是否发生变更,可将目录当前内容与先前规范进行比较,并将结果写入文件。

该命令需要生成原始规范时所用的种子值:

sh
# mtree -s 123456789 -p /bin < /home/ykla/.bin_chksum_mtree >> /home/ykla/.bin_chksum_output

该命令应当输出与创建规范时一致的 /bin 校验和。

sh
mtree: /bin checksum: 492144657

若目录中的二进制文件未曾变更,/home/ykla/.bin_chksum_output 将是一个空文件。

sh
# cat /home/ykla/.bin_chksum_output
#

为了模拟一次变更,可先用 touch 修改 /bin/cat 的时间戳,再执行验证命令:

sh
# touch /bin/cat

再次运行验证命令:

sh
# mtree -s 123456789 -p /bin < /home/ykla/.bin_chksum_mtree >> /home/ykla/.bin_chksum_output
mtree: /bin checksum: 492144657

然后检查 /home/ykla/.bin_chksum_output 文件的输出内容:

sh
# cat /home/ykla/.bin_chksum_output

输出应类似于以下内容:

sh
cat:    modification time (Mon May  4 14:08:50 2026, Mon May  4 18:42:53 2026)

以上为命令输出示例,说明元数据修改后的情形。

17.8.5 课后习题

  1. 使用 mtree/etc 目录创建完整性基线,然后人为修改 /etc/motd 并添加一名用户,再次运行 mtree 检测变更。将检测输出与你的修改操作逐一对应,说明每条检测记录的含义。

  2. 查阅 AIDE(Advanced Intrusion Detection Environment)的文档,比较 mtree 与 AIDE 在功能特性上的差异,说明在生产环境中为何通常选择 AIDE 而非系统自带的 mtree

  3. 设计一个实验:安装一个 rootkit 演示工具(如 chkrootkit),运行后阅读其检测逻辑,结合 IDS 的原理分析为什么完整性校验工具能够或不能检测出内核级 rootkit。