Linux 审计系统

发布于 2022-06-27  175 次阅读


Table of Contents


审计不会为您的系统提供额外的安全,而是用于发现系统上使用的安全策略的违规。可以通过其他安全措施(如 SELinux)进一步防止这些违规。

1. Linux 审计

Linux 审计系统提供了一种方式来跟踪系统上与安全相关的信息。根据预配置的规则,审计会生成日志条目,来尽可能多地记录系统上所发生的事件的相关信息。对于关键任务环境而言至关重要,可用来确定安全策略的违反者及其所执行的操作。

以下列表总结了审计可以在其日志文件中记录的一些信息:

  • 事件的日期、时间、类型和结果.
  • 主题和对象的敏感度标签。
  • 事件与触发事件的用户身份的关联。
  • 对审计配置的所有修改,以及对访问审计日志文件的尝试。
  • 所有身份验证机制的使用,如 SSH 和 Kerberos 等。
  • 对任何受信任数据库的修改,如 /etc/passwd。
  • 尝试将信息导入系统或从系统导出。
  • 根据用户身份、主题和对象标签以及其他属性包含或排除事件。

1.1. 使用案例

1.1.1. 监视文件访问

审计可以跟踪文件或目录是否已被访问、修改、执行或文件属性是否已被改变。例如,这有助于检测对重要文件的访问,并在其中一个文件损坏时提供审计跟踪。

1.1.2. 监控系统调用

可将审计配置为在每次使用特定系统调用时生成日志条目。例如,这可用于通过监控 settimeofday、clock_adjtime 和其他与时间相关的系统调用来跟踪对系统时间的修改。

1.1.3. 记录用户运行的命令

审计可以跟踪文件是否已被执行,因此可以定义一个规则以记录每次特定命令的执行。例如,可以对 /bin 目录中的每个可执行文件定义一个规则。然后,可以按用户 ID 搜索生成的日志条目,以生成每个用户所执行的命令的审计跟踪。

1.1.4. 记录系统路径名称的执行

除了观察在规则调用时将路径转换为 inode 的文件访问之外,审计现在还可以观察路径的执行,即使路径在规则调用中不存在,或者在规则调用后文件被替换了。这允许规则在升级程序可执行文件后或甚至在其安装之前继续运行。

1.1.5. 记录安全事件

pam_faillock 认证模块能够记录失败的登录尝试。也可以将审计设置为记录失败的登录尝试,并提供试图登录的用户的额外信息。

1.1.6. 搜索事件

审计提供了 ausearch 工具,可用于过滤日志条目,并根据多个条件提供完整的审计跟踪。

1.1.7. 运行总结报告

aureport 实用程序可用于生成记录事件的日常报告等。然后,系统管理员可以分析这些报告,并进一步调查可疑的活动。

1.1.8. 监控网络访问

nftables、iptables 和 ebtables 工具可以配置为触发审计事件,使系统管理员能够监控网络访问。

注意:系统性能可能会受到影响,具体取决于审计所收集的信息量。

2. Linux 审计组件简介

下图说明各审计组件相互之间的交互方式:

实线箭头表示组件之间的数据流,虚线箭头表示组件之间的控制线。

2.1. auditd

审计守护程序负责将通过审计内核接口生成并由应用程序和系统活动触发的审计消息写入磁盘。审计守护程序的启动方式由 systemd 控制。审计系统功能(启动后)由 /etc/audit/auditd.conf 控制。有关 auditd 及其配置的详细信息,请参见“配置审计守护程序”。

2.2. auditctl

auditctl 实用程序可控制审计系统。它可控制审计接口的日志生成参数和内核设置,以及用于确定要跟踪哪些事件的规则集。有关 auditctl 的详细信息,请参见“使用 auditctl 控制审计系统”。

2.3. 审计规则

/etc/audit/audit.rules 文件包含一系列 auditctl 命令,在系统引导时,启动审计守护程序后会紧接着装载这些命令。有关审计规则的详细信息,请参见“将参数传递到审计系统”。

2.4. aureport

aureport 实用程序可让您基于审计事件日志创建自定义报告。您可以轻松编写生成报告的脚本,而各种其他应用程序可以使用脚本的输出来绘制这些结果的图表以及执行其他操作。有关 aureport 的详细信息,请参见“了解审计日志和生成报告”。

2.5. ausearch

ausearch 实用程序可以使用所记录的格式的各种键或其他特征在审计日志文件中搜索特定的事件。有关 ausearch 的详细信息,请参见“使用 ausearch 查询审计守护程序日志”。

2.6. audispd

