44 了解 Linux 审计 #
此版本的 SUSE Linux Enterprise Server 随附的 Linux 审计框架提供符合 CAPP(受控访问保护配置文件)规范的审计系统,该系统能够可靠地收集任何安全相关事件的信息。您可以通过检查审计记录来确定是否发生任何安全策略违规以及由谁造成。
提供审计框架是 CC-CAPP/EAL(通用准则受控访问保护配置文件/评估保障级别)认证的一项重要要求。信息技术安全信息通用准则 (CC) 是适用于独立安全评估的国际标准。通用准则可帮助客户评判他们想要部署在任务关键型设置中的任何 IT 产品的安全级别。
通用准则安全评估有两套评估要求:功能要求和保障要求。功能要求描述受评估产品的安全属性,汇总于受控访问保护配置文件 (CAPP) 中。保障要求汇总于评估保障级别 (EAL) 中。EAL 描述要使评估者确信安全属性存在、有效且得到实施所必须执行的任何活动。此类活动的示例包括记录开发人员寻找安全漏洞的活动、执行的修补过程和测试。
通过本指南,您可基本理解审计的工作原理以及设置方法。有关通用准则本身的详细信息,请参见 the Common Criteria Web site。
Linux 审计为您提供了详细分析系统上发生的情况的方法,可帮助您提高系统的安全性。但是,它本身并不提供额外的安全性 — 它不能防范系统的代码出现故障或系统被以任何方式恶意利用。审计只可用于跟踪这些问题,并帮助您采取额外的安全措施(例如 AppArmor)来防止这些问题。
审计包括多个组件,每个组件都为总体框架提供着关键功能。审计内核模块会截获系统调用并记录相关事件。auditd
守护程序会将审计报告写入磁盘。各种命令行实用程序会处理审计追踪的显示、查询和存档。
审计可让您执行以下操作:
- 将用户与进程相关联
审计会将进程映射到启动它们的用户 ID。这样,管理员或安全员便可以确切地跟踪哪个用户拥有哪个进程,并判断该用户是否可能正在系统上执行恶意操作。
重要:重命名用户 ID审计不会处理 UID 的重命名。因此,请避免重命名 UID(例如,将
tux
从uid=1001
更改为uid=2000
),而是将 UID 作废。否则,您需要更改auditctl
数据(审计规则),并且在正确检索旧数据时会遇到问题。- 查看审计追踪
Linux 审计提供了用于将审计报告写入磁盘并将其转换成直观易懂的格式的工具。
- 查看特定的审计事件
审计提供了可供您过滤特定相关事件的审计报告的实用程序。您可以过滤:
用户
组
审计 ID
远程主机名
远程主机地址
系统调用
系统调用参数
文件
文件操作
成功或失败
- 应用选择性审计
审计提供了用于过滤相关事件的审计报告以及调整审计以仅记录选定事件的方法。您可以创建自己的规则集,让审计守护程序仅记录您想关注的事件。
- 保证报告数据的可用性
审计报告由
root
拥有,因此只能由root
去除。未获授权的用户无法去除审计日志。- 防止审计数据丢失
如果内核耗尽了内存,将会超出审计守护程序的积压或速率上限,在此情况下,审计可能会触发系统关闭,以防止事件脱离审计的控制。这种关闭是审计内核组件触发的系统立即暂停,不会将最新日志同步到磁盘。默认配置是在系统日志中记录一条警告,而不是暂停系统。
如果系统在记录日志时耗尽了磁盘空间,可将审计系统配置为执行正常关闭。默认配置会告知审计守护程序在耗尽磁盘空间时停止日志记录。
44.1 Linux 审计组件简介 #
在 SUSE Linux Enterprise Server 15 SP4 中,audispd
的代码已合并到 auditd
中。所有 audispd
配置现在位于 /etc/audit/auditd.conf
和 /etc/audit/plugins.d
中。
下图说明各审计组件相互之间的交互方式:
实线箭头表示组件之间的数据流,虚线箭头表示组件之间的控制线。
- auditd
审计守护程序通过审计内核接口生成并由应用程序和系统活动触发的审计消息写入磁盘。审计守护程序的启动方式由
systemd
控制。审计系统功能(如果已启动)由/etc/audit/auditd.conf
控制。有关auditd
及其配置的详细信息,请参见第 44.2 节 “配置审计守护程序”。auditctl
auditctl
实用程序控制审计系统。它可控制审计接口的日志生成参数和内核设置,以及用于确定要跟踪哪些事件的规则集。有关auditctl
的详细信息,请参见第 44.3 节 “使用auditctl
控制审计系统”。- 审计规则
/etc/audit/audit.rules
文件包含一系列auditctl
命令,在系统引导时,启动审计守护程序后会紧接着装载这些命令。有关审计规则的详细信息,请参见第 44.4 节 “将参数传递到审计系统”。- aureport
aureport
实用程序可让您基于审计事件日志创建自定义报告。您可以轻松编写生成报告的脚本,而各种其他应用程序可以使用脚本的输出来绘制这些结果的图表以及执行其他操作。有关aureport
的详细信息,请参见第 44.5 节 “了解审计日志和生成报告”。- ausearch
ausearch
实用程序可以使用所记录的格式的各种键或其他特征在审计日志文件中搜索特定的事件。有关ausearch
的详细信息,请参见第 44.6 节 “使用ausearch
查询审计守护程序日志”。- autrace
autrace
实用程序以类似于strace
的方式跟踪单个进程。autrace
的输出将记录到审计日志。有关autrace
的详细信息,请参见第 44.7 节 “使用autrace
分析进程”。- aulast
列显最后几个登录用户的列表,类似于
last
。aulast
在整个审计日志(或给定的审计日志文件)中向后搜索,并基于审计日志中的时间范围显示所有登录和注销用户的列表。- aulastlog
以类似于
lastlog
的方式列显所有计算机用户的上次登录信息。将列显登录名、端口和上次登录时间。
44.2 配置审计守护程序 #
在您可以开始生成并处理审计日志之前,需先配置审计守护程序本身。/etc/audit/auditd.conf
配置文件确定审计系统在守护程序启动后的运行方式。对于大多数用例而言,SUSE Linux Enterprise Server 随附的默认设置应已足够。如果是 CAPP 环境,则需要调整其中的大部分参数。以下示例为默认配置:
local_events = yes write_logs = yes log_file = /var/log/audit/audit.log log_group = audit log_format = RAW flush = INCREMENTAL_ASYNC freq = 50 max_log_file = 8 num_logs = 5 priority_boost = 4 name_format = NONE ##name = mydomain max_log_file_action = ROTATE space_left = 75 space_left_action = SYSLOG verify_email = yes action_mail_acct = root admin_space_left = 50 admin_space_left_action = SUSPEND disk_full_action = SUSPEND disk_error_action = SUSPEND use_libwrap = yes ##tcp_listen_port = 60 tcp_listen_queue = 5 tcp_max_per_addr = 1 ##tcp_client_ports = 1024-65535 tcp_client_max_idle = 0 transport = TCP distribute_network = no q_depth = 1200 overflow_action = SYSLOG max_restarts = 10 plugin_dir = /etc/audit/plugins.d end_of_event_timeout = 2
有关这些选项的说明,请参见 man 5 auditd.conf
。
根据您是否希望环境满足 CAPP 的要求,在配置审计守护程序时需要额外加强限制。在您需要使用特定的设置才能满足 CAPP 要求的位置,我们会提供“CAPP 环境”注释告知您如何调整配置。
完成 /etc/audit/auditd.conf
中的守护程序配置后,下一步是重点控制守护程序执行的审计量,并为守护程序指派足够其顺利运行的资源和限制。
44.3 使用 auditctl
控制审计系统 #
auditctl
控制审计守护程序的状态和基本系统参数。它控制对系统执行的审计量。auditctl
使用审计规则来控制系统的哪些组件需要接受审计及对其进行的审计范围。可在 auditctl
命令行中或者通过撰写规则集并指示审计守护程序处理此文件,将审计规则传递给审计守护程序。auditd
守护程序默认配置为检查 /etc/audit/audit.rules
下的审计规则。有关审计规则的更多细节,请参见第 44.4 节 “将参数传递到审计系统”。
用于控制基本审计系统参数的主要 auditctl
命令包括:
auditctl
-e
,用于启用或禁用审计auditctl
-f
,用于控制故障标志auditctl
-r
,用于控制审计消息的速率上限auditctl
-b
,用于控制积压上限auditctl
-s
,用于查询审计守护程序的当前状态auditctl
-S
,用于指定要审计的系统调用。在系统上运行auditctl -S
之前,请添加-F arch=b64
以防止出现体系结构不匹配警告。
您还可以在 audit.rules
文件中指定 -e
、-f
、-r
和 -b
选项,这样您就无需在审计守护程序每次启动时都重新输入这些选项。
每当您使用 auditctl
-s
查询审计守护程序的状态,或使用 auditctl
-eFLAG
更改状态标志时,都会列显一条状态消息(包括有关上述每个参数的信息)。下面的示例重点列出了典型的审计状态消息。
auditctl
-s
的示例输出 #enabled 1 failure 1 pid 790 rate_limit 0 backlog_limit 64 lost 0 backlog 0 backlog_wait_time 15000 loginuid_immutable 0 unlocked
标志 |
含义 [可能的值] |
命令 |
---|---|---|
|
设置启用标志。[0..2] 0=禁用,1=启用,2=启用并锁定配置。请注意,此标志只禁用日志记录系统调用,系统仍会记录其他事件。(请参见 audit-devel 中的 |
|
|
设置故障标志。[0..2] 0=静默,1=printk,2=恐慌(立即暂停且不将等待中数据同步到磁盘) |
|
|
正在运行 |
— |
|
设置每秒消息数上限。如果该值不为零且每秒消息数超过该上限,将触发故障标志中指定的操作。 |
|
|
指定允许的未处理审计缓冲区的最大数目。如果所有缓冲区已满,将触发故障标志中指定的操作。 |
|
|
统计当前丢失的审计消息数。 |
— |
|
统计当前未处理的审计缓冲区数。 |
— |
44.4 将参数传递到审计系统 #
您可以在外壳中使用 auditctl
单独调用用于控制审计系统的命令,也可以使用 auditctl -
R
从文件中批量读取此类命令。启动审计守护程序后,init 脚本会使用后一种方法从 /etc/audit/audit.rules
文件装载规则。规则按照从上到下的顺序执行。其中每条规则将扩展为单独的 auditctl
命令。规则文件中使用的语法与 auditctl
命令使用的语法相同。
通过在命令行上执行 auditctl
对运行中审计系统所做的更改在系统重启动后不会保留。要持久保留更改,请将更改添加到 /etc/audit/audit.rules
文件;如果更改当前尚未装载到审计中,请使用 systemctl restart
auditd
命令重启动审计系统以装载修改后的规则集。
-b 10001 -f 12 -r 103 -e 14
指定未处理审计缓冲区的最大数目。根据日志记录活动的级别,您可能需要调整缓冲区的数目,以免系统上的审计负载过于繁重。 | |
指定要使用的故障标志。有关可能的值,请参见表 44.1 “审计状态标志”。 | |
指定内核每秒可发出的最大消息数目。有关详细信息,请参见表 44.1 “审计状态标志”。 | |
启用或禁用审计子系统。 |
使用审计,您可以跟踪以任何形式通过文件系统对重要文件、配置或资源进行的访问。您可以添加针对这些内容的监测项,并为每种监视项指派相应的键,以方便在日志中识别。
-w /etc/shadow1 -w /etc -p rx2 -w /etc/passwd -k fk_passwd -p rwxa3
| |
此规则添加对 | |
此规则向 |
系统调用审计甚至可让您以低于应用程序级别的级别来跟踪系统的行为。设计这些规则时,请考虑到审计大量系统调用可能会增加系统负载,并导致磁盘空间耗尽。请仔细考虑哪些事件需要跟踪,以及如何过滤事件才会使结果更具体。
-a exit,always -S mkdir1 -a exit,always -S access -F a1=42 -a exit,always -S ipc -F a0=23 -a exit,always -S open -F success!=04 -a task,always -F auid=05 -a task,always -F uid=0 -F auid=501 -F gid=wheel6
此规则对 | |
此规则添加对 access 系统调用的审计,但仅当该系统调用的第二个参数 ( | |
此规则添加 IPC 多路转换系统调用的审计环境。特定的 | |
此规则审计失败的 open 调用尝试。 | |
此规则是任务规则(关键字为 | |
最后这条规则使用了很多过滤器。所有过滤选项都与逻辑 AND 运算符相结合,表示此规则将应用于带有审计 ID |
有关过滤系统调用参数的更多细节,请参见第 46.6 节 “过滤系统调用参数”。
您不仅可以将规则添加到审计系统,而且还可以去除规则。可通过不同的方法一次性删除整个规则集,或者删除系统调用规则或文件和目录监测项:
-D1 -d exit,always -S mkdir2 -W /etc3
清除审计规则的队列并删除任何以前存在的规则。此规则用作 | |
此规则删除某个系统调用规则。 | |
此规则告知审计从规则队列中丢弃包含 |
要了解审计设置中当前使用了哪些规则,请运行 auditctl
-l
。此命令显示所有规则,每行显示一条规则。
auditctl
-l
列出规则 #exit,always watch=/etc perm=rx exit,always watch=/etc/passwd perm=rwxa key=fk_passwd exit,always watch=/etc/shadow perm=rwxa exit,always syscall=mkdir exit,always a1=4 (0x4) syscall=access exit,always a0=2 (0x2) syscall=ipc exit,always success!=0 syscall=open
您可以使用各种过滤选项构建复杂的审计规则。有关可用于构建审计过滤规则的选项以及审计规则的详细信息,请参见 auditctl(8)
手册页。
44.5 了解审计日志和生成报告 #
要了解 aureport
实用程序的作用,必须知道审计守护程序所生成的日志的构造方式,以及审计针对事件具体会记录哪些内容。只有在获知这些信息后,您才能确定哪些报告类型最适合您的需求。
44.5.1 了解审计日志 #
以下示例重点展示了审计所记录的两个典型事件,以及在审计日志中读取其追踪的方式。一个或多个(如果启用了日志轮换)审计日志存储在 /var/log/audit
目录中。
日志记录两种类型的信息:记录类型和事件字段。记录类型由每个日志项中的 type=
标识。事件字段是等号左侧的所有其他项目。在以下示例中,type=SYSCALL
和 type=CWD
是记录类型,arch=c000003e
和 syscall=2
是事件字段,其后显示的是字段值。
请参见 /usr/include/libaudit.h
文件(来自 audit-devel 软件包)以查看记录类型及其完整定义列表。
运行 ausyscall --dump
命令以查看系统调用编号的表格及其含义:
>
ausyscall --dump
Using x86_64 syscall table:
0 read
1 write
2 open
3 close
4 stat
5 fstat
[...]
第一个示例是个简单的 less
命令。第二个示例包含当用户尝试远程登录到运行审计的计算机时,日志中记录的大量 PAM 活动。
type=SYSCALL msg=audit(1234874638.599:5207): arch=c000003e syscall=2 success=yes exit=4 a0=62fb60 a1=0 a2=31 a3=0 items=1 ppid=25400 pid =25616 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1164 comm="less" exe="/usr/bin/less" key="doc_log" type=CWD msg=audit(1234874638.599:5207): cwd="/root" type=PATH msg=audit(1234874638.599:5207): item=0 name="/var/log/audit/ audit.log" inode=1219041 dev=08:06 mode=0100644 ouid=0 ogid=0 rdev=00:00
上面的事件是一个简单的 less
/var/log/audit/audit.log
,它将三条消息写入到日志。所有消息密切相关,仅凭其中的一条消息将无法理解其他消息。第一条消息揭示了以下信息:
type
记录的事件类型。在本例中,为系统调用触发的事件指派了
SYSCALL
类型。记录CWD
事件的目的是记录执行系统调用时的当前工作目录。为传递给系统调用的每个生成了一个PATH
事件。open 系统调用仅接受一个路径参数,因此仅生成了一个PATH
事件。请务必注意,PATH
事件报告路径名字符串参数时并不经过任何进一步的解释,因此,相对路径需要与CWD
事件报告的路径相结合才能确定访问的对象。msg
括在括号中的消息 ID。该 ID 分为两个部分。
:
前面的所有字符表示 Unix 纪元时戳。冒号后面的数字表示实际的事件 ID。所记录的来自一个应用程序系统调用的所有事件都具有相同的事件 ID。如果应用程序发出第二次系统调用,将会为其分配另一个事件 ID。arch
引用系统调用的 CPU 体系结构。搜索日志时,请在您的任何
ausearch
命令中使用-i
选项来解码此信息。syscall
系统调用的类型,对此特定系统调用运行
strace
会列显此信息。此数据取自/usr/include/asm/unistd.h
下的系统调用列表,可能会因体系结构而异。在本例中,syscall=2
表示 less 应用程序调用的 open 系统调用(参见man open(2)
)。success
系统调用是成功还是失败。
exit
系统调用返回的退出值。对于本示例中使用的
open
系统调用,退出值为文件描述符编号。此值因系统调用而异。a0
到a3
系统调用的前四个参数,采用数字格式。这些参数的值与系统调用相关。本示例(
open
系统调用)中使用了以下参数:a0=62fb60 a1=8000 a2=31 a3=0
a0
是传递的路径的起始地址。a1
是标志。以十六进制表示的8000
转换为以八进制表示的100000
,后者又转换为O_LARGEFILE
。a2
是模式,由于未指定O_CREAT
,因此未使用此参数。a3
不是由open
系统调用传递。请查看相关系统调用的手册页,了解可与该系统调用搭配使用的参数。items
传递给应用程序的字符串数。
ppid
所分析进程的父进程的 ID。
pid
所分析进程的 ID。
auid
审计 ID。系统会在用户登录时为某个进程分配审计 ID。然后,此 ID 将传给用户的初始进程所启动的任何子进程。即使用户更改了其身份(例如,变成了
root
),审计 ID 也会保持不变。因此,您始终可以跟踪原始登录用户的操作。uid
启动该进程的用户的 ID。在本例中,该 ID 为
0
(表示root
)。gid
启动该进程的用户的组 ID。在本例中,该 ID 为
0
(表示root
)。euid
,suid
,fsuid
启动该进程的用户的有效用户 ID、设置的用户 ID 和文件系统用户 ID。
egid
,sgid
,fsgid
启动该进程的用户的有效组 ID、设置的组 ID 和文件系统组 ID。
tty
用于启动应用程序的终端。本示例在 SSH 会话中使用了一个伪终端。
ses
登录会话 ID。系统会在用户登录时设置此进程属性,它可以将任何进程关联到特定的用户登录操作。
comm
应用程序显示在任务列表中时所使用的名称。
exe
二进制程序的解析路径。
subj
auditd
记录进程是否受到任何安全环境(例如 AppArmor)的约束。本例中所示的unconstrained
表示进程不受 AppArmor 的限制。如果进程受到限制,将记录二进制文件路径加上 AppArmor 配置文件模式。key
如果您正在审计许多目录或文件,请向其中的每个监测项指派键字符串。将这些键与
ausearch
结合使用可以仅搜索此类型事件的日志。
示例 less
调用触发的第二条消息只揭示了执行 less
命令时的当前工作目录。
第三条消息揭示了以下信息(已引入 type
和 message
标志):
item
在本示例中,
item
引用了a0
参数 — 与原始SYSCALL
消息关联的路径。如果原始调用有多个路径参数(例如cp
或mv
命令),将会额外为第二个路径参数记录一个PATH
事件。name
表示作为参数传递给 open 系统调用的路径。
inode
表示与
name
对应的 inode 编号。dev
指定存储文件的设备。在本例中为
08:06
,表示/dev/sda1
或“第一个 IDE 设备上的第一个分区”。mode
文件访问权限的数字表示形式。在本例中,
root
拥有读取和写入权限,其组 (root
) 拥有读取访问权限,而其余的所有用户和组无法访问该文件。ouid
和ogid
表示 inode 本身的 UID 和 GID。
rdev
不适用于此示例。
rdev
项仅适用于块设备或字符设备,不适用于文件。
例 44.9 “高级审计事件 — 通过 SSH 登录”重点展示了传入的 SSH 连接所触发的审计事件。大多数消息与 PAM 堆栈相关,反映 SSH PAM 进程的不同阶段。有几条审计消息带有嵌套的 PAM 消息,这些 PAM 消息表示已达到 PAM 进程的特定阶段。尽管审计会记录 PAM 消息,但它会为每个事件指派其自身的消息类型:
type=USER_AUTH msg=audit(1234877011.791:7731): user pid=26127 uid=0 1 auid=4294967295 ses=4294967295 msg='op=PAM:authentication acct="root" exe="/usr/sbin/sshd" (hostname=jupiter.example.com, addr=192.168.2.100, terminal=ssh res=success)' type=USER_ACCT msg=audit(1234877011.795:7732): user pid=26127 uid=0 2 auid=4294967295 ses=4294967295 msg='op=PAM:accounting acct="root" exe="/usr/sbin/sshd" (hostname=jupiter.example.com, addr=192.168.2.100, terminal=ssh res=success)' type=CRED_ACQ msg=audit(1234877011.799:7733): user pid=26125 uid=0 3 auid=4294967295 ses=4294967295 msg='op=PAM:setcred acct="root" exe="/usr/sbin/sshd" (hostname=jupiter.example.com, addr=192.168.2.100, terminal=/dev/pts/0 res=success)' type=LOGIN msg=audit(1234877011.799:7734): login pid=26125 uid=0 old auid=4294967295 new auid=0 old ses=4294967295 new ses=1172 type=USER_START msg=audit(1234877011.799:7735): user pid=26125 uid=0 4 auid=0 ses=1172 msg='op=PAM:session_open acct="root" exe="/usr/sbin/sshd" (hostname=jupiter.example.com, addr=192.168.2.100, terminal=/dev/pts/0 res=success)' type=USER_LOGIN msg=audit(1234877011.823:7736): user pid=26128 uid=0 5 auid=0 ses=1172 msg='uid=0: exe="/usr/sbin/sshd" (hostname=jupiter.example.com, addr=192.168.2.100, terminal=/dev/pts/0 res=success)' type=CRED_REFR msg=audit(1234877011.828:7737): user pid=26128 uid=0 6 auid=0 ses=1172 msg='op=PAM:setcred acct="root" exe="/usr/sbin/sshd" (hostname=jupiter.example.com, addr=192.168.2.100, terminal=/dev/pts/0 res=success)'
44.5.2 生成自定义审计报告 #
/var/log/audit
目录中存储的原始审计报告会逐渐变得庞大且难以理解。要想更轻松地查找相关消息,请使用 aureport
实用程序并创建自定义报告。
以下用例重点展示了您可以使用 aureport
生成的几种可能的报告类型:
- 从另一文件读取审计日志
当审计日志移到另一台计算机后,或者当您想要在本地计算机上分析多台计算机的日志,而又不想逐个连接其中每台计算机时,请将日志移到某个本地文件,然后在本地使用
aureport
分析这些日志:>
sudo
aureport -if myfile
Summary Report ====================== Range of time in logs: 03/02/09 14:13:38.225 - 17/02/09 14:52:27.971 Selected time for report: 03/02/09 14:13:38 - 17/02/09 14:52:27.971 Number of changes in configuration: 13 Number of changes to accounts, groups, or roles: 0 Number of logins: 6 Number of failed logins: 13 Number of authentications: 7 Number of failed authentications: 573 Number of users: 1 Number of terminals: 9 Number of host names: 4 Number of executables: 17 Number of files: 279 Number of AVC's: 0 Number of MAC events: 0 Number of failed syscalls: 994 Number of anomaly events: 0 Number of responses to anomaly events: 0 Number of crypto events: 0 Number of keys: 2 Number of process IDs: 1211 Number of events: 5320上述不带任何参数的
aureport
命令仅提供基于myfile
中包含的日志生成的一般标准摘要报告。要创建更详细的报告,请将-if
选项与下面的任何选项结合使用。例如,生成仅限特定时间范围的登录报告:>
sudo
aureport -l -ts 14:00 -te 15:00 -if myfile
Login Report ============================================ # date time auid host term exe success event ============================================ 1. 17/02/09 14:21:09 root: 192.168.2.100 sshd /usr/sbin/sshd no 7718 2. 17/02/09 14:21:15 0 jupiter /dev/pts/3 /usr/sbin/sshd yes 7724- 将数字实体转换为文本
某些信息(例如用户 ID)将以数字形式列显。要将这些信息转换为直观易懂的文本格式,请在
aureport
命令中添加-i
选项。- 创建粗略的摘要报告
如果您要关注当前的审计统计(事件、登录、进程等),请运行不带任何其他选项的
aureport
。- 创建失败事件的摘要报告
要将单纯的
aureport
命令所提供的总体统计细分为失败事件的统计,请使用aureport
--failed
:>
sudo
aureport --failed
Failed Summary Report ====================== Range of time in logs: 03/02/09 14:13:38.225 - 17/02/09 14:57:35.183 Selected time for report: 03/02/09 14:13:38 - 17/02/09 14:57:35.183 Number of changes in configuration: 0 Number of changes to accounts, groups, or roles: 0 Number of logins: 0 Number of failed logins: 13 Number of authentications: 0 Number of failed authentications: 574 Number of users: 1 Number of terminals: 5 Number of host names: 4 Number of executables: 11 Number of files: 77 Number of AVC's: 0 Number of MAC events: 0 Number of failed syscalls: 994 Number of anomaly events: 0 Number of responses to anomaly events: 0 Number of crypto events: 0 Number of keys: 2 Number of process IDs: 708 Number of events: 1583- 创建成功事件的摘要报告
如果您要将单纯的
aureport
命令所提供的总体统计细分为成功事件的统计,请使用aureport
--success
:>
sudo
aureport --success
Success Summary Report ====================== Range of time in logs: 03/02/09 14:13:38.225 - 17/02/09 15:00:01.535 Selected time for report: 03/02/09 14:13:38 - 17/02/09 15:00:01.535 Number of changes in configuration: 13 Number of changes to accounts, groups, or roles: 0 Number of logins: 6 Number of failed logins: 0 Number of authentications: 7 Number of failed authentications: 0 Number of users: 1 Number of terminals: 7 Number of host names: 3 Number of executables: 16 Number of files: 215 Number of AVC's: 0 Number of MAC events: 0 Number of failed syscalls: 0 Number of anomaly events: 0 Number of responses to anomaly events: 0 Number of crypto events: 0 Number of keys: 2 Number of process IDs: 558 Number of events: 3739- 创建摘要报告
除了专用摘要报告(主要事件摘要,以及失败和成功事件摘要),还可以将
--summary
选项与大多数其他选项结合使用,以仅创建特定关注方面的摘要报告。不过,并非所有报告都支持此选项。下面的示例创建了用户登录事件的摘要报告:>
sudo
aureport -u -i --summary
User Summary Report =========================== total auid =========================== 5640 root 13 tux 3 wilber- 创建事件报告
要了解审计记录的事件,请使用
aureport
-e
命令。此命令会生成所有事件的带编号列表,其中包含日期、时间、事件编号、事件类型和审计 ID。>
sudo
aureport -e -ts 14:00 -te 14:21 Event Report =================================== # date time event type auid success =================================== 1. 17/02/09 14:20:27 7462 DAEMON_START 0 yes 2. 17/02/09 14:20:27 7715 CONFIG_CHANGE 0 yes 3. 17/02/09 14:20:57 7716 USER_END 0 yes 4. 17/02/09 14:20:57 7717 CRED_DISP 0 yes 5. 17/02/09 14:21:09 7718 USER_LOGIN -1 no 6. 17/02/09 14:21:15 7719 USER_AUTH -1 yes 7. 17/02/09 14:21:15 7720 USER_ACCT -1 yes 8. 17/02/09 14:21:15 7721 CRED_ACQ -1 yes 9. 17/02/09 14:21:15 7722 LOGIN 0 yes 10. 17/02/09 14:21:15 7723 USER_START 0 yes 11. 17/02/09 14:21:15 7724 USER_LOGIN 0 yes 12. 17/02/09 14:21:15 7725 CRED_REFR 0 yes- 基于所有进程事件创建报告
要从进程的角度分析日志,请使用
aureport
-p
命令。此命令会生成所有进程事件的带编号列表,其中包含日期、时间、进程 ID、可执行文件的名称、系统调用、审计 ID 和事件编号。aureport -p
Process ID Report ====================================== # date time pid exe syscall auid event ====================================== 1. 13/02/09 15:30:01 32742 /usr/sbin/cron 0 0 35 2. 13/02/09 15:30:01 32742 /usr/sbin/cron 0 0 36 3. 13/02/09 15:38:34 32734 /usr/lib/gdm/gdm-session-worker 0 -1 37- 基于所有系统调用事件创建报告
要从系统调用的角度分析审计日志,请使用
aureport
-s
命令。此命令会生成所有系统调用事件的带编号列表,其中包含日期、时间、系统调用的编号、进程 ID、使用此调用的命令的名称、审计 ID 和事件编号。>
sudo
aureport -s
Syscall Report ======================================= # date time syscall pid comm auid event ======================================= 1. 16/02/09 17:45:01 2 20343 cron -1 2279 2. 16/02/09 17:45:02 83 20350 mktemp 0 2284 3. 16/02/09 17:45:02 83 20351 mkdir 0 2285- 基于所有可执行文件事件创建报告
要从可执行文件的角度分析审计日志,请使用
aureport
-x
命令。此命令会生成所有可执行文件事件的带编号列表,其中包含日期、时间、可执行文件的名称、运行可执行文件的终端、执行可执行文件的主机、审计 ID 和事件编号。aureport -x
Executable Report ==================================== # date time exe term host auid event ==================================== 1. 13/02/09 15:08:26 /usr/sbin/sshd sshd 192.168.2.100 -1 12 2. 13/02/09 15:08:28 /usr/lib/gdm/gdm-session-worker :0 ? -1 13 3. 13/02/09 15:08:28 /usr/sbin/sshd ssh 192.168.2.100 -1 14- 创建有关文件的报告
要基于审计日志生成侧重于文件访问的报告,请使用
aureport
-f
命令。此命令会生成所有文件相关事件的带编号列表,其中包含日期、时间、所访问的文件的名称、访问文件的系统调用的编号、命令的成功或失败结果、访问文件的可执行文件、审计 ID 和事件编号。>
sudo
aureport -f
File Report =============================================== # date time file syscall success exe auid event =============================================== 1. 16/02/09 17:45:01 /etc/shadow 2 yes /usr/sbin/cron -1 2279 2. 16/02/09 17:45:02 /tmp/ 83 yes /bin/mktemp 0 2284 3. 16/02/09 17:45:02 /var 83 no /bin/mkdir 0 2285- 创建有关用户的报告
要基于审计日志生成用于说明哪些用户正在您的系统上运行哪些可执行文件的报告,请使用
aureport
-u
命令。此命令会生成所有用户相关事件的带编号列表,其中包含日期、时间、审计 ID、使用的终端、主机、可执行文件的名称和事件 ID。aureport -u
User ID Report ==================================== # date time auid term host exe event ==================================== 1. 13/02/09 15:08:26 -1 sshd 192.168.2.100 /usr/sbin/sshd 12 2. 13/02/09 15:08:28 -1 :0 ? /usr/lib/gdm/gdm-session-worker 13 3. 14/02/09 08:25:39 -1 ssh 192.168.2.101 /usr/sbin/sshd 14- 创建有关登录的报告
要创建重点统计登录您计算机的尝试的报告,请运行
aureport
-l
命令。此命令会生成所有登录相关事件的带编号列表,其中包含日期、时间、审计 ID、使用的主机和终端、可执行文件的名称、尝试的成功或失败结果,以及事件 ID。>
sudo
aureport -l -i
Login Report ============================================ # date time auid host term exe success event ============================================ 1. 13/02/09 15:08:31 tux: 192.168.2.100 sshd /usr/sbin/sshd no 19 2. 16/02/09 12:39:05 root: 192.168.2.101 sshd /usr/sbin/sshd no 2108 3. 17/02/09 15:29:07 geeko: ? tty3 /bin/login yes 7809- 将报告范围限制在特定的时间范围
要分析特定时间范围的日志(例如,仅分析 2009 年 2 月 16 日工作时间的日志),请先运行
aureport
-t
来确定这些数据是否包含在当前的audit.log
中,或者日志是否已进行了轮换:aureport -t
Log Time Range Report ===================== /var/log/audit/audit.log: 03/02/09 14:13:38.225 - 17/02/09 15:30:01.636当前的
audit.log
包含所有所需的数据。如果情况并非如此,请使用-if
选项将aureport
命令指向包含所需数据的日志文件。然后指定所需时间范围的开始与结束日期和时间,并将其与所需的报告选项结合使用。本示例重点统计登录尝试:
>
sudo
aureport -ts 02/16/09 8:00 -te 02/16/09 18:00 -l
Login Report ============================================ # date time auid host term exe success event ============================================ 1. 16/02/09 12:39:05 root: 192.168.2.100 sshd /usr/sbin/sshd no 2108 2. 16/02/09 12:39:12 0 192.168.2.100 /dev/pts/1 /usr/sbin/sshd yes 2114 3. 16/02/09 13:09:28 root: 192.168.2.100 sshd /usr/sbin/sshd no 2131 4. 16/02/09 13:09:32 root: 192.168.2.100 sshd /usr/sbin/sshd no 2133 5. 16/02/09 13:09:37 0 192.168.2.100 /dev/pts/2 /usr/sbin/sshd yes 2139开始日期和时间是使用
-ts
选项指定的。时戳等于或晚于给定开始时间的任何事件都会显示在报告中。如果省略日期,aureport
将假设您指的是今天。如果省略时间,它会假设开始时间是指定日期的午夜。使用
-te
选项指定结束日期和时间。时戳等于或早于给定事件时间的任何事件都会显示在报告中。如果省略日期,aureport
将假设您指的是今天。如果省略时间,它会假设结束时间是现在。请使用与-ts
相同的日期和时间格式。
除摘要报告以外的所有报告将以列格式列显并发送到 STDOUT,这意味着,这些数据可以轻松地写入到其他命令。第 44.8 节 “可视化审计数据”中介绍的视觉化脚本是演示如何进一步处理审计所生成的数据的示例。
44.6 使用 ausearch
查询审计守护程序日志 #
aureport
工具可帮助您创建有关系统上发生的情况的总体摘要,但如果您要了解特定事件的细节,可以使用 ausearch
工具。
ausearch
可让您使用特殊的键和搜索短语搜索审计日志,这些键和短语与 /var/log/audit/audit.log
中的事件消息内显示的大多数标志相关。并非所有记录类型都包含相同的搜索短语。例如,PATH
记录中没有 hostname
或 uid
项。
搜索时,请确保选择适当的搜索准则来捕获所需的所有记录。否则,您在搜索特定类型的记录时,可能会随其一并获取相关的其他各种记录。之所以会这样,是因为内核的不同组件会提供与所要查找的记录相关的其他事件记录。例如,对于 open
系统调用,您在获取 SYSCALL
记录的同时始终会获取一条 PATH
记录。
您可将任何命令行选项与 AND 逻辑运算符相结合,以缩小搜索范围。
- 从另一文件读取审计日志
将审计日志移到另一台计算机后,或者当您想要在本地计算机上分析多台计算机的日志,而又不想逐个连接其中每台计算机时,请将日志移到某个本地文件,然后在本地使用
ausearch
搜索这些日志:>
sudo
ausearch -
option -if myfile- 将数字结果转换为文本
某些信息(例如用户 ID)将以数字形式列显。要将这些信息转换为直观易懂的文本格式,请在
ausearch
命令中添加-i
选项。- 按审计事件 ID 搜索
如果您先前运行了审计报告或执行了
autrace
,则应分析日志中特定事件的追踪。第 44.5 节 “了解审计日志和生成报告”中所述的大多数报告类型都会在其输出中包含审计事件 ID。审计事件 ID 是审计消息 ID 的第二部分,后者由 Unix 纪元时戳和审计事件 ID 构成(以冒号分隔)。所记录的来自一个应用程序系统调用的所有事件都具有相同的事件 ID。在ausearch
中使用此事件 ID 可以从日志中检索此事件的追踪。使用如下所示的命令:
>
sudo
ausearch -a 5207
---- time->Tue Feb 17 13:43:58 2009 type=PATH msg=audit(1234874638.599:5207): item=0 name="/var/log/audit/audit.log" inode=1219041 dev=08:06 mode=0100644 ouid=0 ogid=0 rdev=00:00 type=CWD msg=audit(1234874638.599:5207): cwd="/root" type=SYSCALL msg=audit(1234874638.599:5207): arch=c000003e syscall=2 success=yes exit=4 a0=62fb60 a1=0 a2=31 a3=0 items=1 ppid=25400 pid=25616 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1164 comm="less" exe="/usr/bin/less" key="doc_log"ausearch
-a
命令会抓取并显示日志中与所提供审计事件 ID 相关的所有记录。此选项可与任何其他选项结合使用。- 按消息类型搜索
要搜索特定消息类型的审计记录,请使用
ausearch
-m MESSAGE_TYPE
命令。有效消息类型的示例包括PATH
、SYSCALL
和USER_LOGIN
。运行不带消息类型的ausearch
-m
会显示所有消息类型的列表。- 按登录 ID 搜索
要查看与特定登录用户 ID 关联的记录,请使用
ausearch
-ul
命令。此命令显示与指定的用户登录 ID 相关的所有记录,前提是该用户过去能够成功登录。- 按用户 ID 搜索
使用
ausearch
-ua
查看与任何用户 ID(用户 ID 和有效用户 ID)相关的记录。使用ausearch
-ui UID
查看与特定用户 ID 相关的报告。要搜索与特定有效用户 ID 相关的记录,请使用ausearch
-ue EUID
。搜索用户 ID 是指搜索创建进程的用户的 ID。搜索有效用户 ID 是指搜索该用户 ID 以及运行此进程所需的特权。- 按组 ID 搜索
使用
ausearch
-ga
命令查看与任何组 ID(组 ID 和有效组 ID)相关的记录。使用ausearch
-gi GID
查看与特定用户 ID 相关的报告。要搜索与特定有效组 ID 相关的记录,请使用ausearch
-ge EGID
。- 按命令行名称搜索
使用
ausearch
-c COMM_NAME
命令查看与特定命令相关的记录,例如,使用ausearch
-c less
可查看与less
命令相关的所有记录。- 按可执行文件名搜索
使用
ausearch
-x EXE
命令查看与特定可执行文件相关的记录,例如,使用ausearch
-x /usr/bin/less
可查看与/usr/bin/less
可执行文件相关的所有记录。- 按系统调用名称搜索
使用
ausearch
-sc SYSCALL
命令查看与特定系统调用相关的记录,例如,使用ausearch -sc open
可查看与open
系统调用相关的所有记录。- 按进程 ID 搜索
使用
ausearch
-p PID
命令查看与特定进程 ID 相关的记录,例如,使用ausearch
-p 13368
可查看与此进程 ID 相关的所有记录。- 按事件或系统调用成功值搜索
使用
ausearch
-sv SUCCESS_VALUE
查看包含特定系统调用成功值的记录,例如,使用ausearch
-sv yes
可查看所有成功的系统调用。- 按文件名搜索
使用
ausearch
-f FILE_NAME
查看包含特定文件名的记录,例如,使用ausearch
-f /foo/bar
可查看与/foo/bar
文件相关的所有记录。您也可以仅使用文件名,但不能使用相对路径。- 按终端搜索
使用
ausearch
-tm TERM
查看仅与特定终端相关的记录,例如,使用ausearch
-tm ssh
可查看与 SSH 终端上的事件相关的所有记录,使用ausearch
-tm tty
可查看与该控制台相关的所有事件。- 按主机名搜索
使用
ausearch
-hn HOSTNAME
(例如ausearch
-hn jupiter.example.com
)查看与特定远程主机名相关的记录。可以使用主机名、完全限定的域名或数字格式的网络地址。- 按键字段搜索
查看包含审计规则集中指派的特定键(用于识别特定类型的事件)的记录。使用
ausearch
-k KEY_FIELD
(例如ausearch
-k CFG_etc
)显示包含CFG_etc
键的所有记录。- 按字词搜索
查看包含审计规则集中指派的特定字符串(用于识别特定类型的事件)的记录。整个字符串将与文件名、主机名和终端进行匹配。使用
ausearch
-w WORD
。- 将搜索范围限制在特定的时间范围
使用
-ts
和-te
可将搜索范围限制在特定的时间范围。-ts
选项用于指定开始日期和时间,-te
选项用于指定结束日期和时间。这些选项可与上面所述的任何选项结合使用。这些选项的用法与在aureport
中的用法类似。
44.7 使用 autrace
分析进程 #
除了使用设置的规则监视系统以外,您还可以使用 autrace
命令对各个进程执行专门的审计。autrace
的工作方式类似于 strace
命令,但它收集的信息略有不同。autrace
的输出将写入到 /var/log/audit/audit.log
,看上去与标准审计日志项并无任何不同。
对进程执行 autrace
时,请确保从队列中清除所有审计规则,以免这些规则与 autrace
本身添加的规则相冲突。使用 auditctl
-D
命令删除审计规则。这会停止所有一般审计。
>
sudo
auditctl -D
No rulesautrace /usr/bin/less
Waiting to execute: /usr/bin/less Cleaning up... No rules Trace complete. You can locate the records with 'ausearch -i -p 7642'
请始终使用要通过 autrace
跟踪的可执行文件的完整路径。完成跟踪后,autrace
会提供跟踪的事件 ID,因此您可以使用 ausearch
分析整个数据追踪。要将审计系统恢复为重新使用审计规则集,请使用 systemctl restart auditd
重启动审计守护程序。
44.8 可视化审计数据 #
/var/log/audit/audit.log
中的数据追踪以及 aureport
生成的不同报告类型(如第 44.5.2 节 “生成自定义审计报告”中所述)都不会向用户提供直观的阅读体验。aureport
输出采用列格式,因此可轻松地用在用户可能连接到审计框架的任何 sed、Perl 或 awk 脚本中,以直观呈现审计数据。
可视化脚本(参见第 45.6 节 “配置日志可视化”)是展示如何使用 SUSE Linux Enterprise Server 或任何其他 Linux 发行套件提供的标准 Linux 工具创建易于阅读的审计输出的一个示例。以下示例可帮助您了解如何将纯文本审计报告转换为直观易懂的图形。
第一个示例说明程序与系统调用之间的关系。要了解此类数据,需要确定用于提供源数据(最终图形是在这些数据的基础上生成的)的相应 aureport
命令:
>
sudo
aureport -s -i
Syscall Report ======================================= # date time syscall pid comm auid event ======================================= 1. 16/02/09 17:45:01 open 20343 cron unset 2279 2. 16/02/09 17:45:02 mkdir 20350 mktemp root 2284 3. 16/02/09 17:45:02 mkdir 20351 mkdir root 2285 ...
可视化脚本需要对此报告执行的第一项操作是仅提取所需的列,在本例中为 syscall
和 comm
列。将输出排序并去除重复数据,然后将最终输出写入可视化程序自身中:
LC_ALL=C aureport -s -i | awk '/^[0-9]/ { print $6" "$4 }' | sort | uniq | mkgraph
第二个示例说明各种不同类型的事件以及已记录的每种类型的事件数量。用于提取此类信息的相应 aureport
命令是 aureport -e
:
>
sudo
aureport -e -i --summary Event Summary Report ====================== total type ====================== 2434 SYSCALL 816 USER_START 816 USER_ACCT 814 CRED_ACQ 810 LOGIN 806 CRED_DISP 779 USER_END 99 CONFIG_CHANGE 52 USER_LOGIN
由于此类报告已包含两列输出,因此只会馈送到可视化脚本并转换为条形图。
>
sudo
aureport -e -i --summary | mkbar events
有关审计数据可视化的背景信息,请参见审计项目的网站 http://people.redhat.com/sgrubb/audit/visualize/index.html。
44.9 中继审计事件通知 #
审计系统还允许外部应用程序实时访问和使用 auditd
守护程序。此功能由所谓的审计调度程序提供,举例而言,入侵检测系统可以通过此程序使用 auditd
来接收增强的检测信息。
auditd
的配置存储在 /etc/audit/auditd.conf
中。该文件包含以下选项:
q_depth
指定事件调度程序内部队列的大小。如果系统日志指出审计事件开始被丢弃,请增大此值。默认值为 250。
overflow_action
指定审计守护程序对内部队列溢出的反应方式。可能的值为
ignore
(不做任何反应)、syslog
(向系统日志发出警告)、suspend
(停止处理事件)、single
(将计算机系统置于单用户模式)或halt
(关闭系统)。priority_boost
指定审计事件调度程序的优先级(以及审计守护程序本身的优先级)。默认值为 4,即优先级无变化。
name_format
指定在审计事件中插入计算机节点名称的方式。可能的值为
none
(不插入计算机名)、hostname
(gethostname
系统调用返回的名称)、fqd
(计算机的完全限定域名)、numeric
(计算机的 IP 地址)或user
(name
选项中用户定义的字符串)。默认值为none
。name
指定用于标识计算机的用户定义的字符串。
name_format
选项必须设置为user
,否则会忽略此选项。max_restarts
用于指定审计事件调度程序可以尝试重启动崩溃插件的次数的非负数。默认值为 10。
q_depth = 250 overflow_action = SYSLOG priority_boost = 4 name_format = HOSTNAME #name = mydomain
插件程序将其配置文件安装在特殊目录 /etc/audit/plugins.d
中。插件配置文件具有以下选项:
active
指定程序是否使用
auditd
。可能的值为yes
或no
。direction
指定插件预期会采用什么方式与审计通讯。它可向事件调度程序告知事件的流动方向。可能的值为
in
或out
。path
指定插件可执行文件的绝对路径。对于内部插件,此选项会指定插件名称。
type
指定运行插件的方式。可能的值为
builtin
或always
。builtin
用于内部插件(af_unix
和syslog
),always
用于大多数(甚至所有)其他插件。默认值为always
。args
指定传递给插件程序的参数。正常情况下,插件程序将从其配置文件读取其参数,不需要接收任何参数。限制为两个参数。
format
指定审计调度程序传递给插件程序的数据格式。有效选项为
binary
或string
。binary
以事件调度程序从审计守护程序接收数据时的原有格式传递数据。string
指示调度程序将事件更改为可由审计分析库分析的字符串。默认值为string
。
active = no direction = out path = /sbin/audisp-syslog type = builtin args = LOG_INFO format = string