第十九章 安全事件审计19.1. 简介19.2. 关键术语19.3. 审核配置19.3.1. 事件选择表达式19.3.2. 配置文件19.3.2.1. audit_control 文件19.3.2.2. audit_user 文件19.2. 使用审计跟踪19.4.1. 使用审计管道进行实时监控19.4.2. 旋转和压缩审计跟踪文件
FreeBSD操作系统包括对安全事件审计的支持。事件审计支持对各种与安全相关的系统事件进行可靠、细粒度和可配置的日志记录,包括登录、配置更改以及文件和网络访问。这些日志记录对于实时系统监控、入侵检测和事后分析非常有价值。FreeBSD实现Sun™已发布的基本安全模块(Basic Security Module,BSM)应用程序编程接口(Application Programming Interface,API)和文件格式,并可与Solaris™和Mac OS®X审计实现互操作。
本章重点介绍事件审计的安装和配置。它解释了审计策略,并提供了一个审计配置示例。
阅读本章后,你会知道:
• 什么是事件审计以及它是如何工作的。 • 如何在FreeBSD上为用户和进程配置事件审计。 • 如何使用审计缩减和审查工具审查审计跟踪。
在阅读本章之前,您应该:
• 了解UNIX®和FreeBSD基础知识(【3. FreeBSD基础知识】)。 • 熟悉内核配置/编译的基础知识(【10. 配置FreeBSD内核】)。 • 熟悉安全性以及它与FreeBSD(【16. 安全】)的关系。
xxxxxxxxxx审计工具有一些已知的局限性。并非所有与安全相关的系统事件都是可审计的,一些登录机制,如基于Xorg的显示管理器和第三方守护进程,没有正确配置用户登录会话的审计。安全事件审计工具能够生成非常详细的系统活动日志。在繁忙的系统中,当配置为高细节时,跟踪文件数据可能会非常大,在某些配置中每周超过千兆字节。管理员应考虑与高容量审核配置相关的磁盘空间要求。例如,可能希望将一个文件系统专用于/var/audit,这样如果审计文件系统已满,其他文件系统就不会受到影响。以下术语与安全事件审计有关:
event(事件)
可审计事件是指可以使用审计子系统记录的任何事件。安全相关事件的示例包括创建文件、建立网络连接或用户登录。事件要么是 attributable(可归因的),这意味着它们可以追溯到经过身份验证的用户;要么是 non-attributable(不可归因的)。非归因事件的示例是在登录过程中进行身份验证之前发生的任何事件,例如错误的密码尝试。
class(类)
在选择表达式中使用的一组命名的相关事件。常用的事件类别包括 file creation (fc,文件创建)、exec(ex)和 login_logout(lo)。
record(记录)
描述安全事件的审计日志条目。记录包含记录事件类型、执行操作的主体(用户)的信息、日期和时间信息、任何对象或参数的信息以及成功或失败条件。
trail(踪迹)
由一系列描述安全事件的审计记录组成的日志文件。根据事件完成的时间,轨迹大致按时间顺序排列。只有授权的流程才允许将记录提交到审计跟踪中。
selection expression(选择表达式)
一个字符串,包含用于匹配事件的前缀和审计事件类名列表。
preselection(预选)
系统识别管理员感兴趣的事件的过程。预选配置使用一系列选择表达式来标识要审核哪些用户的哪些类事件,以及应用于已验证和未验证流程的全局设置。
reduction(减少)
从现有审计跟踪中选择记录进行保存、打印或分析的过程。同样,从审计跟踪中删除不需要的审计记录的过程。使用reduction,管理员可以实施保存审计数据的策略。例如,详细的审计跟踪可能会保留一个月,但在此之后,跟踪可能会减少,以便仅保留登录信息用于存档目的。
事件审计的用户空间支持作为基本FreeBSD操作系统的一部分安装。默认情况下,GENERIC内核中提供内核支持,可以通过在 /etc/rc.conf 中添加以下行来启用 audit(8) :
xxxxxxxxxxauditd_enable="YES"然后启动audit守护进程:
xxxxxxxxxx# service auditd start喜欢编译自定义内核的用户必须在其自定义内核配置文件中包含以下行:
xxxxxxxxxxoptions AUDIT选择表达式用于审核配置中的多个位置,以确定应审核哪些事件。表达式包含要匹配的事件类列表。从左到右计算选择表达式,并通过将一个表达式附加到另一个表达式上来组合两个表达式。
下表默认审核事件类总结了默认审核事件类别:
表32. 默认审核事件类
| 类名 | 描述 | 行动 |
|---|---|---|
| all | all | 匹配所有活动类别。 |
| aa | 认证与授权 authentication authorization | |
| ad | 管理的 | 对整个系统执行的管理操作。 |
| ap | 应用 | 应用程序定义的操作。 |
| cl | 文件关闭 | 审计调用 close 系统调用。 |
| ex | 运行 | 审计程序执行。 命令行参数和环境变量的审核是通过 audit_control(5) 使用 policy 设置的 argv 和 envv 参数来控制的。 |
| fa | 文件属性访问 | 审核 stat(1) 和 pathconf(2) 等对象属性的访问。 |
| fc | 文件创建 | 作为结果创建文件的审核事件。 |
| fd | 文件删除 | 发生文件删除的审核事件。 |
| fm | 文件属性修改 | 发生文件属性修改的审核事件,如 chown(8) 、 chflags(1) 和 flock(2) 。 |
| fr | 文件读取 | 读取数据或打开文件进行读取的审核事件。 |
| fw | 文件写 | 写入数据或写入或修改文件的审核事件。 |
| io | ioctl | 审核 ioctl 系统调用的使用情况。 |
| ip | ipc | 审核各种形式的进程间通信(Inter-Process Communication),包括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_class和audit_event配置文件来定制这些审计事件类。
每个审计事件类都可以与一个前缀组合,该前缀指示成功/失败的操作是否匹配,以及该条目是添加还是删除类和类型的匹配。下表“审核事件类的前缀”总结了可用的前缀:
表33. 审核事件类的前缀
| 前缀 | 动作 |
|---|---|
| + | 审核此类中的成功事件。 |
| - | 审核此类中的失败事件。 |
| ^ | 审核此类中既不成功也不失败的事件。 |
| ^+ | 不要审核此类中的成功事件。 |
| ^- | 不要审核此类中的失败事件。 |
如果没有前缀,则将审核事件的成功和失败实例。
以下示例选择字符串选择成功和失败的登录/注销事件,但仅选择成功执行事件:
xxxxxxxxxxlo,+ex在 /etc/security 中可以找到以下用于安全事件审核的配置文件:
•audit_class:包含审计类的定义。 •audit_control:控制审计子系统的各个方面,如默认审计类、审计日志卷上留下的最小磁盘空间和最大审计跟踪大小。 •audit_event:系统审计事件的文本名称和描述,以及每个事件所属类的列表。 •audit_user:用户特定的审计要求,与登录时的全局默认值相结合。 •audit_warn:audit(8)使用的一个可定制的shell脚本,用于在特殊情况下生成警告消息,例如当审计记录的空间不足或审计跟踪文件已轮换时。
xxxxxxxxxx应仔细编辑和维护审计配置文件,因为配置中的错误可能会导致事件记录不当。在大多数情况下,管理员只需要修改audit_control和audit_user。第一个文件控制系统范围的审计属性和策略,第二个文件可用于微调用户的审计。
audit_control中指定了审核子系统的许多默认值:
xxxxxxxxxxdir:/var/auditdist:offflags:lo,aaminfree:5naflags:lo,aapolicy:cnt,argvfilesz:2Mexpire-after:10Mdir 条目用于设置一个或多个存储审计日志的目录。如果出现多个目录条目,它们将在填充时按顺序使用。通常配置审计,以便将审计日志存储在专用文件系统上,以防止文件系统填满时审计子系统和其他子系统之间的干扰。
如果 dist 字段设置为 on 或 yes ,则将创建指向 /var/audit/dist 中所有跟踪文件的硬链接。
flags 字段为可归因事件设置系统范围内的默认预选掩码。在上面的示例中,对所有用户的成功和失败的登录/注销事件以及身份验证和授权进行审核。
minfree 条目定义了存储审计跟踪的文件系统的最小可用空间百分比。
naflags 条目指定了要针对非属性事件进行审核的审核类,例如登录/注销过程以及身份验证和授权。
policy 条目指定了一个逗号分隔的策略标志列表,用于控制审核行为的各个方面。cnt 表示尽管审计失败,系统仍应继续运行(强烈建议使用此标志)。另一个标志 argv 导致 execve(2) 系统调用的命令行参数在命令执行过程中被审核。
filesz 条目指定了自动终止和旋转跟踪文件之前审计跟踪的最大大小。值为 0 时禁用自动日志轮换。如果请求的文件大小低于512k的最小值,则将被忽略并生成日志消息。
expire-after 字段指定审核日志文件何时过期并被删除。
管理员可以在audit_user中为特定用户指定进一步的审核要求。每一行都通过两个字段为用户配置审计: alwayaudit 字段指定了一组应该始终为用户审计的事件, neveraudit 字段则指定了一系列不应该为用户审计。
以下示例条目审核登录/注销事件以及根和文件创建的成功命令执行以及 www的成功命令运行。如果与默认的audit_control一起使用,则根的 lo 条目是多余的,并且还将审核 www 的登录/注销事件。
xxxxxxxxxxroot:lo,+ex:nowww:fc,+ex:no由于审计跟踪以BSM二进制格式存储,因此有几个内置工具可用于修改这些跟踪或将其转换为文本。要将轨迹文件转换为简单的文本格式,请使用 praudit 。要减少用于分析、归档或打印目的的审计跟踪文件,请使用 auditreduce 。此实用程序支持各种选择参数,包括事件类型、事件类、用户、事件的日期或时间以及所作用的文件路径或对象。
例如,要以纯文本形式转储指定审核日志的全部内容:
xxxxxxxxxx# praudit /var/audit/AUDITFILE其中AUDITFILE是要转储的审核日志。
审计跟踪由一系列由令牌组成的审计记录组成,praudit 按顺序打印,每行一个。每个令牌都是特定类型的,例如 header (审计记录标头)或路径(来自名称查找的文件路径)。以下是一个 execve 事件的示例:
xxxxxxxxxxheader,133,10,execve(2),0,Mon Sep 25 15:58:03 2006, + 384 msecexec arg,finger,dougpath,/usr/bin/fingerattribute,555,root,wheel,90,24918,104944subject,robert,root,wheel,root,wheel,38439,38032,42086,128.232.9.100return,success,0trailer,133此审计表示执行调用成功,其中运行了命令 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 生成的所有审核记录:
xxxxxxxxxx# auditreduce -u trhodes /var/audit/AUDITFILE | prauditaudit 组的成员有权读取/var/audit中的审核跟踪。默认情况下,此组为空,因此只有root用户可以读取审核跟踪。可以将用户添加到 audit 组中,以委派审核审查权限。由于跟踪审计日志内容的能力可以深入了解用户和流程的行为,因此建议谨慎执行审计审查权的委托。
审计管道是克隆伪设备,允许应用程序访问实时审计记录流。这主要是入侵检测和系统监控应用程序的作者感兴趣的。然而,审计管道设备是管理员允许实时监控的一种方便方式,而不会遇到审计跟踪文件所有权或日志轮换中断事件流的问题。要跟踪实时审核事件流,请执行以下操作:
xxxxxxxxxx# praudit /dev/auditpipe默认情况下,审核管道设备节点只能由root用户访问。要使audit 组的成员可以访问它们,请在 /etc/devfs.rules 中添加一个 devfs 规则:
xxxxxxxxxxadd path 'auditpipe*' mode 0440 group audit有关配置devfs文件系统的更多信息,请参阅 devfs.rules(5) 。
xxxxxxxxxx生成审计事件反馈循环很容易,在这种循环中,查看每个审计事件会导致生成更多的审计事件。例如,如果所有网络I/O都经过审核,并且praudit是从SSH会话运行的,则将以高速率生成连续的审核事件流,因为打印的每个事件都会生成另一个事件。因此,建议在没有细粒度I/O审计的情况下,从会话在审计管道设备上运行praudit。审计跟踪由内核写入,并由审计守护进程 auditd(8) 管理。管理员不应尝试使用 newsyslog.conf(5) 或其他工具直接轮换审计日志。相反, audit 应用于关闭审计、重新配置审计系统和执行日志轮换。以下命令使审核守护进程创建一个新的审核日志,并向内核发出信号,要求其切换到使用新日志。旧日志将被终止并重命名,此时管理员可以对其进行操作:
xxxxxxxxxx# audit -n如果 audit(8) 当前未运行,则此命令将失败并生成错误消息。
将以下行添加到 /etc/crontab 将每十二小时安排一次轮换:
xxxxxxxxxx0 */12 * * * root /usr/sbin/audit -n保存 /etc/crontab 后,更改将生效。
使用 audit_control 中的 filesz ,可以根据文件大小自动旋转审计跟踪文件,如【19.3.2.1. audit_conntrol文件】中所述。
由于审计跟踪文件可能会变得非常大,因此通常希望在审计守护进程关闭跟踪后压缩或以其他方式存档跟踪。audit_warn脚本可用于对各种与审计相关的事件执行自定义操作,包括在轮换审计跟踪时彻底终止审计跟踪。例如,可以将以下内容添加到 /etc/security/audit_warn 中,以压缩关闭时的审计跟踪:
xxxxxxxxxxif [ "$1" = closefile ]; then gzip -9 $2fi其他归档活动可能包括将跟踪文件复制到集中式服务器、删除旧跟踪文件或减少审计跟踪以删除不需要的记录。仅当审计跟踪文件完全终止时,才会运行此脚本。它不会在不当关闭后未端接的轨道上运行。