> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-20-zhang-an-quan-shi-jian-shen-ji/20.3.-shen-ji-pei-zhi.md).

# 20.3.审计配置

用户空间的事件审计支持作为 FreeBSD 基本系统的一部分安装。内核支持默认包含在 `GENERIC` 内核中，可通过将以下行添加到 **/etc/rc.conf** 来启用 [auditd(8)](https://man.freebsd.org/cgi/man.cgi?query=auditd\&sektion=8\&format=html)：

```sh
auditd_enable="YES"
```

然后，启动审计守护进程：

```sh
# service auditd start
```

希望编译定制内核的用户，必须在定制内核配置文件中加入以下行：

```sh
options	AUDIT
```

## 20.3.1. 事件选择表达式

选择表达式用于审计配置中的多个地方，以确定应审计哪些事件。表达式包含用于匹配的事件类别列表。选择表达式从左到右求值，两个表达式通过将一个附加到另一个来组合。

[默认审计事件类别](/di-20-zhang-an-quan-shi-jian-shen-ji/20.3.-shen-ji-pei-zhi.md)总结了默认的审计事件类别：

**表 1. 默认审计事件类别**

| 类别名称 | 说明      | 动作                                                                                                                                                                                                                                                                                    |
| ---- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| all  | 所有      | 匹配所有事件类别。                                                                                                                                                                                                                                                                             |
| aa   | 身份验证和授权 |                                                                                                                                                                                                                                                                                       |
| ad   | 管理性     | 对整个系统执行管理性操作。                                                                                                                                                                                                                                                                         |
| ap   | 应用程序    | 应用程序定义的操作。                                                                                                                                                                                                                                                                            |
| cl   | 文件关闭    | 审计调用 `close` 系统调用的事件。                                                                                                                                                                                                                                                                 |
| ex   | 执行      | 审计程序执行。通过 [audit\_control(5)](https://man.freebsd.org/cgi/man.cgi?query=audit_control\&sektion=5\&format=html) 中 `policy` 设置的 `argv` 和 `envv` 参数控制命令行参数和环境变量的审计。                                                                                                                      |
| fa   | 文件属性访问  | 审计访问对象属性的事件，如 [stat(1)](https://man.freebsd.org/cgi/man.cgi?query=stat\&sektion=1\&format=html) 和 [pathconf(2)](https://man.freebsd.org/cgi/man.cgi?query=pathconf\&sektion=2\&format=html)。                                                                                          |
| fc   | 文件创建    | 审计文件创建的事件。                                                                                                                                                                                                                                                                            |
| fd   | 文件删除    | 审计文件删除的事件。                                                                                                                                                                                                                                                                            |
| fm   | 文件属性修改  | 审计文件属性修改的事件，如 [chown(8)](https://man.freebsd.org/cgi/man.cgi?query=chown\&sektion=8\&format=html)、[chflags(1)](https://man.freebsd.org/cgi/man.cgi?query=chflags\&sektion=1\&format=html) 和 [flock(2)](https://man.freebsd.org/cgi/man.cgi?query=flock\&sektion=2\&format=html) 等的修改。 |
| fr   | 文件读取    | 审计数据读取或文件以读取方式打开的事件。                                                                                                                                                                                                                                                                  |
| fw   | 文件写入    | 审计数据写入或文件写入或修改的事件。                                                                                                                                                                                                                                                                    |
| io   | ioctl   | 审计 `ioctl` 系统调用的使用。                                                                                                                                                                                                                                                                   |
| ip   | ipc     | 审计不同形式的进程间通信，包括 POSIX 管道和 System V IPC 操作。                                                                                                                                                                                                                                            |
| lo   | 登录/注销   | 审计 [login(1)](https://man.freebsd.org/cgi/man.cgi?query=login\&sektion=1\&format=html) 和 [logout(1)](https://man.freebsd.org/cgi/man.cgi?query=logout\&sektion=1\&format=html) 事件。                                                                                                    |
| na   | 不可归属    | 审计不可归属事件。                                                                                                                                                                                                                                                                             |
| no   | 无效类别    | 匹配无审计事件。                                                                                                                                                                                                                                                                              |
| nt   | 网络      | 审计与网络操作相关的事件，如 [connect(2)](https://man.freebsd.org/cgi/man.cgi?query=connect\&sektion=2\&format=html) 和 [accept(2)](https://man.freebsd.org/cgi/man.cgi?query=accept\&sektion=2\&format=html)。                                                                                       |
| ot   | 其他      | 审计杂项事件。                                                                                                                                                                                                                                                                               |
| pc   | 进程      | 审计进程操作，如 [exec(3)](https://man.freebsd.org/cgi/man.cgi?query=exec\&sektion=3\&format=html) 和 [exit(3)](https://man.freebsd.org/cgi/man.cgi?query=exit\&sektion=3\&format=html) 事件。                                                                                                    |

这些审计事件类别可通过修改 `audit_class` 和 `audit_event` 配置文件自定义。

每个审计事件类别都可与前缀结合，表示是否匹配成功/失败的操作，以及该条目是否添加或移除类别和类型的匹配。[审计事件类别的前缀](/di-20-zhang-an-quan-shi-jian-shen-ji/20.3.-shen-ji-pei-zhi.md)总结了可用的前缀：

**表 2. 审计事件类别的前缀**

| 前缀 | 动作                 |
| -- | ------------------ |
| +  | 审计该类别中的成功事件。       |
| -  | 审计该类别中的失败事件。       |
| ^  | 不审计该类别中的任何成功或失败事件。 |
| ^+ | 不审计该类别中的成功事件。      |
| ^- | 不审计该类别中的失败事件。      |

如果没有前缀，则会审计事件的成功和失败实例。

以下示例选择字符串选择了成功和失败的登录/注销事件，但只选择成功的执行事件：

```sh
lo,+ex
```

## 20.3.2. 配置文件

安全事件审计的以下配置文件位于 **/etc/security** 中：

* `audit_class`：包含审计类别的定义。
* `audit_control`：控制审计子系统的各个方面，如默认审计类别、在审计日志卷上保留的最小磁盘空间以及最大审计跟踪大小。
* `audit_event`：系统审计事件的文本名称和说明，以及每个事件所属的类别。
* `audit_user`：用户特定的审计要求，在登录时与全局默认设置组合。
* `audit_warn`：由 [auditd(8)](https://man.freebsd.org/cgi/man.cgi?query=auditd\&sektion=8\&format=html) 使用的可定制的 shell 脚本，用于在异常情况下生成警告消息，如当审计记录的空间不足或审计跟踪文件被轮替时。

> **警告**
>
> 审计配置文件应小心编辑和维护，因为配置错误可能导致事件记录不正确。

在大多数情况下，管理员只需要修改 `audit_control` 和 `audit_user`。第一个文件控制系统范围的审计属性和策略，第二个文件可用于按用户精细调整审计。

### 20.3.2.1. `audit_control` 文件

`audit_control` 文件中指定了许多审计子系统的默认设置：

```sh
dir:/var/audit
dist:off
flags:lo,aa
minfree:5
naflags:lo,aa
policy:cnt,argv
filesz:2M
expire-after:10M
```

* `dir` 项用于设置一个或多个存储审计日志的目录。如果出现多个目录条目，它们将按顺序使用，直到填满为止。通常的做法是将审计日志存储在专用文件系统上，以防止当文件系统填满时审计子系统和其他子系统之间的干扰。
* 如果 `dist` 字段设置为 `on` 或 `yes`，则会在 **/var/audit/dist** 中为所有审计跟踪文件创建硬链接。
* `flags` 字段设置系统范围的默认预选择掩码，用于可归属事件。在上面的示例中，所有用户的成功和失败的登录/注销事件以及身份验证和授权事件都会被审计。
* `minfree` 项定义了存储审计跟踪的文件系统的最小可用空间百分比。
* `naflags` 项指定了对于不可归属事件的审计类别，例如登录/注销过程以及身份验证和授权。
* `policy` 项指定由逗号分隔的策略标志列表，用于控制审计行为的各个方面。`cnt` 表示即使发生审计失败，系统也应继续运行（强烈建议启用此标志）。另一个标志 `argv` 会将命令行参数（即 [execve(2)](https://man.freebsd.org/cgi/man.cgi?query=execve\&sektion=2\&format=html) 系统调用的参数）作为命令执行的一部分审计。
* `filesz` 项指定审计跟踪文件的最大大小，超出该大小后自动终止并轮替跟踪文件。值为 `0` 时会禁用自动日志轮替。如果请求的文件大小小于 512k，则会被忽略，并生成一条日志消息。
* `expire-after` 字段指定审计日志文件何时过期并被删除。

### 20.3.2.2. `audit_user` 文件

管理员可在 `audit_user` 文件中为特定用户指定进一步的审计要求。每一行通过两个字段配置用户的审计：`alwaysaudit` 字段指定应始终审计的事件，`neveraudit` 字段指定应始终不审计的事件。

以下示例条目会为 `root` 审计登录/注销事件和成功的命令执行，为 `www` 审计文件创建和成功的命令执行。如果与默认的 `audit_control` 配置一起使用，则 `root` 的 `lo` 条目是多余的，登录/注销事件也会为 `www` 审计。

```sh
root:lo,+ex:no
www:fc,+ex:no
```
