第19章 安全事件审计

19.1. 概述

FreeBSD 操作系统包含对安全事件审计的支持。事件审计支持对各种安全相关系统事件进行可靠、细粒度和可配置的日志记录,包括登录、配置更改以及文件和网络访问。这些日志记录对于实时系统监控、入侵检测和事后分析都非常宝贵。FreeBSD 实现了 Sun™ 发布的基本安全模块 (BSM) 应用程序编程接口 (API) 和文件格式,并且与 Solaris™ 和 Mac OS® X 审计实现具有互操作性。

本章重点介绍事件审计的安装和配置。它解释了审计策略并提供了一个示例审计配置。

阅读完本章后,您将了解

  • 什么是事件审计以及它是如何工作的。

  • 如何在 FreeBSD 上为用户和进程配置事件审计。

  • 如何使用审计缩减和审查工具来审查审计跟踪。

在阅读本章之前,您应该

审计功能有一些已知的限制。并非所有安全相关的系统事件都可审计,并且某些登录机制(例如基于 Xorg 的显示管理器和第三方守护进程)无法正确配置用户登录会话的审计。

安全事件审计功能能够生成非常详细的系统活动日志。在繁忙的系统上,当配置为高详细程度时,跟踪文件数据可能非常大,在某些配置中每周超过千兆字节。管理员应考虑与高容量审计配置相关的磁盘空间需求。例如,可能需要将文件系统专门用于 /var/audit,以便如果审计文件系统已满,其他文件系统不会受到影响。

19.2. 关键术语

以下术语与安全事件审计相关

  • 事件:可审计事件是可以使用审计子系统记录的任何事件。安全相关事件的示例包括创建文件、建立网络连接或用户登录。事件要么是“可归因的”,这意味着它们可以追溯到经过身份验证的用户,要么是“不可归因的”。不可归因事件的示例是在登录过程中身份验证之前发生的任何事件,例如密码错误尝试。

  • :一组相关的命名事件,用于选择表达式中。常用的事件类包括“文件创建”(fc)、“执行”(ex)和“登录/注销”(lo)。

  • 记录:描述安全事件的审计日志条目。记录包含记录事件类型、执行操作的主体(用户)信息、日期和时间信息、任何对象或参数的信息以及成功或失败条件。

  • 跟踪:由一系列描述安全事件的审计记录组成的日志文件。跟踪大致按事件完成时间的顺序排列。只有授权进程才能将记录提交到审计跟踪。

  • 选择表达式:包含用于匹配事件的前缀和审计事件类名称列表的字符串。

  • 预选:系统识别哪些事件对管理员感兴趣的过程。预选配置使用一系列选择表达式来识别要为哪些用户审计哪些事件类,以及适用于经过身份验证和未经身份验证进程的全局设置。

  • 缩减:从现有审计跟踪中选择要保留、打印或分析的记录的过程。同样,从审计跟踪中删除不需要的审计记录的过程。使用缩减,管理员可以实施审计数据保留策略。例如,可以将详细的审计跟踪保留一个月,但在此之后,可以缩减跟踪以仅保留登录信息以用于存档目的。

19.3. 审计配置

事件审计的用户空间支持作为 FreeBSD 操作系统基本部分的一部分安装。内核支持默认情况下在 GENERIC 内核中可用,并且可以通过将以下行添加到 /etc/rc.conf 中来启用 auditd(8)

auditd_enable="YES"

然后,启动审计守护进程

# service auditd start

希望编译自定义内核的用户必须在其自定义内核配置文件中包含以下行

options	AUDIT

19.3.1. 事件选择表达式

选择表达式用于审计配置中的许多位置,以确定应审计哪些事件。表达式包含要匹配的事件类列表。选择表达式从左到右进行评估,两个表达式通过将一个附加到另一个来组合。

默认审计事件类 总结了默认审计事件类

表 1. 默认审计事件类
类名称描述操作

all

all

匹配所有事件类。

aa

身份验证和授权

ad

管理

对整个系统执行的管理操作。

ap

应用程序

应用程序定义的操作。

cl

文件关闭

审计对 close 系统调用的调用。

ex

执行

审计程序执行。命令行参数和环境变量的审计通过 audit_control(5) 使用 argvenvv 参数对 policy 设置进行控制。

fa

文件属性访问

审计对对象属性的访问,例如 stat(1)pathconf(2)

fc

文件创建