审计调度程序守护程序 (audispd) 可用于将事件通知中继到其他应用程序,而不是将其写入磁盘上的审计日志中(或除了执行此操作之外)。有关 audispd 的详细信息,请参见“中继审计事件通知”。

2.7. utrace

autrace 实用程序以类似于 strace 的方式跟踪单个进程。autrace 的输出将记录到审计日志。有关 autrace 的详细信息,请参见“使用 autrace 分析进程”。

2.8. aulast

列显最后几个登录用户的列表,类似于 lastaulast 在整个审计日志(或给定的审计日志文件)中向后搜索,并基于审计日志中的时间范围显示所有登录和注销用户的列表。

2.9. aulastlog

以类似于 lastlog 的方式列显所有计算机用户的上次登录信息。将列显登录名、端口和上次登录时间。

3. 配置审计守护程序

在您可以实际开始生成并处理审计日志之前,需先配置审计守护程序本身。/etc/audit/auditd.conf 配置文件确定审计系统在守护程序启动后的运行方式。对于大多数用例而言,SUSE Linux Enterprise Desktop 随附的默认设置应已足够。如果是 CAPP 环境,则需要调整其中的大部分参数。下面的列表简要介绍了可用参数:

log_file = /var/log/audit/audit.log
log_format = RAW
log_group = root
priority_boost = 4
flush = INCREMENTAL
freq = 20
num_logs = 5
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 6
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
##tcp_listen_port =
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
cp_client_max_idle = 0

3.1. log_file、log_format 和 log_group

log_file 指定审计日志应储存到什么位置。log_format 确定审计信息写入磁盘的方式,log_group 定义拥有日志文件的组。log_format 的可能的值为 raw(完全按照内核发送消息时的格式储存消息)或 nolog(丢弃消息,不将其写入磁盘)。如果您使用 nolog 模式,发送到审计调度程序的数据将不受影响。默认设置为 raw。如果您希望能够使用 aureportausearch 工具创建报告以及对审计日志进行查询,应保留该设置。可采用文本描述或使用组 ID 来指定 log_group 的值。

3.2. priority_boost

确定审计守护程序应获得的优先级提升量。可能的值为 0 到 20。最终合理的值按如下方式计算:0 - priority_boost

3.3. flush 和 freq

指定是否、如何以及以什么频率将审计日志写入磁盘。flush 的有效值为 noneincrementaldatasyncnone 告知审计守护程序将审计数据写入磁盘时无需进行特殊的操作。incremental 告知审计守护程序显式将数据刷写到磁盘。如果使用 incremental,则必须指定频率。freq 值 20 告知审计守护程序请求内核在每生成 20 条记录后将数据刷写到磁盘。data 选项始终将磁盘文件的数据部分保持同步,而 sync 选项会同时处理元数据和数据。

3.4. num_logs

指定当提供 rotate 作为 max_log_file_action 时要保留的日志文件数。可能的值为 0 到 99。小于 2 的值表示不轮换日志文件。如果增加要轮换的文件数,会增大审计守护程序所需的工作量。执行这种轮换时,auditd 无法始终快速地处理来自内核的新数据,这可能造成积压状况(触发 auditd 根据故障标志做出反应,如第 40.3 节 “使用 auditctl 控制审计系统”中所述)。在这种情况下,建议提高积压上限。为此,可以更改 /etc/audit/audit.rules 文件中 -b 参数的值。

3.5. disp_qos 和 dispatcher

审计守护程序在启动期间会启动调度程序。审计守护程序会将审计消息中继到 dispatcher 中指定的应用程序。此应用程序必须高度受信任,因为它需要以 root 身份运行。disp_qos 会确定是否允许在审计守护程序与调度程序之间进行 lossy(有损)或 lossless(无损)通讯。

如果您选择 lossy,当消息队列已满时,审计守护程序可能会丢弃一些审计消息。如果将 log_format 设为 raw,这些事件仍会写入磁盘,但可能不会传递到调度程序。如果您选择 lossless,将阻止审计记录到磁盘,直到消息队列中出现空位。默认值为 lossy

3.6. name_format 和 name

name_format 控制如何解析计算机名称。可能的值为 none(不使用名称)、hostname(gethostname 返回的值)、fqd(通过 DNS 查找接收的完全限定主机名)、numeric(IP 地址)和 useruser 是一个自定义字符串,需要使用 name 参数来定义。

3.7. max_log_file 和 max_log_file_action

