验证系统文件和二进制文件是非常重要的,因为它能为系统管理员和安全团队提供有关系统更改的信息。用于监控系统变化的软件应用程序称为入侵检测系统(IDS)。
FreeBSD 提供了对基本 IDS 系统的原生支持,称为 mtree(8)。虽然夜间的安全邮件会通知管理员系统的变化,但这些信息是本地存储的,存在恶意用户修改这些信息以隐藏其系统更改的风险。因此,建议创建一组单独的二进制签名,并将其存储在只读的、root 拥有的目录中,或者更理想的是,存储在可移动 USB 磁盘或远程服务器上。
还建议在每次更新后运行 freebsd-update IDS
。
16.4.1. 生成规格文件
内置的 mtree(8) 工具可以用来生成目录内容的规格。一个种子值或数字常量用于生成规格,并且需要用来检查规格是否发生了变化。这样可以判断文件或二进制文件是否已被修改。由于攻击者无法知道种子值,因此伪造或检查文件的校验和值几乎是不可能的。
技巧
推荐为包含二进制文件和配置文件的目录创建规格文件,以及任何包含敏感数据的目录。通常为 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/etc 和 /usr/local/etc 创建规格文件。
以下示例生成一组 sha512
哈希值,每个系统二进制文件对应一个哈希,并将这些值保存到用户主目录中的隐藏文件 /home/user/.bin_chksum_mtree:
# mtree -s 123456789 -c -K cksum,sha512 -p /bin > /home/user/.bin_chksum_mtree
输出应类似于以下内容:
mtree: /bin checksum: 3427012225
警告
123456789
值表示种子,应随机选择。该值应被记住,但不共享。必须将种子值和校验和输出隐藏,以防止恶意用户访问。
16.4.2. 规格文件结构
Mtree 格式是描述文件系统对象集合的文本格式。这些文件通常用于创建或验证目录层次结构。
一个 mtree 文件由一系列行组成,每行提供一个单一文件系统对象的信息。行首的空白字符总是会被忽略。
上面创建的规格文件将用于解释格式和内容:
# user: root ①
# machine: machinename ②
# tree: /bin ③
# date: Thu Aug 24 21:58:37 2023 ④
# .
/set type=file uid=0 gid=0 mode=0555 nlink=1 flags=uarch ⑤
. type=dir mode=0755 nlink=2 time=1681388848.239523000 ⑥
\133 nlink=2 size=12520 time=1685991378.688509000 \
cksum=520880818 \
sha512=5c1374ce0e2ba1b3bc5a41b23f4bbdc1ec89ae82fa01237f376a5eeef41822e68f1d8f75ec46b7bceb65396c122a9d837d692740fdebdcc376a05275adbd3471
cat size=14600 time=1685991378.694601000 cksum=3672531848 \ ⑦
sha512=b30b96d155fdc4795432b523989a6581d71cdf69ba5f0ccb45d9b9e354b55a665899b16aee21982fffe20c4680d11da4e3ed9611232a775c69f926e5385d53a2
chflags size=8920 time=1685991378.700385000 cksum=1629328991 \
sha512=289a088cbbcbeb436dd9c1f74521a89b66643976abda696b99b9cc1fbfe8b76107c5b54d4a6a9b65332386ada73fc1bbb10e43c4e3065fa2161e7be269eaf86a
chio size=20720 time=1685991378.706095000 cksum=1948751604 \
sha512=46f58277ff16c3495ea51e74129c73617f31351e250315c2b878a88708c2b8a7bb060e2dc8ff92f606450dbc7dd2816da4853e465ec61ee411723e8bf52709ee
chmod size=9616 time=1685991378.712546000 cksum=4244658911 \
sha512=1769313ce08cba84ecdc2b9c07ef86d2b70a4206420dd71343867be7ab59659956f6f5a458c64e2531a1c736277a8e419c633a31a8d3c7ccc43e99dd4d71d630
⑤ /set
特殊命令,定义从已分析的文件中获取的一些设置。
⑥ 指代解析的目录,显示它的类型、权限模式、硬链接数量和自最后修改以来的 UNIX 格式时间戳。
⑦ 指代文件并展示其大小、时间及一系列哈希值,用于验证其完整性。
16.4.3. 验证规格文件
为了验证二进制签名是否发生变化,可以将当前目录的内容与先前生成的规格进行比较,并将结果保存到文件中。
此命令需要使用生成原始规格时所使用的种子值:
# mtree -s 123456789 -p /bin < /home/user/.bin_chksum_mtree >> /home/user/.bin_chksum_output
如果没有对该目录中的二进制文件进行更改,则 /home/user/.bin_chksum_output 输出文件将为空。
为了模拟更改,可以使用 touch(1) 命令更改 /bin/cat 文件的日期,并再次运行验证命令:
再次运行验证命令:
# mtree -s 123456789 -p /bin < /home/user/.bin_chksum_mtree >> /home/user/.bin_chksum_output
然后检查输出文件的内容:
# cat /root/.bin_chksum_output
输出应类似于以下内容:
cat: modification time (Fri Aug 25 13:30:17 2023, Fri Aug 25 13:34:20 2023)
警告
这是执行命令时显示的一个示例,展示了元数据发生变化时的内容。