# 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)
```

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.bsdcn.org/hanbook/di-16-zhang-an-quan/16.4.-ru-qin-jian-ce-xi-tong-ids.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