max_log_file 接受数字值,该值指定在触发可配置的操作之前,日志文件可以达到的最大文件大小(以兆字节为单位)。要执行的操作在 max_log_file_action 中指定。max_log_file_action 的可能的值为 ignoresyslogsuspendrotatekeep_logsignore 告知审计守护程序在达到大小限制时不要执行任何操作,syslog 告知审计守护程序发出警告并将警告发送到系统日志,suspend 导致审计守护程序停止向磁盘写入日志,并使守护程序本身仍保持活动状态。rotate 使用 num_logs 设置触发日志轮换。keep_logs 也会触发日志轮换,但不使用 num_log 设置,因此始终保留所有日志。

3.8. space_left 和 space_left_action

space_left 接受表示剩余磁盘空间的数字值(以兆字节为单位),用于触发审计守护程序执行的可配置操作。该操作在 space_left_action 中指定。此参数的可能的值为 ignoresyslogemailexecsuspendsinglehaltignore 告知审计守护程序忽略警告且不执行任何操作,syslog 指示审计守护程序向系统日志发送警告,emailaction_mail_acct 下指定的帐户发送电子邮件。指定 exec 加上脚本路径会执行给定的脚本。请注意,您无法向脚本传递参数。suspend 告知审计守护程序停止写入磁盘但保持活动状态,而 single 会触发系统降级到单用户模式。halt 触发系统完全关闭。

3.9. action_mail_acct

指定应将任何警报消息发送到的电子邮件地址或别名。默认设置为 root,但只要在系统上正确配置了电子邮件和网络,并且 /usr/lib/sendmail 存在,您就可以输入任何本地或远程帐户。

3.10. admin_space_left 和 admin_space_left_action

admin_space_left 接受表示剩余磁盘空间的数字值(以兆字节为单位)。达到此限制意味着系统已出现磁盘空间不足的情况,管理员需抓住这个最后的机会对此警报做出反应,释放磁盘空间来保存审计日志。admin_space_left 的值应小于 space_left 的值。admin_space_left_action 的可能的值与 space_left_action 的相同。

3.11. disk_full_action

指定当系统耗尽了用于保存审计日志的磁盘空间时需要执行的操作。有效值为 ignoresyslogrotateexecsuspendsinglehalt。有关这些值的说明,请参见space_leftspace_left_action

3.12. disk_error_action

指定当审计守护程序在将日志写入磁盘或轮换日志期间遇到任何类型的磁盘错误时需要执行的操作。可能的值与 space_left_action 的相同。

3.13. tcp_listen_port、tcp_listen_queue、tcp_client_ports、tcp_client_max_idle 和 tcp_max_per_addr

该审计守护程序可以接收来自其他审计守护程序的审计事件。TCP 参数可让您控制传入连接。使用 tcp_listen_port 指定一个介于 1 到 65535 之间的端口,auditd 将监听该端口。tcp_listen_queue 可让您配置等待中连接数的最大值。确保不要将值设置得太小,因为在某些情况下(例如在断电后),等待中的连接数可能会很高。tcp_client_ports 定义允许哪些客户端端口。请指定单个端口,或以短划线分隔的数字指定端口范围(例如,1-1023 表示所有特权端口)。

指定单个允许的客户端端口可能导致客户端难以重启动其审计子系统,因为在连接关闭 TIME_WAIT 状态超时之前,客户端无法与同一主机地址和端口重新创建连接。如果客户端不再响应,auditd 将会控诉。请使用 tcp_client_max_idle 指定经过多少秒后将发生这种行为。请记住,此设置对所有客户端都有效,因此应高于任意单个客户端检测信号设置,最好是高两倍。tcp_max_per_addr 是表示允许从一个 IP 地址发出多少并发连接的数字值。

4. 使用 auditctl 控制审计系统

auditctl 负责控制审计守护程序的状态和某些基本系统参数。它控制对系统执行的审计量。auditctl 使用审计规则来控制系统的哪些组件需要接受审计及对其进行的审计范围。可在 auditctl 命令行中或者通过撰写规则集并指示审计守护程序处理此文件,将审计规则传递给审计守护程序。auditd 守护程序默认配置为检查 /etc/audit/audit.rules 下的审计规则。有关审计规则的更多细节,请参见第 40.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 更改状态标志时,都会列显一条状态消息(包括有关上述每个参数的信息)。下面的示例重点列出了典型的审计状态消息。