审计导致文件创建的事件。

fd

文件删除

审计发生文件删除的事件。

fm

文件属性修改

审计发生文件属性修改的事件,例如通过 chown(8)chflags(1)flock(2)

fr

文件读取

审计读取数据或打开文件以进行读取的事件。

fw

文件写入

审计写入数据或写入或修改文件的事件。

io

ioctl

审计 ioctl 系统调用的使用。

ip

ipc

审计各种形式的进程间通信,包括 POSIX 管道和 System V IPC 操作。

lo

login_logout

审计 login(1)logout(1) 事件。

na

不可归因

审计不可归因事件。

no

无效类

不匹配任何审计事件。

nt

网络

审计与网络操作相关的事件,例如 connect(2)accept(2)

ot

其他

审计其他事件。

pc

进程

审计进程操作,例如 exec(3)exit(3)

可以通过修改 audit_classaudit_event 配置文件来自定义这些审计事件类。

每个审计事件类都可以与一个前缀组合,指示是否匹配成功/失败的操作,以及条目是添加还是删除对类和类型的匹配。审计事件类的前缀 总结了可用的前缀

表 2. 审计事件类的前缀
前缀操作

+

审计此类中的成功事件。

-

审计此类中的失败事件。

^

审计此类中既不是成功也不是失败的事件。

^+

不要审计此类中的成功事件。

^-

不要审计此类中的失败事件。

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

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

lo,+ex

19.3.2. 配置文件

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

  • audit_class:包含审计类的定义。

  • audit_control:控制审计子系统的各个方面,例如默认审计类、在审计日志卷上保留的最小磁盘空间以及最大审计跟踪大小。

  • audit_event:系统审计事件的文本名称和描述以及每个事件所属的类列表。

  • audit_user:特定于用户的审计要求,将在登录时与全局默认值结合。

  • audit_warnauditd(8) 使用的可自定义 shell 脚本,用于在异常情况下生成警告消息,例如当审计记录的空间不足或审计跟踪文件已轮换时。

应仔细编辑和维护审计配置文件,因为配置错误可能导致事件记录不当。

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

19.3.2.1. audit_control 文件

audit_control 中指定了审计子系统的一些默认值

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

dir 条目用于设置一个或多个存储审计日志的目录。如果出现多个目录条目,则将按顺序使用它们直到填满。通常将审计配置为将审计日志存储在专用的文件系统上,以防止如果文件系统填满,审计子系统与其他子系统之间发生干扰。

如果 dist 字段设置为 onyes,则将在 /var/audit/dist 中为所有跟踪文件创建硬链接。

flags 字段设置可归因事件的系统范围的默认预选掩码。在上面的示例中,为所有用户审计成功和失败的登录/注销事件以及身份验证和授权。

minfree 条目定义存储审计跟踪的文件系统的最小可用空间百分比。

naflags 条目指定要为非归因事件审计的审计类,例如登录/注销过程以及身份验证和授权。

policy 条目指定一个逗号分隔的策略标志列表,用于控制审计行为的各个方面。cnt 指示系统应在审计失败时继续运行(强烈建议使用此标志)。另一个标志 argv 使得命令行参数对 execve(2) 系统调用的审计作为命令执行的一部分。

filesz 条目指定了审计跟踪的最大大小,超过此大小后会自动终止并轮换跟踪文件。值为 0 表示禁用自动日志轮换。如果请求的文件大小低于 512k 的最小值,则会被忽略并生成一条日志消息。

expire-after 字段指定审计日志文件何时过期并被删除。

19.3.2.2. audit_user 文件

管理员可以在 audit_user 中为特定用户指定更多审计要求。每一行都通过两个字段配置用户的审计:alwaysaudit 字段指定一组应始终为用户审计的事件,而 neveraudit 字段指定一组不应为用户审计的事件。

以下示例条目会审计 root 用户的登录/注销事件和成功的命令执行,以及 www 用户的文件创建和成功的命令执行。如果与默认的 audit_control 一起使用,则 root 用户的 lo 条目是冗余的,并且 www 用户的登录/注销事件也将被审计。

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

19.4. 使用审计跟踪

由于审计跟踪存储在 BSM 二进制格式中,因此可以使用几个内置工具来修改或将这些跟踪转换为文本。要将跟踪文件转换为简单的文本格式,请使用 praudit。要减少审计跟踪文件以进行分析、归档或打印,请使用 auditreduce。此实用程序支持各种选择参数,包括事件类型、事件类别、用户、事件的日期或时间以及所操作的文件路径或对象。

