# 16.4.入侵检测系统（IDS）

验证系统文件和二进制文件是非常重要的，因为它能为系统管理员和安全团队提供有关系统更改的信息。用于监控系统变化的软件应用程序称为入侵检测系统（IDS）。

FreeBSD 提供了对基本 IDS 系统的原生支持，称为 [mtree(8)](https://man.freebsd.org/cgi/man.cgi?query=mtree\&sektion=8\&format=html)。虽然夜间的安全邮件会通知管理员系统的变化，但这些信息是本地存储的，存在恶意用户修改这些信息以隐藏其系统更改的风险。因此，建议创建一组单独的二进制签名，并将其存储在只读的、root 拥有的目录中，或者更理想的是，存储在可移动 USB 磁盘或远程服务器上。

还建议在每次更新后运行 `freebsd-update IDS`。

## 16.4.1. 生成规格文件

内置的 [mtree(8)](https://man.freebsd.org/cgi/man.cgi?query=mtree\&sektion=8\&format=html) 工具可以用来生成目录内容的规格。一个种子值或数字常量用于生成规格，并且需要用来检查规格是否发生了变化。这样可以判断文件或二进制文件是否已被修改。由于攻击者无法知道种子值，因此伪造或检查文件的校验和值几乎是不可能的。

> **技巧**
>
> 推荐为包含二进制文件和配置文件的目录创建规格文件，以及任何包含敏感数据的目录。通常为 **/bin**、**/sbin**、**/usr/bin**、**/usr/sbin**、**/usr/local/bin**、**/etc** 和 **/usr/local/etc** 创建规格文件。

以下示例生成一组 `sha512` 哈希值，每个系统二进制文件对应一个哈希，并将这些值保存到用户主目录中的隐藏文件 **/home/user/.bin\_chksum\_mtree**：

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

输出应类似于以下内容：

```sh
mtree: /bin checksum: 3427012225
```

> **警告**
>
> `123456789` 值表示种子，应随机选择。该值应被记住，**但不共享**。必须将种子值和校验和输出隐藏，以防止恶意用户访问。

## 16.4.2. 规格文件结构

Mtree 格式是描述文件系统对象集合的文本格式。这些文件通常用于创建或验证目录层次结构。

一个 mtree 文件由一系列行组成，每行提供一个单一文件系统对象的信息。行首的空白字符总是会被忽略。

上面创建的规格文件将用于解释格式和内容：

```ini
#          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. 验证规格文件

为了验证二进制签名是否发生变化，可以将当前目录的内容与先前生成的规格进行比较，并将结果保存到文件中。

此命令需要使用生成原始规格时所使用的种子值：

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

如果没有对该目录中的二进制文件进行更改，则 **/home/user/.bin\_chksum\_output** 输出文件将为空。

为了模拟更改，可以使用 [touch(1)](https://man.freebsd.org/cgi/man.cgi?query=touch\&sektion=1\&format=html) 命令更改 **/bin/cat** 文件的日期，并再次运行验证命令：

```sh
# touch /bin/cat
```

再次运行验证命令：

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

然后检查输出文件的内容：

```sh
# cat /root/.bin_chksum_output
```

输出应类似于以下内容：

```sh
cat:    modification time (Fri Aug 25 13:30:17 2023, Fri Aug 25 13:34:20 2023)
```

> **警告**
>
> 这是执行命令时显示的一个示例，展示了元数据发生变化时的内容。