enabled 1
failure 1
pid 790
rate_limit 0
backlog_limit 64
lost 0
backlog 0
backlog_wait_time 15000
loginuid_immutable 0 unlocked
标志 含义 [可能的值] 命令
enabled 设置启用标志。[0..2] 0=禁用,1=启用,2=启用并锁定配置.请注意,此标志只禁用日志记录系统调用,系统仍会记录其他事件。(请参见 audit-devel 中的 man 3 audit_set_enabled。) auditctl -e [0 1 2]
flag 设置故障标志。[0..2] 0=静默,1=printk,2=恐慌(立即暂停且不将等待中数据同步到磁盘) auditctl -f [0 1 2]
pid 正在运行 auditd 的进程 ID。
rate_limit 设置每秒消息数上限。如果该值不为零且每秒消息数超过该上限,将触发故障标志中指定的操作。 auditctl -r RATE
backlog_limit 指定允许的未处理审计缓冲区的最大数目。如果所有缓冲区已满,将触发故障标志中指定的操作。 auditctl -b BACKLOG
lost 统计当前丢失的审计消息数。
backlog 统计当前未处理的审计缓冲区数。

5. 将参数传递到审计系统

您可以在shell中使用 auditctl 单独调用用于控制审计系统的命令,也可以使用 auditctl - R 从文件中批量读取此类命令。启动审计守护程序后,init 脚本会使用后一种方法从 /etc/audit/audit.rules 文件装载规则。规则按照从上到下的顺序执行。其中每条规则将扩展为单独的 auditctl 命令。规则文件中使用的语法与 auditctl 命令使用的语法相同。

5.1. 审计系统参数

通过在命令行上执行 auditctl 对运行中审计系统所做的更改在系统重启动后不会保留。要持久保留更改,请将更改添加到 /etc/audit/audit.rules 文件;如果更改当前尚未装载到审计中,请使用 systemctl restart auditd 命令重启动审计系统以装载修改后的规则集。

示例审计规则 — 审计系统参数

# 指定未处理审计缓冲区的最大数目。根据日志记录活动的级别,您可能需要调整缓冲区的数目,以免系统上的审计负载过于繁重。
-b 1000

# 指定要使用的故障标志。有关可能的值,请参见“审计状态标志”。
-f 1

# 指定内核每秒可发出的最大消息数目。有关详细信息,“审计状态标志”。
-r 10

# 启用或禁用审计子系统。
-e 1

5.2. 文件系统审计

使用审计,您可以跟踪以任何形式通过文件系统对重要文件、配置或资源进行的访问。您可以添加针对这些内容的监测项,并为每种监视项指派相应的键,以方便在日志中识别。

示例审计规则 — 文件系统审计

# -w 选项告知审计添加指定文件(在本例中为 /etc/shadow)的监测项。请求此文件访问权限的所有系统调用都将经过分析。
-w /etc/shadow

# 此规则添加对 /etc 目录的监测项,并对读取和执行此目录的访问操作应用权限过滤 (-p rx)。请求这两种权限中的任何一种权限的任何系统调用都将经过分析。系统仅将创建新文件和删除现有文件的操作记录为目录相关的事件。要获取此特定目录下各文件的更具体的事件,应该为每个文件单独添加一条规则。在添加包含文件监测项的规则之前,相应文件必须存在。不支持在创建文件时审计文件。
-w /etc -p rx

# 此规则向 /etc/passwd 添加一个文件监测项,并对读取、写入、执行和属性更改权限应用权限过滤。-k 选项可让您指定一个键,以便日后用来过滤此特定事件的审计日志(例如使用 ausearch 过滤)。您可对不同的规则使用相同的键,这样便能在搜索规则时将规则分组。还可以将多个键应用于一条规则。
-w /etc/passwd -k fk_passwd -p rwxa

5.3. 系统调用审计

系统调用审计甚至可让您以低于应用程序级别的级别来跟踪系统的行为。设计这些规则时,请考虑到审计大量系统调用可能会增加系统负载,并导致磁盘空间耗尽。请仔细考虑哪些事件需要跟踪,以及如何过滤事件才会使结果更具体。

示例审计规则 — 系统调用审计

# 此规则对 mkdir 系统调用激活审计。-a 选项会添加系统调用规则。每当输入 mkdir 系统调用(exit、always)时,此规则就会触发一个事件。-S 选项指定应对其应用此规则的系统调用。
-a exit,always -S mkdir

# 此规则添加对 access 系统调用的审计,但仅当该系统调用的第二个参数 (mode) 为 4 (R_OK) 时会进行审计。exit,always 告知审计在输入此系统调用时添加其审计环境,并在审计此系统调用后输出报告。
-a exit,always -S access -F a1=4

# 此规则添加 IPC 多路转换系统调用的审计环境。特定的 ipc 系统调用将作为第一个 syscall 参数传递,可使用 -F a0=IPC_CALL_NUMBER 选择该系统调用。
-a exit,always -S ipc -F a0=2