例如,要以纯文本格式转储指定审计日志的全部内容

# praudit /var/audit/AUDITFILE

其中 AUDITFILE 是要转储的审计日志。

审计跟踪由一系列审计记录组成,这些记录由标记组成,praudit 会按顺序打印每个标记,每行一个。每个标记都具有特定的类型,例如 header(审计记录标题)或 path(名称查找中的文件路径)。以下是一个 execve 事件的示例

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 dougexec arg 标记包含 shell 提供给内核的已处理命令行。path 标记保存内核查找的可执行文件的路径。attribute 标记描述二进制文件并包含文件模式。subject 标记存储审计用户 ID、有效用户 ID 和组 ID、真实用户 ID 和组 ID、进程 ID、会话 ID、端口 ID 和登录地址。请注意,审计用户 ID 和真实用户 ID 不同,因为用户 robert 在运行此命令之前切换到 root 帐户,但它是使用原始认证用户进行审计的。return 标记指示执行成功,trailer 结束记录。

还支持 XML 输出格式,可以通过包含 -x 来选择。

由于审计日志可能非常大,因此可以使用 auditreduce 选择记录的子集。此示例选择存储在 AUDITFILE 中为用户 trhodes 生成的所有审计记录

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

audit 组的成员有权读取 /var/audit 中的审计跟踪。默认情况下,此组为空,因此只有 root 用户可以读取审计跟踪。可以将用户添加到 audit 组以委派审计审查权限。由于跟踪审计日志内容的能力可以深入了解用户和进程的行为,因此建议谨慎地委派审计审查权限。

19.4.1. 使用审计管道进行实时监控

审计管道是克隆的伪设备,允许应用程序访问实时审计记录流。这主要对入侵检测和系统监控应用程序的作者感兴趣。但是,审计管道设备是管理员允许实时监控的便捷方式,而无需遇到审计跟踪文件所有权问题或日志轮换中断事件流的问题。要跟踪实时审计事件流

# praudit /dev/auditpipe

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

add path 'auditpipe*' mode 0440 group audit

有关配置 devfs 文件系统的更多信息,请参阅 devfs.rules(5)

很容易产生审计事件反馈循环,其中查看每个审计事件都会导致生成更多审计事件。例如,如果审计所有网络 I/O,并且从 SSH 会话运行 praudit,则会以高频率生成连续的审计事件流,因为打印的每个事件都会生成另一个事件。因此,建议从没有细粒度 I/O 审计的会话中在审计管道设备上运行 praudit

19.4.2. 轮换和压缩审计跟踪文件

审计跟踪由内核写入并由审计守护进程 auditd(8) 管理。管理员不应尝试使用 newsyslog.conf(5) 或其他工具直接轮换审计日志。相反,应使用 audit 关闭审计、重新配置审计系统并执行日志轮换。以下命令导致审计守护进程创建一个新的审计日志并向内核发出信号以切换到使用新日志。旧日志将被终止并重命名,此时管理员可以对其进行操作

# audit -n

如果 auditd(8) 当前未运行,则此命令将失败并生成错误消息。

将以下行添加到 /etc/crontab 将安排每隔十二小时进行一次轮换

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

保存 /etc/crontab 后,更改将生效。

可以使用 audit_control 中的 filesz 根据文件大小自动轮换审计跟踪文件,如 audit_control 文件 中所述。

由于审计跟踪文件可能会变得非常大,因此在审计守护进程关闭跟踪文件后,通常需要压缩或以其他方式存档跟踪文件。audit_warn 脚本可用于对各种与审计相关的事件执行自定义操作,包括在轮换审计跟踪时干净地终止审计跟踪。例如,可以将以下内容添加到 /etc/security/audit_warn 以在关闭时压缩审计跟踪

#
# Compress audit trail files on close.
#
if [ "$1" = closefile ]; then
        gzip -9 $2
fi

其他归档活动可能包括将跟踪文件复制到集中式服务器、删除旧跟踪文件或减少审计跟踪以删除不需要的记录。此脚本仅在审计跟踪文件被干净地终止时才会运行。它不会在不正确关闭后留下的跟踪上运行。


上次修改时间:2024 年 9 月 23 日,作者:Fernando Apesteguía