> 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.4.-shi-yong-shen-ji-gen-zong.md).

# 20.4.使用审计跟踪

由于审计跟踪以 BSM 二进制格式存储，因此提供了几种内置工具来修改这些跟踪，或将其转换为文本格式。要将审计跟踪文件转换为简单的文本格式，可使用 `praudit`。若要精简审计跟踪文件以便分析、归档或打印，可使用 `auditreduce`。该工具支持多种选择参数，包括事件类型、事件类别、用户、事件日期或时间，以及操作的文件路径或对象。

例如，要以纯文本格式输出指定审计日志的所有内容：

```sh
# praudit /var/audit/AUDITFILE
```

其中 **AUDITFILE** 是要输出的审计日志文件。

审计跟踪由一系列审计记录组成，每条记录由多个令牌（tokens）组成，`praudit` 会按顺序逐行打印这些令牌。每个令牌具有特定的类型，如 `header`（审计记录头部）或 `path`（从名称查找的文件路径）。以下是 `execve` 事件的示例：

```sh
header,133,10,execve(2),0,Mon Sep 25 15:58:03 2006, + 384 msec
exec arg,finger,doug
path,/usr/bin/finger
attribute,555,root,wheel,90,24918,104944
subject,robert,root,wheel,root,wheel,38439,38032,42086,128.232.9.100
return,success,0
trailer,133
```

该审计记录表示一次成功的 `execve` 调用，其中命令 `finger doug` 被执行。`exec arg` 令牌包含由 shell 提供给内核的处理后的命令行；`path` 令牌保存由内核查找到的可执行文件路径；`attribute` 令牌说明了二进制文件并包含文件模式；`subject` 令牌存储了审计用户 ID、有效用户 ID 和组 ID、真实用户 ID 和组 ID、进程 ID、会话 ID、端口 ID 和登录地址。注意，审计用户 ID 和真实用户 ID 不同，因为用户 `robert` 在执行命令之前切换到 `root` 账户，但仍使用原始认证用户进行审计。`return` 令牌表示成功执行，而 `trailer` 令牌结束该记录。

还支持 XML 输出格式，可通过包含 `-x` 选项来选择。

由于审计日志文件可能非常大，可使用 `auditreduce` 来选择一部分记录。以下示例选择存储在 **AUDITFILE** 中的所有为用户 `trhodes` 生成的审计记录：

```sh
# auditreduce -u trhodes /var/audit/AUDITFILE | praudit
```

`audit` 组的成员有权限读取 **/var/audit** 中的审计跟踪。默认情况下，`audit` 组为空，因此只有 `root` 用户能读取审计跟踪。用户可被添加到 `audit` 组，以便委派审计复核权限。由于跟踪审计日志内容能显著揭示用户和进程行为，因此建议谨慎地委派审计复核权限。

## 20.4.1. 使用审计管道实时监控

审计管道是克隆伪设备，让应用程序能连接到实时审计记录流。这对入侵检测和系统监控应用程序的开发者尤为重要。然而，审计管道设备为管理员提供了方便的实时监控方式，避免了审计跟踪文件所有权或日志轮替中断事件流的问题。要跟踪实时的审计事件流，可使用：

```sh
# praudit /dev/auditpipe
```

默认情况下，审计管道设备节点仅对 `root` 用户可访问。要使其对 `audit` 组的成员可访问，可在 **/etc/devfs.rules** 中添加以下 `devfs` 规则：

```sh
add path 'auditpipe*' mode 0440 group audit
```

有关配置 `devfs` 文件系统的更多信息，请参见 [devfs.rules(5)](https://man.freebsd.org/cgi/man.cgi?query=devfs.rules\&sektion=5\&format=html)。

> **警告**
>
> 很容易产生审计事件反馈循环，即查看每个审计事件都会导致生成更多审计事件。例如，如果审计了所有的网络 I/O，且在 SSH 会话中运行 `praudit`，将会以高速率生成持续不断的审计事件流，因为每个输出的事件都会生成一个新的事件。出于这个原因，建议在没有细粒度 I/O 审计的会话中，在审计管道设备上运行 `praudit`。

## 20.4.2. 审计跟踪文件的轮替和压缩

审计跟踪由内核写入，并由审计守护进程 [auditd(8)](https://man.freebsd.org/cgi/man.cgi?query=auditd\&sektion=8\&format=html) 管理。管理员不应尝试使用 [newsyslog.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=newsyslog.conf\&sektion=5\&format=html) 或其他工具直接轮替审计日志。相反，应使用 `audit` 来关闭审计、重新配置审计系统并执行日志轮替。以下命令会导致审计守护进程创建新的审计日志，并向内核发送信号以开始使用新的日志。旧日志将被终止并重命名，此时管理员可对其进行操作：

```sh
# audit -n
```

如果 [auditd(8)](https://man.freebsd.org/cgi/man.cgi?query=auditd\&sektion=8\&format=html) 当前没有运行，执行此命令将失败，并会产生错误消息。

将以下行添加到 **/etc/crontab** 文件中，将使日志轮替每十二小时执行一次：

```sh
0     */12       *       *       *       root    /usr/sbin/audit -n
```

保存 **/etc/crontab** 后，改动将生效。

可使用 `audit_control` 中的 `filesz` 项来基于文件大小自动轮替审计跟踪文件，具体说明请参见 [audit\_control 文件](/di-20-zhang-an-quan-shi-jian-shen-ji/20.3.-shen-ji-pei-zhi.md)。

由于审计跟踪文件可能非常大，因此通常希望在审计守护进程关闭跟踪文件后将其压缩或归档。可使用 `audit_warn` 脚本来执行多种审计相关事件的定制操作，包括在日志轮替时正常终止审计跟踪。例如，以下内容可添加到 **/etc/security/audit\_warn** 中，以便在关闭时压缩审计跟踪文件：

```sh
#
# 关闭时压缩审计跟踪文件。
#
if [ "$1" = closefile ]; then
        gzip -9 $2
fi
```

其他归档活动可能包括将跟踪文件复制到集中式服务器、删除旧跟踪文件或精简审计跟踪以删除不需要的记录。此脚本仅在审计跟踪文件正常终止时运行，若跟踪文件在不正常关闭后仍未终止，则不会执行此脚本。