# 此规则审计失败的 open 调用尝试。
-a exit,always -S open -F success!=0

# 此规则是任务规则(关键字 task)的示例。它与上述其他规则的不同之处在于,它会应用于派生或克隆的进程。要过滤此类事件,您只能使用派生时已知的字段,例如 UID、GID 和 AUID。此示例规则过滤带有审计 ID 0 的所有任务。
-a task,always -F auid=0

# 最后这条规则使用了很多过滤器。所有过滤选项都与逻辑 AND 运算符相结合,表示此规则将应用于带有审计 ID 501、以 root 身份运行并使用 wheel 作为组的所有任务。系统会在用户登录时为某个进程分配审计 ID。然后,此 ID 将传给用户的初始进程所启动的任何子进程。即使用户更改其身份,审计 ID 也仍会保持不变,可用于跟踪原始用户的操作。
-a task,always -F uid=0 -F auid=501 -F gid=wheel

5.4. 删除审计规则和事件

您不仅可以将规则添加到审计系统,而且还可以去除规则。可通过不同的方法一次性删除整个规则集,或者删除系统调用规则或文件和目录监测项:

# 清除审计规则的队列并删除任何以前存在的规则。此规则用作 /etc/audit/audit.rules 文件中的第一条规则,可确保即将添加的规则不会与任何以前存在的规则相冲突。在执行 autrace 之前还需使用 auditctl -D 命令,以避免跟踪规则与 audit.rules 文件中存在的任何规则相冲突。
-D

# 此规则删除某个系统调用规则。-d 选项必须位于需要从规则队列中删除的任何系统调用规则的前面,并且必须完全匹配。
-d exit,always -S mkdir

# 此规则告知审计从规则队列中丢弃包含 /etc 目录监测项的规则。此规则删除任何包含 /etc 目录监测项的规则,而不管使用了哪种权限过滤或键选项。
-W /etc

5.5. 列出规则

要了解审计设置中当前使用了哪些规则,请运行 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

6. 了解审计日志和生成报告

要了解 aureport 实用程序的作用,必须知道审计守护程序所生成的日志的构造方式,以及审计针对事件具体会记录哪些内容。只有在获知这些信息后,您才能确定哪些报告类型最适合您的需求。

6.1. 了解审计日志

以下示例重点展示了审计所记录的两个典型事件,以及在审计日志中读取其追踪的方式。一个或多个(如果启用了日志轮换)审计日志储存在 /var/log/audit 目录中。第一个示例是个简单的 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 事件的目的是记录执行 syscall 时的当前工作目录。为传递给系统调用的每个路径生成了一个 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 系统调用,退出值为文件描述符编号。此值因系统调用而异。

a0a3

系统调用的前四个参数,采用数字格式。这些参数的值与系统调用相关。本示例(open 系统调用)中使用了以下值:

a0=62fb60 a1=8000 a2=31 a3=0

a0 是传递的路径名的起始地址。a1 是标志。以十六进制表示的 8000 转换为以八进制表示的 100000,后者又转换为 O_LARGEFILE。a2 是模式,由于未指定 O_CREAT,因此未使用此参数。open 系统调用未传递 a3。请查看相关系统调用的手册页,了解可与该系统调用搭配使用的参数。

items

传递给应用程序的字符串数。

ppid

所分析进程的父进程的 ID。

pid

所分析进程的 ID。

auid

审计 ID。系统会在用户登录时为某个进程分配审计 ID。然后,此 ID 将传给用户的初始进程所启动的任何子进程。即使用户更改了其身份(例如,变成了 root),审计 ID 也会保持不变。因此,您始终可以跟踪原始登录用户的操作。

uid

启动该进程的用户的 ID。在本例中,该 ID 为 0(表示 root)。

gid

启动该进程的用户的组 ID。在本例中,该 ID 为 0(表示 root)。

euidsuidfsuid

启动该进程的用户的有效用户 ID、设置的用户 ID 和文件系统用户 ID。

egidsgidfsgid

启动该进程的用户的有效组 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) 拥有读取访问权限,而其余的所有用户和组无法访问该文件。

ouidogid

表示 inode 本身的 UID 和 GID。

rdev

不适用于此示例。rdev 项仅适用于块设备或字符设备,不适用于文件。

