入侵检测系统
Table of Contents
mtree 以种子值生成目录校验和规范,可事后比对以识别文件变更
本节介绍规范创建、模拟篡改和校验验证的完整流程
入侵检测系统(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.
生成规范文件
内置的 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_mtree
上述示例中的 123456789、/home/ykla 为占位符,须替换为实际的值 123456789 代表种子值,应随机选取。种子值应牢记,且不应泄露
输出应类似于以下内容:
mtree: /bin checksum: 492144657
同时应防止恶意用户获取种子值与校验和输出结果
规范文件结构
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 # 1
. 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 \ # 2
sha512=3512dafe9764cd4dd94941cd0e9fb35f3c430bb39bd2897fe1011d33b7477bf2e7bf0dd4cc0268aef42ee87dafa987c6e1a3c96a8062ab27feb737849422ecc6
chflags size=7944 time=1777874930.000000000 cksum=3958012774 \ # 3
……以下省略部分输出……
- /set 特殊命令,定义从分析文件中提取的部分设置
- 引用解析目录,表示其类型、模式、硬链接数及 UNIX 格式修改时间等信息
- 引用一份文件,展示其大小、时间及一系列完整性校验哈希值
验证规范文件
要验证二进制文件是否发生变更,可将目录当前内容与先前规范进行比较,并将结果写入文件
$ 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)
以上为命令输出示例,说明元数据修改后的情形
| Next: 第三方漏洞与安全公告 | Previous: OpenSSL | Home: 安全管理 |