第 19 章 安全事件审计

如果发现翻译错误,请直接 发起PR修改

19.1. 简介

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

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

阅读完本章后,您将了解:

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

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

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

在阅读本章之前,你应该:

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

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

19.2. 关键术语

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

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

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

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

  • trail:一个由一系列描述安全事件的审计记录组成的日志文件。Trail 的顺序大致按照事件完成的时间顺序排列。只有经过授权的进程才允许向审计轨迹提交记录。

  • 选择表达式(selection expression):一个包含前缀和审计事件类名列表的字符串,用于匹配事件。

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

  • reduction:从现有审计跟踪中选择记录以进行保留、打印或分析的过程。同样,也是从审计跟踪中删除不需要的审计记录的过程。通过使用减少,管理员可以实施有关保留审计数据的策略。例如,详细的审计跟踪可能会保留一个月,但之后,为了保留仅用于归档目的的登录信息,可能会进行减少。

19.3. 审计配置

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

auditd_enable="YES"

然后,启动审计守护进程:

# service auditd start

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

options	AUDIT

19.3.1. 事件选择表达式

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

默认的审计事件类别 总结了默认的审计事件类别:

表 1. 默认的审计事件类别
类名 描述 行动

所有

所有

匹配所有事件类。

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(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_warn: 是一个可定制的 Shell 脚本,由 auditd(8) 使用,用于在异常情况下生成警告消息,例如当审计记录的空间不足或审计跟踪文件已经轮转时。

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

在大多数情况下,管理员只需要修改 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 条目用于设置一个或多个目录,用于存储审计日志。如果出现多个 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.rules(5) 以获取有关配置 devfs 文件系统的更多信息。

很容易产生审计事件反馈循环,即每个审计事件的查看都会导致更多的审计事件生成。例如,如果对所有网络 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 文件 中所述,可以使用 fileszaudit_control 中基于文件大小自动旋转审计跟踪文件。

由于审计跟踪文件可能变得非常大,因此通常希望在审计守护程序关闭它们后对跟踪进行压缩或归档。 audit_warn 脚本可用于执行各种与审计相关的事件的自定义操作,包括在轮换审计跟踪时对其进行清理终止。 例如,可以将以下内容添加到 /etc/security/audit_warn 中以在关闭时压缩审计跟踪:

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

其他归档活动可能包括将轨迹文件复制到集中服务器,删除旧的轨迹文件,或者减少审计轨迹以删除不需要的记录。此脚本仅在审计轨迹文件被正确终止时运行。它不会在因不正确的关闭而导致未终止的轨迹上运行。


上次修改时间: September 18, 2024 by fiercex