“高级审计事件 — 通过 SSH 登录”重点展示了传入的 SSH 连接所触发的审计事件。大多数消息与 PAM 堆栈相关,反映 SSH PAM 进程的不同阶段。有几条审计消息带有嵌套的 PAM 消息,这些 PAM 消息表示已达到 PAM 进程的特定阶段。尽管审计会记录 PAM 消息,但它会为每个事件指派其自身的消息类型:

高级审计事件 — 通过 SSH 登录

# PAM 报告它已向远程主机(jupiter.example.com,192.168.2.100)成功请求对 root 用户进行身份验证。发生此操作的终端为 ssh。
type=USER_AUTH msg=audit(1234877011.791:7731): user pid=26127 uid=0 
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)'

# PAM 报告它已成功确定是否已授权用户登录。
type=USER_ACCT msg=audit(1234877011.795:7732): user pid=26127 uid=0 
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)'

# PAM 报告已获取用于登录的适当身份凭证,并且终端已变为正常终端 (/dev/pts0)。
type=CRED_ACQ msg=audit(1234877011.799:7733): user pid=26125 uid=0 
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)'

# PAM 报告它已成功为 root 打开会话。
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)'

# 用户已成功登录。此事件是 aureport -l 用来报告用户登录的事件。
type=USER_LOGIN msg=audit(1234877011.823:7736): user pid=26128 uid=0
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)'

# PAM 报告已成功重新获取身份凭证。
type=CRED_REFR msg=audit(1234877011.828:7737): user pid=26128 uid=0
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)'

6.2. 生成自定义审计报告

/var/log/audit 目录中储存的原始审计报告会逐渐变得很庞大且难以理解。要想更轻松地查找相关消息,请使用 aureport 实用程序并创建自定义报告。

以下用例重点展示了您可以使用 aureport 生成的几种可能的报告类型:

6.2.1. 从另一文件读取审计日志

当审计日志移到另一台计算机后,或者当您想要在本地计算机上分析多台计算机的日志,而又不想逐个连接其中每台计算机时,请将日志移到某个本地文件,然后在本地使用 aureport 分析这些日志:

aureport -if myfile

上述不带任何参数的 aureport 命令仅提供基于 myfile 中包含的日志生成的一般标准摘要报告。要创建更详细的报告,请将 -if 选项与下面的任何选项结合使用。例如,生成仅限特定时间范围的登录报告:

aureport -l -ts 14:00 -te 15:00 -if myfile

6.2.2. 将数字实体转换为文本

某些信息(例如用户 ID)将以数字形式列显。要将这些信息转换为直观易懂的文本格式,请在 aureport 命令中添加 -i 选项。

6.2.3. 创建粗略的摘要报告

如果您要关注当前的审计统计(事件、登录、进程等),请运行不带任何其他选项的 aureport

6.2.4. 创建失败事件的摘要报告

如果您要将单纯的 aureport 命令所提供的总体统计细分为失败事件的统计,请使用 aureport --failed

6.2.5. 创建成功事件的摘要报告

如果您要将单纯的 aureport 命令所提供的总体统计细分为成功事件的统计,请使用 aureport --success

6.2.6. 创建摘要报告

除了专用摘要报告(主要事件摘要,以及失败和成功事件摘要),还可以将 --summary 选项与大多数其他选项结合使用,以仅创建特定关注方面的摘要报告。不过,并非所有报告都支持此选项。下面的示例创建了用户登录事件的摘要报告:

aureport -e -ts 14:00 -te 14:21

6.2.7. 基于所有进程事件创建报告

要从进程的角度分析日志,请使用 aureport -p 命令。此命令会生成所有进程事件的带编号列表,其中包含日期、时间、进程 ID、可执行文件的名称、系统调用、审计 ID 和事件编号。

6.2.8. 基于所有系统调用事件创建报告

要从系统调用的角度分析审计日志,请使用 aureport -s 命令。此命令会生成所有系统调用事件的带编号列表,其中包含日期、时间、系统调用的编号、进程 ID、使用此调用的命令的名称、审计 ID 和事件编号。

6.2.9. 基于所有可执行文件事件创建报告

要从可执行文件的角度分析审计日志,请使用 aureport -x 命令。此命令会生成所有可执行文件事件的带编号列表,其中包含日期、时间、可执行文件的名称、运行可执行文件的终端、执行可执行文件的主机、审计 ID 和事件编号。

6.2.10. 创建有关文件的报告

要基于审计日志生成侧重于文件访问的报告,请使用 aureport -f 命令。此命令会生成所有文件相关事件的带编号列表,其中包含日期、时间、所访问的文件的名称、访问文件的系统调用的编号、命令的成功或失败结果、访问文件的可执行文件、审计 ID 和事件编号。

6.2.11. 创建有关用户的报告

要基于审计日志生成用于说明哪些用户正在您的系统上运行哪些可执行文件的报告,请使用 aureport -u 命令。此命令会生成所有用户相关事件的带编号列表,其中包含日期、时间、审计 ID、使用的终端、主机、可执行文件的名称和事件 ID。

6.2.12. 创建有关登录的报告

要创建重点统计登录您计算机的尝试的报告,请运行 aureport -l 命令。此命令会生成所有登录相关事件的带编号列表,其中包含日期、时间、审计 ID、使用的主机和终端、可执行文件的名称、尝试的成功或失败结果,以及事件 ID。

6.2.13. 将报告范围限制在特定的时间范围

要分析特定时间范围的日志(例如,仅分析 2009 年 2 月 16 日工作时间的日志),请先运行 aureport -t 来确定这些数据是否包含在当前的 audit.log 中,或者日志是否已进行了轮换。

当前的 audit.log 包含所有所需的数据。如果情况并非如此,请使用 -if 选项将 aureport 命令指向包含所需数据的日志文件。

然后指定所需时间范围的开始与结束日期和时间,并将其与所需的报告选项结合使用。本示例重点统计登录尝试:

aureport -ts 02/16/09 8:00 -te 02/16/09 18:00 -l

开始日期和时间是使用 -ts 选项指定的。时戳等于或晚于给定开始时间的任何事件都会显示在报告中。如果省略日期,aureport 将假设您指的是今天。如果省略时间,它会假设开始时间是指定日期的午夜。

使用 -te 选项指定结束日期和时间。时戳等于或早于给定事件时间的任何事件都会显示在报告中。如果省略日期,aureport 将假设您指的是今天。如果省略时间,它会假设结束时间是现在。请使用与 -ts 相同的日期和时间格式。

除摘要报告以外的所有报告将以列格式列显并发送到 STDOUT,这意味着,这些数据可以十分轻松地写入到其他命令。

7. 使用 ausearch 查询审计守护程序日志

aureport 工具可帮助您创建有关系统上发生的情况的总体摘要,但如果您要了解特定事件的细节,可以使用 ausearch 工具。

ausearch 可让您使用特殊的键和搜索短语搜索审计日志,这些键和短语与 /var/log/audit/audit.log 中的事件消息内显示的大多数标志相关。并非所有记录类型都包含相同的搜索短语。例如,PATH 记录中就不包含 hostnameuid 项。

搜索时,请确保选择适当的搜索准则来捕获所需的所有记录。另一方面,您在搜索特定类型的记录时,可能会随其一并获取相关的其他各种记录。之所以会这样,是因为内核的不同组件会提供与所要查找的记录相关的其他事件记录。例如,对于 open 系统调用,您在获取 SYSCALL 记录的同时始终会获取一条 PATH 记录。

提示:您可将任何命令行选项与 AND 逻辑运算符相结合,以缩小搜索范围。

7.1. 从另一文件读取审计日志

将审计日志移到另一台计算机后,或者当您想要在本地计算机上分析多台计算机的日志,而又不想逐个连接其中每台计算机时,请将日志移到某个本地文件,然后在本地使用 ausearch 搜索这些日志:

ausearch - option -if myfile

7.2. 将数字结果转换为文本

某些信息(例如用户 ID)将以数字形式列显。要将这些信息转换为直观易懂的文本格式,请在 ausearch 命令中添加 -i 选项。

7.3. 按审计事件 ID 搜索

如果您先前运行了审计报告或执行了 autrace,则应分析日志中特定事件的追踪。“了解审计日志和生成报告”中所述的大多数报告类型都会在其输出中包含审计事件 ID。审计事件 ID 是审计消息 ID 的第二部分,后者由 Unix 纪元时戳和审计事件 ID 构成(以冒号分隔)。所记录的来自一个应用程序系统调用的所有事件都具有相同的事件 ID。在 ausearch 中使用此事件 ID 可以从日志中检索此事件的追踪。

使用如下所示的命令:

ausearch -a 5207

ausearch -a 命令会抓取并显示日志中与所提供审计事件 ID 相关的所有记录。此选项可与任何其他选项结合使用。

7.4. 按消息类型搜索

要搜索特定消息类型的审计记录,请使用 ausearch -m MESSAGE_TYPE 命令。有效消息类型的示例包括 PATHSYSCALLUSER_LOGIN。运行不带消息类型的 ausearch -m 会显示所有消息类型的列表。

7.5. 按登录 ID 搜索

要查看与特定登录用户 ID 关联的记录,请使用 ausearch -ul 命令。此命令显示与指定的用户登录 ID 相关的所有记录,前提是该用户过去能够成功登录。

7.6. 按用户 ID 搜索

使用 ausearch -ua 查看与任何用户 ID(用户 ID 和有效用户 ID)相关的记录。使用 ausearch -ui UID 查看与特定用户 ID 相关的报告。要搜索与特定有效用户 ID 相关的记录,请使用 ausearch -ue EUID。搜索用户 ID 是指搜索创建进程的用户的 ID。搜索有效用户 ID 是指搜索该用户 ID 以及运行此进程所需的特权。

7.7. 按组 ID 搜索

使用 ausearch -ga 命令查看与任何组 ID(组 ID 和有效组 ID)相关的记录。使用 ausearch -gi GID 查看与特定用户 ID 相关的报告。要搜索与特定有效组 ID 相关的记录,请使用 ausearch -ge EGID

7.8. 按命令行名称搜索

使用 ausearch -c COMM_NAME 命令查看与特定命令相关的记录,例如,使用 ausearch -c less 可查看与 less 命令相关的所有记录。

7.9. 按可执行文件名搜索

使用 ausearch -x EXE 命令查看与特定可执行文件相关的记录,例如,使用 ausearch -x /usr/bin/less 可查看与 /usr/bin/less 可执行文件相关的所有记录。

7.10. 按系统调用名称搜索

使用 ausearch -sc SYSCALL 命令查看与特定系统调用相关的记录,例如,使用 ausearch -sc open 可查看与 open 系统调用相关的所有记录。

7.11. 按进程 ID 搜索

使用 ausearch -p PID 命令查看与特定进程 ID 相关的记录,例如,使用 ausearch -p 13368 可查看与此进程 ID 相关的所有记录。

7.12. 按事件或系统调用成功值搜索

使用 ausearch -sv SUCCESS_VALUE 查看包含特定系统调用成功值的记录,例如,使用 ausearch -sv yes 可查看所有成功的系统调用。

7.13. 按文件名搜索

使用 ausearch -f FILE_NAME 查看包含特定文件名的记录,例如,使用 ausearch -f /foo/bar 可查看与 /foo/bar 文件相关的所有记录。您也可以仅使用文件名,但不能使用相对路径。

7.14. 按终端搜索

使用 ausearch -tm TERM 查看仅与特定终端相关的记录,例如,使用 ausearch -tm ssh 可查看与 SSH 终端上的事件相关的所有记录,使用 ausearch -tm tty 可查看与该控制台相关的所有事件。

7.15. 按主机名搜索

使用 ausearch -hn HOSTNAME 查看与特定远程主机名相关的记录,例如,使用 ausearch -hn jupiter.example.com 可查看与该主机名相关的所有记录。可以使用主机名、完全限定的域名或数字格式的网络地址。

7.16. 按键字段搜索

查看包含审计规则集中指派的特定键(用于识别特定类型的事件)的记录。相关命令为 ausearch -k KEY_FIELD。例如,使用 ausearch -k CFG_etc 可显示包含 CFG_etc 键的所有记录。

7.17. 按字词搜索

查看包含审计规则集中指派的特定字符串(用于识别特定类型的事件)的记录。整个字符串将与文件名、主机名和终端进行匹配。相关命令为 ausearch -w WORD

7.18. 将搜索范围限制在特定的时间范围

使用 -ts-te 可将搜索范围限制在特定的时间范围。-ts 选项用于指定开始日期和时间,-te 选项用于指定结束日期和时间。这些选项可与上面所述的任何选项结合使用。这些选项的用法与在 aureport 中的用法类似。

8. 使用 autrace 分析进程

除了使用设置的规则监视系统以外,您还可以使用 autrace 命令对各个进程执行专门的审计。autrace 的工作方式类似于 strace,但它收集的信息略有不同。autrace 的输出将写入到 /var/log/audit/audit.log,看上去与标准审计日志项并无任何不同。
对进程执行 autrace 时,请确保从队列中清除所有审计规则,以免这些规则与 autrace 本身添加的规则相冲突。使用 auditctl -D 命令删除审计规则。这会停止所有一般审计。

请一律使用要通过 autrace 跟踪的可执行文件的完整路径。完成跟踪后,autrace 会提供跟踪的事件 ID,因此您可以使用 ausearch 分析整个数据追踪。要将审计系统恢复为重新使用审计规则集,请使用 systemctl restart auditd 重启动审计守护程序。

届ける言葉を今は育ててる
最后更新于 2022-06-27