Linux之(6)Audit审计子系统

Linux之(6)Audit审计子系统

Author:OnceDay Date:2023年10月6日

全系列文章请查看专栏: Linux Shell基础_Once_day的博客-CSDN博客

漫漫长路,有人对你微笑过嘛…

参考文档:

1.概述

详情可参考: linux audit审计系统- 小乐叔叔 - 知乎 (zhihu.com)

linux audit子系统是一个用于收集记录系统、内核、用户进程发生的行为事件的一种安全审计系统。该系统可以可靠地收集有关上任何与安全相关(或与安全无关)事件的信息,它可以帮助跟踪在系统上执行过的一些操作。

linux审计系统可以通过提供系统上事件详细信息,来提高系统的安全性。但是它并不能像selinux那样为系统提供额外的安全性包含措施。审核仅需要为user提供系统上发生的event细节,user根据这些信息追踪event并采取相应的其他安全措施。

audit和syslog有本质区别。syslog记录的信息有限,主要目的是软件调试,对于用户的操作行为(如某用户修改删除了某文件)却无法通过这些日志文件来查看。而audit的目的则不同,它是linux安全体系的重要组成部分,是一种“被动”的防御体系。

在内核里有内核审计模块,记录系统中的各种动作和事件,比如系统调用,文件修改,执行的程序,系统登入登出和记录所有系统中所有的事件,它的主要目的是方便管理员根据日记审计系统是否允许有异常,是否有入侵等等,说穿了就是把和系统安全有关的事件记录下来。

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

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

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

(1) 监视文件访问

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

(2) 监控系统调用

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

(3) 记录用户运行的命令

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

(4) 记录系统路径名称的执行

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

(5) 记录安全事件

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

(6) 监控网络访问

iptables andebtables 实用程序可以配置为触发审计事件,使系统管理员能够监控网络访问。

1.2 辅助命令

audit常用命令:

  • auditctl,audit系统管理工具,用来获取状态,增加删除监控规则。
  • ausearch,查询audit log工具,可用于过滤日志条目并根据多个条件提供完整的审计跟踪。
  • aureport,输出audit系统报告。
1.3 相关配置

内核编译需要开启 CONFIG_AUDIT 、CONFIG_AUDITSYSCAL(如果没有配置,无法审计系统调用)配置。

cmdline中加上“audit= 1”开启,审计日志会被写到/var/log/messages中(auditd守护进程没有运行时),如果没有cmdline使能,部分守护进程可能逃脱audit,因为此时audit状态可能还没有准备好。

用户空间配置audit,需要安装auditd,然后使用systemctl开启auditd服务即可:

apt install auditd

开启auditd服务之后,相关的日志记录位置为/var/log/audit/audit.log

auditd有两个配置文件,位置如下:

/etc/audit/auditd.conf # 守护程序的默认配置文件
/etc/audit/audit.rules # 记录审计规则的文件

规则配置文件写在audit.rules里面是持久生效,通过auditctl直接配置,是临时生效。

2. 详细介绍
2.1 用户空间守护进程auditd
auditd [-f] [-l] [-n] [-s disable|enable|nochange] [-c <config_dir>]

auditd 是 Linux 审计系统的用户空间组件,负责将审计记录写入磁盘。查看日志则需要使用 ausearchaureport 工具。使用 auditctl 工具来配置审计系统或加载规则。在启动过程中,auditctl 会读取 /etc/audit/audit.rules 中的规则,并将其加载到内核中。另外,还有一个 augenrules 程序可以读取位于 /etc/audit/rules.d/ 中的规则,并将它们编译成一个 audit.rules 文件。管理员可能希望自定义审计守护进程本身的一些配置选项,这些选项可以在 auditd.conf 文件中找到。

在这个过程中:

  • auditd:是负责将审计记录写入磁盘的用户空间组件。
  • ausearchaureport:是用于查看审计日志的工具。
  • auditctl:是用于配置审计系统或加载审计规则的工具。
  • /etc/audit/audit.rules:是在系统启动时,auditctl 读取并加载到内核的审计规则文件。
  • augenrules:是一个专门用于读取 /etc/audit/rules.d/ 目录中的规则,并将它们编译成 audit.rules 文件的程序。
  • auditd.conf:是包含了管理员可能希望自定义的审计守护进程配置选项的文件。

以下是一些 auditd 命令行选项的中文描述

  • -f:将审计守护进程留在前台进行调试。消息也会发送到 stderr,而不是审计日志。

  • -l:允许审计守护进程跟踪配置文件的符号链接。

  • -n:不进行 fork。这对于从 inittab 或 systemd 运行很有用。

  • -s=ENABLE_STATE:指定在启动时,是否应让 auditd 更改内核启用标志的当前值。ENABLE_STATE 的有效值为 “disable”(禁用)、“enable”(启用)或 “nochange”(不更改)。默认为启用(并在 auditd 终止时禁用)。可以在 auditd 的生命周期内使用'auditctl -e'更改启用标志的值。

  • -c:指定替代的配置文件目录。注意,这个目录也会传递给auditd。(默认目录为:/etc/audit/

以下是一些 auditd 命令接收的信号及其相应的行为

  • SIGHUP:导致 auditd 重新配置。也就是说,auditd 会重新读取配置文件。如果没有语法错误,它会继续执行请求的更改。如果重新配置成功,会在日志中记录一个 DAEMON_CONFIG 事件。如果不成功,错误处理由 auditd.conf 中的 space_left_actionadmin_space_left_actiondisk_full_actiondisk_error_action 参数控制。

  • SIGTERM:导致 auditd 停止处理审计事件,写入一个关机审计事件,然后退出。

  • SIGUSR1:导致 auditd 立即轮换日志。它将查阅 max_log_file_action,以确定是否应保留日志。

  • SIGUSR2:导致 auditd 尝试恢复日志记录并将事件传递给插件(plugin)。当日志记录已被暂停或内部队列溢出时,通常需要此操作。这两种情况都取决于适用的配置设置。

  • SIGCONT:导致 auditd 将内部状态的报告转储到 /var/run/auditd.state

下面是SIGCONT输出的auditd内部状态数据:

# cat /var/run/auditd.state 
time = 10/06/23 16:41:04
writing to logs = yes
current log size = 5553562
max log size = 8192 KB
space left on partition = yes
Logging partition free space 731 MB
space_left setting 75 MB
admin_space_left setting 50 MB
logging suspended = no
file system space warning sent = no
admin space warning sent = no
disk error detected = no
dispatcher pid = 0
listening for network connections = no

以下是 auditd 的一些退出状态代码及其含义

  • 1:无法调整优先级,守护进程化,打开审计 netlink,写入 pid 文件,启动插件,解析机器名称,设置审计 pid,或执行其他初始化任务。

  • 2:命令行参数无效或过多。

  • 4:审计守护进程没有足够的权限。

  • 6:配置文件中存在错误。

以下是 auditd 使用的一些重要的文件和目录及其在中文中的描述

  • /etc/audit/auditd.conf:审计守护进程的配置文件。

  • /etc/audit/audit.rules:在启动时加载的审计规则。

  • /etc/audit/rules.d/:此目录保存了要由 augenrules 编译为一个文件的各个规则集。

  • /etc/audit/plugins.d/:此目录保存了各个插件的配置文件。

  • /etc/audit/audit-stop:这些规则在审计守护进程停止时被加载。

  • /var/run/auditd.state:关于内部状态的报告。

以下是一些关于 auditd 的额外注意事项

  • 应添加一个 audit=1 的引导参数,以确保在审计守护进程启动之前运行的所有进程都被内核标记为可审计的。如果不这样做,将会使得一些进程无法被正确地审计。

  • 审计守护进程可以通过 audisp-remote 插件从其他审计守护进程接收审计事件。审计守护进程可能与 tcp_wrappers 链接,以控制哪些机器可以连接。如果是这种情况,你可以在 hosts.allowdeny 中添加一个条目。

2.2 配置工具(auditctl)

auditctl程序用于配置与审计相关的内核选项,查看配置状态,并加载自定义的审计规则。

以下是auditctl的配置类命令参数选项(configuration options):

选项描述
-b backlog设置允许的最大审计缓冲区数量(内核默认值=64)。如果所有缓冲区都满了,内核会查阅失败标志以确定行动。
–backlog_wait_time wait_time设置当达到积压限制时,内核在队列中等待更多审计事件传输到auditd之前的等待时间(内核默认值是60*HZ)。这个数字必须大于或等于零,小于默认值的10倍。
–reset_backlog_wait_time_actual重置由状态命令显示的实际积压等待时间计数器。
-c尽管出现错误,仍继续加载规则。这将汇总加载规则的结果。如果任何规则加载失败,退出代码将不会是成功。
-D删除所有规则和监视。这也可以使用键选项(-k)。
-e [0…2]设置启用标志。当传递0时,可以用来临时禁用审计。当传递1作为参数时,它将启用审计。要锁定审计配置以使其无法更改,将2作为参数传递。锁定配置的意图是作为任何希望此功能活动的人的audit.rules中的最后一个命令。在此模式下,任何尝试更改配置的行为都将被审计并拒绝。配置只能通过重启机器来更改。
-f [0…2]设置失败模式: 0=静默, 1=printk, 2=panic。这个选项让你决定你希望内核如何处理关键错误。可能会影响此模式的示例条件包括:传输错误到用户空间审计守护程序,超过积压限制,内核内存不足,和超过速率限制。默认值是1。安全环境可能会希望将此设置为2。
-h输出帮助信息
-i当单独给出时,忽略从文件中读取规则时的错误。这使得auditctl始终返回一个成功的退出代码。如果作为-s的参数传递,则尽可能地将数字解释为人类可读的单词。
–loginuid-immutable此选项告诉内核一旦设置了loginuid,就使其不可更改。更改loginuid需要CAP_AUDIT_CONTROL。因此,这不是非特权用户可以做的事情。设置这个选项可以使loginuid防篡改,但在某些类型的容器中可能会导致一些问题。
-q mount-point,subtree如果你有一个现有的目录监视,并在被监视的子树中绑定或移动挂载另一个子树,你需要告诉内核使被挂载的子树等同于被监视的目录。如果在发出目录监视指令时,子树已经被挂载,那么子树将自动被标记为监视。请注意,两个值之间的逗号。省略它将导致错误。
-r rate设置以消息/秒为单位的限制(0=无)。如果这个频率不为零,并且超过了这个频率,内核会查阅失败标志以确定行动。默认值是0。
–reset-lost重置由状态命令显示的丢失记录计数器。
-R file从文件中读取并执行auditctl命令。命令按照它们在文件中出现的顺序逐行执行。文件必须由root拥有,并且不能被其他用户读取,否则将被拒绝。空行将被跳过。以’#'字符开头的行被视为注释行。每一行都被执行,就好像它是提供给auditctl作为命令行参数的一样。由于auditctl是在读取文件,而不是像bash这样的shell,所以不要转义特殊的shell字符。查看EXAMPLES部分以获取示例。
–signal signal向审计守护程序发送信号。你必须有权限这样做。支持的信号有TERM、HUP、USR1、USR2、CONT,即对应stop、reload、rotate、resume、state这几个操作。
-t在mount命令之后修剪子树。

以下是auditctl的状态类命令参数选项(status options):

参数描述
-l每行列出所有规则。此命令可以给出两个更多的选项。你可以给出一个键选项(-k)来列出匹配键的规则,或者一个(-i)来解释a0至a3,以帮助确定系统调用参数值是否正确。
-m text将用户空间消息发送到审计系统中。只有当你具有CAP_AUDIT_WRITE能力(通常是root用户具有此能力)时,才能做到这一点。结果事件将是USER类型。
-s报告内核的审计子系统状态。它将告诉你可以通过-e、-f、-r和-b选项设置的内核中的值。pid值是审计守护进程的进程号。注意,pid为0表示审计守护进程没有运行。lost条目将告诉你由于内核审计队列溢出而丢弃了多少事件记录。backlog字段告诉你当前有多少事件记录在队列中等待auditd读取。此选项可以后跟-i,以获取一些字段的解释。
-v打印auditctl的版本。

以下是auditctl的规则类命令参数选项(status options):

参数描述
-a用于在具有指定动作的列表末尾添加规则。你需要注意两个值之间的逗号,省略它将会引发错误。这两个字段可以按任意顺序给出,可以是list,action也可以是action,list
-A list,action将规则与行动添加到列表的开始。
-C [f=f | f!=f]构建一个内部字段比较规则:字段,操作,字段。你可以在一条命令行上传递多个比较。每个比较都必须以 -C 开始。每个内部字段等式都与以 -F 开始的等式以及其他字段等式进行与运算,以触发审计记录。支持两种操作符 - 相等和不等。有效字段包括:auid, uid, euid, suid, fsuid, obj_uid;以及 gid, egid, sgid, fsgid, obj_gid。uid 和 gid 的两组不能混合。但是,组内的任何比较都可以进行。obj_uid/gid 字段是从事件的对象(如文件或目录)中收集的。
-d list,action从具有行动的列表中删除规则。只有当它与系统调用名称和每个字段名称和值完全匹配时,规则才会被删除。
-F [n=v | n!=v | n<v | n>v | n<=v | n>=v | n&v | n&=v]构建一个规则字段:名称,操作,值。你可以在一条命令行上传递最多64个字段。每个字段都必须以 -F 开始。每个字段等式都与彼此(以及以 -C 开始的等式)进行与运算,以触发审计记录。支持8种操作符 - 等于、不等于、小于、大于、小于或等于、大于或等于、位掩码和位测试。位测试将对值进行 “与” 操作并检查它们是否相等,位掩码只会对值进行 “与” 操作。接受用户ID的字段可能会使用用户的名称;程序将把名称转换为用户ID。对群组名称也是如此。
-k key在审计规则上设置一个过滤键。过滤键是一个可以长达31字节的任意文本字符串。可以唯一地识别由规则生成的审计记录。典型的用途是当你有几个规则一起满足一个安全需求时。可以用ausearch在键值上进行搜索,这样无论哪个规则触发了事件,你都可以找到它的结果。键也可以在删除所有 (-D) 和列出规则 (-l) 时使用,以选择具有特定键的规则。如果你希望能够以多种方式搜索记录的事件,或者你有一个使用键来帮助其分析的auditd插件,那么你可以在一个规则上有多个键。
-p [r|w|x|a]描述文件系统监视器将触发的权限访问类型。r=read(读),w=write(写),x=execute(执行),a=attribute change(属性更改)。这些权限不是标准的文件权限,而是会执行此类操作的系统调用的类型。由于读和写的系统调用会使日志过于庞大,因此从此集合中省略了它们。而是查看打开文件的标志,看看请求了什么权限。
-S [Syscall name or number|all]可以使用任何系统调用名称或编号。也可以使用单词 ‘all’。如果程序进行了给定的系统调用,那么开始一个审计记录。如果给出了一个字段规则,但没有指定系统调用,那么它将默认为所有系统调用。你也可以在同一规则中使用多个 -S 选项来指定多个系统调用。这样做可以提高性能,因为需要评估的规则更少。另外,你也可以传递一个由逗号分隔的系统调用名称列表。如果你在一个双架构系统上,比如x86_64,你应该注意到auditctl只是接收文本,查找本地架构(在这种情况下是b64)并将该规则发送给内核。如果没有额外的架构指令,它将适用于32位和64位的系统调用。这可能会有不良的影响,因为不能保证任何系统调用在32位和64位接口上都有相同的编号。你可能会想要控制这个,并写两个规则,一个架构等于b32,另一个等于b64,以确保内核找到你打算的事件。请参阅上面关于arch字段的讨论以获取更多信息。
-w path-w path 用于在指定的路径上设置一个监视点。你不能在顶级目录上设置监视点,因为这是内核所禁止的。这个选项也不支持使用通配符,如果尝试使用通配符,将会产生一个警告。监视点的工作方式是通过内部跟踪 inode。如果你在一个文件上设置了监视点,那么就等同于在系统调用规则上使用 -F path 选项。如果你在一个目录上设置了监视点,那么就等同于在系统调用规则上使用 -F dir 选项。-w 的形式是为了向后兼容,而基于系统调用的形式更具有表达力。与大多数系统调用审计规则不同,监视点的数量不会影响性能。使用监视点时,唯一有效的选项是 -p-k。如果你需要执行一些复杂的操作,比如审计特定用户访问文件,那么你应该使用带有路径或目录字段的系统调用审计形式。
-W path用于移除指定路径上的监视点。规则必须完全匹配。更多信息请参考 -d 选项的讨论

对于-a [list,action|action,list], list可选项如下:

字段描述
task在任务创建列表中添加一条规则。这个列表只在任务创建时使用 – 即当父任务调用 fork() 或 clone() 时。使用这个列表时,你应该只使用在任务创建时就已知的字段,例如 uid、gid 等。
exit在系统调用退出列表中添加一条规则。这个列表在从系统调用退出时使用,以确定是否应创建一个审计事件。
user在用户消息过滤器列表中添加一条规则。这个列表由内核使用,用于在将事件从用户空间中传递到审计守护程序之前过滤这些事件。需要注意的是,唯一有效的字段是:uid, auid, gid, pid, subj_user, subj_role, subj_type, subj_sen, subj_clr, msgtype 以及可执行程序名。所有其他字段都将被视为不匹配。应该明白的是,任何来自拥有 CAP_AUDIT_WRITE 权限的进程的用户空间事件都将被记录到审计轨迹中。这意味着,这个过滤器最可能的用途是与动作为"never"的规则一起使用,因为不需要做任何事情就可以允许事件被记录。
exclude在事件类型排除过滤器列表中添加一条规则。这个列表用于过滤你不想看到的事件。例如,如果你不想看到任何 avc 消息,你可以使用这个列表来记录。事件可以通过进程 ID、用户 ID、组 ID、登录用户 ID、消息类型、主题上下文或可执行程序名进行排除。动作被忽略,并使用其默认的 “never”。
filesystem添加一个将应用于整个文件系统的规则。文件系统必须用 fstype 字段来标识。通常,此过滤器用于排除整个文件系统(如 tracefs 或 debugfs)的任何事件。
io_uring在 io_uring 系统调用过滤器中添加一条规则。这种过滤器的规则使用下面解释的 -S 系统调用概念来指定系统调用操作。你可以向规则中添加一个 key 字段,以便它可以与观察同一底层系统调用的其他规则一起分组。

action可选项如下:

  • never:不会生成审计记录。这可以用来抑制事件生成。一般来说,你会希望在列表顶部而不是底部进行抑制。这是因为事件在第一个匹配规则上触发。
  • always:分配一个审计上下文,在系统调用入口时始终填充它,并在系统调用退出时始终写出记录。

对于-F [n=v | n!=v | n<v | n>v | n<=v | n>=v | n&v | n&=v],可选的字段如下:

参数描述
a0, a1, a2, a3分别对应于系统调用的前四个参数。请注意,不支持字符串参数。这是因为内核传递了指向字符串的指针。在指针地址值上触发可能无法工作。所以,使用这个时,你应该只在数字值上使用。这最有可能在多路复用套接字或IPC操作的平台上使用。
arch系统调用的CPU架构。可以通过执行 ‘uname -m’ 找到架构。如果你不知道你的机器的架构,但是你想使用32位系统调用表,并且你的机器支持32位,你也可以使用b32作为架构。同样适用于64位系统调用表,你可以使用b64。这样,你就可以编写在某种程度上独立于架构的规则,因为将自动检测到家族类型。然而,请注意,系统调用可以是特定于架构的,x86_64上的可用系统调用可能在ppc上不可用。arch指令应该在-S选项之前,这样auditctl知道要使用哪个内部表来查找系统调用号。
auid用户原始登录ID。它是audit uid的缩写。有时也被称为loginuid。可以使用用户帐户文本或数字。
devmajor设备主要号码。
devminor设备次要号码。
dir要监视的目录的完整路径。这将在目录及其所有子树上放置递归监视。它只能在退出列表上使用。参见 “-w”。
egid有效组ID。可能是数字或组名。
euid有效用户ID。可能是数字或用户帐户名。
exe应用程序的绝对路径,当执行此规则时,将应用到这个应用程序。它支持 = 和 != 操作符。请注意,每个规则只能使用一次。
exit系统调用的退出值。如果退出代码是一个错误号,也可以使用文本表示。
fsgid文件系统组ID。可能是数字或组名。
fstype文件系统类型。这是与文件系统规则列表一起使用的。唯一支持的值是debugfs和tracefs。
fsuid文件系统用户ID。可能是数字或用户帐户名。
filetype目标文件的类型。可以是文件,目录,套接字,链接,字符,块或fifo。
gid组ID。可能是数字或组名。
inodeInode号码。
key这是设置过滤键的另一种方法。参见上面关于 -k 选项的讨论。
msgtype用于匹配事件的记录类型。它应该只在排除或用户过滤列表上使用。
obj_uid对象的UID。
obj_gid对象的GID。
obj_user资源的SE Linux用户。
obj_role资源的SE Linux角色。
obj_type资源的SE Linux类型。
obj_lev_low资源的SE Linux低级别。
obj_lev_high资源的SE Linux高级别。
path要监视的文件的完整路径。它只能在退出列表上使用。
perm文件操作的权限过滤器。参见 “-p”。它只能在退出列表上使用。你可以在不指定系统调用的情况下使用它,内核将选择满足所请求权限的系统调用。
pers操作系统个性号。
pid进程ID。
ppid父进程ID。
saddr_fam在/usr/include/bits/socket.h中找到的地址族号。例如,IPv4将是2,IPv6将是10。
sessionid用户的登录会话ID。
subj_user程序的SE Linux用户。
subj_role程序的SE Linux角色。
subj_type程序的SE Linux角色。
subj_sen程序的SE Linux敏感性。
subj_clr程序的SE Linux清除。
sgid保存的组ID。请参阅getresgid(2)手册页。
success如果退出值>= 0,这是true/yes,否则是false/no。编写规则时,使用1表示true/yes,使用0表示false/no。
suid保存的用户ID。请参阅getresuid(2)手册页。
uid用户ID。可能是数字或用户帐户名。
2.3 配置规则和性能影响

系统调用规则对每个程序的每个系统调用进行评估。如果你有10个系统调用规则,你系统中的每个程序在进行系统调用时都会因审计系统评估每个规则而延迟。太多的系统调用规则会影响性能。尽可能试图合并那些过滤器、动作、键和字段都相同的规则。例如:

auditctl -a always,exit -F arch=b64 -S openat -F success=0
auditctl -a always,exit -F arch=b64 -S truncate -F success=0

可以被重写为一个规则:

auditctl -a always,exit -F arch=b64 -S openat -S truncate -F success=0

此外,尽可能使用文件系统审计,这会提高性能。例如,如果你想捕获所有失败的 open 和 truncate 操作,但只关心/etc目录中的文件,不关心/usr/sbin,那么可以使用如下规则:

auditctl -a always,exit -S openat -S truncate -F dir=/etc -F success=0

这将具有更高的性能,因为内核不会在每个系统调用时都评估它。这将由文件系统审计代码处理,并且只在与文件系统相关的系统调用时进行检查。

以下是一些使用 auditctl 命令来进行审计的示例:

若要查看特定程序发出的所有系统调用:

# 通过pid:
auditctl -a always,exit -S all -F pid=1005
# 通过可执行文件路径
auditctl -a always,exit -S all -F exe=/usr/bin/ls

若要查看特定用户打开的文件:

auditctl -a always,exit -S openat -F auid=510

若要查看未成功的 openat 调用:

auditctl -a always,exit -S openat -F success=0

若要监视文件的更改(两种表达方式):

auditctl -w /etc/shadow -p wa
auditctl -a always,exit -F path=/etc/shadow -F perm=wa

若要递归监视目录的更改(两种表达方式):

auditctl -w /etc/ -p wa
auditctl -a always,exit -F dir=/etc/ -F perm=wa

若要查看管理员是否访问其他用户的文件:

auditctl -a always,exit -F dir=/home/ -F uid=0 -C auid!=obj_uid

以下是一个示例规则文件:

# 删除所有现有规则
-D
# 永远不记录 sudo 命令
-A exclude,always -F exe=/usr/bin/sudo

这些命令和规则可以帮助系统管理员监视特定的系统调用、文件或目录的更改,以及特定用户的行为,以便在出现异常行为时快速发现并采取相应的行动。

在许多系统中,auditd 默认配置为安装 -a never,task 规则。这个规则会导致每个新的进程跳过所有审计规则处理。这通常是为了避免系统调用审计带来的小额性能开销。如果你想要使用 auditd,你需要通过删除 10-no-audit.rules 并在审计规则目录中添加 10-base-config.rules 来移除该规则。

如果你定义的审计规则在应该匹配的情况下没有匹配,可以检查 auditctl -l 确保没有 never,task 规则存在。

auditctl -l 命令是用来列出当前所有的审计规则。如果在这个列表中看到了 never,task 规则,那就意味着系统中的每个新进程都会跳过所有审计规则处理。这可能就是你的审计规则没有生效的原因。你需要删除这条规则,确保其他审计规则能够正常工作。

2.4 实时事件处理(auditd-plugins)

auditd可以实时复用审计事件。它接收审计事件,并将其分发给希望实时分析事件的子程序。当审计守护进程收到SIGTERM或SIGHUP时,它将该信号传递给其子进程,以便重新加载配置或终止。

子程序在一个默认为/etc/audit/plugins.d的插件目录中安装配置文件。如果管理员希望将插件定位到其他地方,可以通过auditd.conf配置选项plugin_dir来控制这一点。但auditd将在默认位置安装其插件。

插件目录将被扫描,每个活动的插件将被启动。如果插件出现问题并退出,它将最多被重新启动max_restarts次,这是在auditd.conf中找到的。

配置文件名不允许有多于一个’.',否则它将被视为备份副本并被跳过。配置文件选项每行给出一个,关键字和其值之间用等号连接。可用的选项如下:

  • active,这个选项可以是 yes 或 no。
  • direction,此选项由插件指定。 只有 in 或 out 是唯一的选择。你不能仅通过更改此选项使插件以它未设计的方式操作。此选项是为了给事件调度器一个线索,关于事件流的方向。注意:还不支持入站事件。
  • path,这是插件可执行文件的绝对路径。在内部插件的情况下,它将是插件的名称。
  • type,这告诉调度器插件希望如何运行。目前只有一个选项,builtin,这是默认设置。
  • args,这允许你向子程序传递参数。一般来说,插件不接受参数,并有自己的配置文件来指导它们应如何配置。目前,参数的限制是2个。
  • format,此项的有效选项是 binary 和 string。Binary 将数据完全按照审计事件调度器从审计守护进程获取的方式传递。String 选项告诉调度器将事件完全转换为适合使用审计解析库进行解析的字符串。默认值是 string。

auditd具有一个内部队列,用于为插件保存事件(请参阅auditd.conf中的q_depth设置)。插件需要尽快监视并出队事件,如果无法立即处理,它们需要将事件内部排队。如果插件无法出队记录,auditd的内部队列将被填满。任何时候,作为root,您可以运行以下命令来检查auditd的指标:

auditctl --signal cont ; sleep 1 ; cat /var/run/auditd.state

如果auditd的内部队列填满,它将无法从内核的积压队列中出队任何事件。如果内核的积压队列满了,它会查看backlog_wait_time的值,以延迟生成事件的所有进程,看看是否最终有空间添加事件。这可能会被注意到,因为它会减慢机器上的各种进程。可以通过运行以下命令来检查内核的audit子系统:

auditctl -s

在调整审计系统的性能时,你可能希望检查内核和auditd的指标,并相应地进行调整。

当审计守护程序启动插件时,将以root身份运行。如果不需要root权限,应该更改uid/gid,以降低成为利用目标的可能性。如果需要保留兼容性,使用libcap-ng是最简单的方式。

运行环境不会是干净的。将继承auditd本身的许多属性。所以需要调整信号掩码、sigaction、umask和环境变量。查看auditd man页面,看看auditd使用了哪些信号。插件需要处理SIGTERM和SIGHUP。还会继承auditd的资源限制。请注意,一些资源限制,例如打开描述符的最大数量,是由systemd控制的。也会继承auditd的nice值。可能需要调整这个值,以确保跟上进入的审计事件。

Auditd将通过它的stdin向插件发送事件。插件需要保持此描述符为空,以防事件备份。如果你对每个事件进行了大量处理,你应该在设计中添加一个内部队列,以保持事件流动。如果你需要分析事件的内容,auparse_feed函数是检查整个事件的首选方式。

2.5 审计日志摘要报告(aureport)

aureport 是一个生成审计系统日志摘要报告的工具。只要输入的是原始日志数据,aureport 工具也可以从标准输入(stdin)接收输入。报告顶部有列标签,以帮助解释各种字段。除主摘要报告外,所有报告都有审计事件编号。你可以随后使用 ausearch -a 事件编号来查找完整事件。如果你得到多个结果,可能需要指定开始和停止时间。由 aureport 生成的报告可以作为更复杂分析的构建块。

下面是选项参数信息:

参数选项
-au, --auth报告关于身份验证尝试的信息
-a, --avc报告关于 avc 消息的信息
–comm报告关于运行命令的信息
-c, --config报告关于配置更改的信息
-cr, --crypto报告关于加密事件的信息
–debug将跳过的格式错误事件写入标准错误(stderr)。
–eoe-timeout seconds设置事件解析的结束超时。详情请参见 auditd.conf(5) 中的 end_of_event_timeout。注意,设置此值将覆盖 /etc/auditd/auditd.conf 中找到的任何已配置的值。
-e, --event报告关于事件的信息
–escape option这个选项决定是否对输出进行转义,使内容对某些用途更安全。选项有 raw、tty、shell 和 shell_quote。每种模式包括前一种模式的字符,并转义更多字符。也就是说,shell 包括所有由 tty 转义的字符,并添加更多。tty 是默认设置。
-f, --file报告关于文件和 af_unix sockets 的信息
–failed只选择失败的事件进行报告处理。默认情况下,既包括成功事件也包括失败事件。
-h, --host报告关于主机的信息
–help打印简短的命令概要
-i, --interpret将数字实体解释为文本。例如,将 uid 转换为账户名。转换是在进行搜索的机器的当前资源下完成的。如果你重命名了账户,或者你的机器上没有相同的账户,你可能会得到误导性的结果。
-if, --input file | directory使用给定的文件或目录,而不是日志。这有助于在日志已经被移动到另一台机器,或者只保存了日志的一部分的情况下进行分析。路径长度限制为 4064 字节。
–input-logs使用 auditd.conf 中的日志文件位置作为分析的输入。如果你从 cron 作业中使用 aureport,这是必需的。
–integrity报告关于完整性事件的信息
-k, --key报告关于审计规则键的信息
-l, --login报告关于登录的信息
-m, --mods报告关于账户修改的信息
-ma, --mac报告关于强制访问控制(MAC)事件的信息
-n, --anomaly报告关于异常事件的信息。这些事件包括网络接口卡进入混杂模式和程序段错误。
–node node-name只选择来自节点名称字符串的事件进行报告处理。默认情况下,包括所有节点。允许多个节点。
-nc, --no-config不包括 CONFIG_CHANGE 事件。这对于键报告特别有用,因为审计规则在许多情况下都有键标签。使用此选项可以消除这些误报。
-p, --pid报告关于进程的信息
-r, --response报告关于对异常事件的响应的信息
-s, --syscall报告关于系统调用的信息
–success只选择成功的事件进行报告处理。默认情况下,既包括成功事件也包括失败事件。
–summary运行总结报告,给出主报告元素的总数。并非所有报告都有总结。
-t, --log此选项将输出每个日志的开始和结束时间的报告。
–tty报告关于终端键盘击键的信息
-te, --end [end-date] [end-time]搜索时间戳等于或早于给定结束时间的事件。结束时间的格式取决于你的地区设置。如果省略日期,则假定为今天。如果省略时间,则假定为现在。使用24小时制时间,而不是 AM 或 PM 来指定时间。使用 en_US.utf8 地区设置的日期示例是 09/03/2009。时间的示例是 18:00:00。接受的日期格式受 LC_TIME 环境变量的影响。你也可以使用以下单词:now(现在)、recent(最近)、this-hour(这个小时)、boot(启动)、today(今天)、yesterday(昨天)、this-week(本周)、week-ago(一周前)、this-month(本月)、this-year(今年)。now 表示从现在开始。recent 表示10分钟前。boot 表示系统最后一次启动时的秒级时间。today 表示现在。yesterday 表示前一天午夜后的1秒。this-week 表示从你的地区设置确定的周的第0天午夜后的1秒开始(参见 localtime)。week-ago 表示正好7天前的午夜后的1秒。this-month 表示月份的第1天的午夜后的1秒。this-year 表示第一个月的第一天的午夜后的1秒。
-tm, --terminal报告关于终端的信息
-ts, --start [start-date] [start-time]搜索时间戳等于或晚于给定开始时间的事件。开始时间的格式取决于你的地区设置。如果省略日期,假定为今天。如果省略时间,假定为午夜。使用24小时制时间,而不是 AM 或 PM 来指定时间。使用 en_US.utf8 地区设置的日期示例是 09/03/2009。时间的示例是 18:00:00。接受的日期格式受 LC_TIME 环境变量的影响。你也可以使用以下单词:now(现在)、recent(最近)、this-hour(这个小时)、boot(启动)、today(今天)、yesterday(昨天)、this-week(本周)、week-ago(一周前)、this-month(本月)、this-year(今年)。boot 表示系统最后一次启动时的秒级时间。today 表示从午夜后的1秒开始。recent 表示10分钟前。yesterday 表示前一天午夜后的1秒。this-week 表示从你的地区设置确定的周的第0天午夜后的1秒开始(参见 localtime)。week-ago 表示正好7天前的午夜后的1秒。this-month 表示月份的第1天的午夜后的1秒。this-year 表示第一个月的第一天的午夜后的1秒。
-u, --user报告关于用户的信息
-v, --version打印版本并退出
–virt报告关于虚拟化事件的信息
-x, --executable报告关于可执行文件的信息

boot 时间选项是一个便利功能,但它有一些限制。它计算的时间基于当前时间减去 /proc/uptime。如果在启动后系统时钟已经被调整,可能是由 ntp,那么计算可能会出错。在这种情况下,你需要完全指定时间。你可以通过运行以下命令来检查它会使用的时间:

date -d "`cut -f1 -d. /proc/uptime` seconds ago"

这行命令的作用是,它首先使用 cut -f1 -d. /proc/uptime 命令从 /proc/uptime 文件中获取系统的运行时间(以秒为单位),然后用 date -d " seconds ago" 来计算系统启动的时间。如果系统时钟在启动后被调整过,这个计算出的启动时间可能会不准确。

2.6 查询审计日志(ausearch)

ausearch 是一个可以基于不同搜索条件查询审计守护进程日志中的事件的工具。只要输入是原始的日志数据,ausearch工具也可以从标准输入(stdin)中获取输入。每个给出的命令行选项形成一个"and"语句。例如,使用 -m-ui 进行搜索意味着返回既有请求类型又匹配给定用户id的事件。一个例外是 -m-n 选项;在搜索中允许多个记录类型和节点,将返回任何匹配的节点和记录。

需要注意的是,每个从用户空间进入内核并返回用户空间的系统调用都有一个唯一的事件ID。在此过程中触发的任何可审计事件都共享此ID,以便它们可以被关联起来。

内核的不同部分可能会添加补充记录。例如,对系统调用 “open” 的审计事件也会导致内核发出一个带有文件名的 PATH 记录。ausearch 工具将一起呈现组成一个事件的所有记录。这可能意味着,即使你搜索特定类型的记录,结果事件可能包含 SYSCALL 记录。

还需要注意,并非所有的记录类型都有请求的信息。例如,PATH 记录没有主机名或 loginuid。

下面是选项参数介绍:

参数描述
-a, --event audit-event-id根据给定的事件ID搜索事件。消息始终以类似 msg=audit(1116360555.329:2401771) 的形式开始。事件ID是 ‘:’ 后的数字。一个应用程序的系统调用记录的所有审计事件都有相同的审计事件ID。同一应用程序发出的第二个系统调用将有一个不同的事件ID。这样,它们是唯一的。
–arch CPU根据特定的CPU架构搜索事件。如果你不知道你的机器的架构,但你想使用32位系统调用表,并且你的机器支持32位,你也可以使用 b32 作为架构。同样,对于64位的系统调用表,你可以使用 b64。你可以通过执行 ‘uname -m’ 来获取你的机器的架构。
-c, --comm comm-name根据给定的 comm 名称搜索事件。comm 名称是任务结构中的可执行文件的名称。
–debug将跳过的格式错误的事件写入标准错误。
–checkpoint checkpoint-file在连续的 ausearch 调用之间检查输出,这样只有之前未输出的事件在后续调用中才会打印。
–eoe-timeout seconds设置事件解析超时的结束。请参阅 auditd.conf(5) 中的 end_of_event_timeout 以获取详细信息。注意,设置这个值将覆盖在 /etc/auditd/auditd.conf 中找到的任何配置值。
-e, --exit exit-code-or-errno根据给定的系统调用退出代码或 errno 搜索事件。
–escape option此选项决定是否转义输出,使内容对某些用途更安全。选项包括 raw, tty, shell, 和 shell_quote。每种模式包括前一模式的字符,并转义更多的字符。也就是说,shell 包括所有由 tty 转义的字符,并添加更多。tty 是默认值。
–extra-keys当格式模式为 csv 时,如果事件存在键信息,此选项将在末尾添加一个包含键信息的列。这只会出现在由定义键的审计规则触发的 SYSCALL 记录上。
–extra-labels当格式模式为 csv 时,此选项将添加有关主题和对象标签的信息列(如果它们存在)。
–extra-obj2当格式模式为 csv 时,此选项将添加有关第二个对象的信息列(如果它存在)。记录中包含第二个对象的情况很少见。一些例子包括一个文件被从一个名称重命名为另一个名称,或者一个设备被安装到一个路径。
–extra-time当格式模式为 csv 时,此选项将添加有关细分时间的信息列,以便更容易进行子集划分。
-f, --file file-name根据给定的文件名搜索事件。参数将匹配普通文件以及 af_unix 套接字。
–format option匹配搜索条件的事件将使用此选项进行格式化。支持的格式包括:raw, default, interpret, csv, 和 text。
-ga, --gid-all all-group-id搜索具有有效组ID或与给定组ID匹配的组ID的事件。
-ge, --gid-effective effective-group-id搜索具有给定有效组ID或组名的事件。
-gi, --gid group-id搜索具有给定组ID或组名的事件。
-h, --help提供帮助信息。
-hn, --host host-name根据给定的主机名搜索事件。
-i, --interpret将数字实体解释为文本。
-if, --input file-name | directory使用给定的文件或目录代替日志。
–input-logs使用来自 auditd.conf 的日志文件位置作为搜索的输入。
–just-one在发出匹配搜索条件的第一个事件后停止。
-k, --key key-string根据给定的键字符串搜索事件。
-l, --line-buffered每行刷新输出。当 stdout 连接到管道并且默认的块缓冲策略不合适时,这非常有用。可能会带来性能损失。
-m, --message message-type | comma-sep-message-type-list根据给定的消息类型搜索事件。你也可以输入由逗号分隔的消息类型列表,或者使用多个 -m 选项,每个选项都有自己的消息类型。有一个 ALL 消息类型在实际日志中不存在,它允许你获取系统中的所有消息。
-n, --node根据特定机器的来源搜索事件。允许多个节点,如果任何节点匹配,事件就会匹配。此搜索使用审计事件中的节点字段。还可以参见 --host 命令,它搜索与审计轨迹中的主机信息相关的事件。
-o, --object SE-Linux-context-string根据匹配的字符串搜索具有 tcontext (对象) 的事件。
-p, --pid process-id根据给定的进程 ID 搜索事件。
-pp, --ppid parent-process-id根据给定的父进程 ID 搜索事件。
-r, --raw输出完全无格式。这对于提取可以仍然由审计工具解释的记录到文件或传输到其他审计工具非常有用。
-sc, --syscall syscall-name-or-value根据给定的系统调用搜索事件。你可以给出数字系统调用值或系统调用名。如果你给出系统调用名,它将使用你正在使用的机器的系统调用表。
-se, --context SE-Linux-context-string根据匹配的字符串搜索具有 scontext/subject 或 tcontext/object 的事件。
–session Login-Session-ID根据给定的登录会话 ID 搜索事件。此进程属性在用户登录时设置,可以将任何进程与特定用户登录相关联。
-su, --subject SE-Linux-context-string根据匹配的字符串搜索具有 scontext (主题) 的事件。
-sv, --success success-value根据给定的成功值搜索事件。合法值为 yes 和 no。
-te, --end [end-date] [end-time]搜索时间戳等于或早于给定结束时间的事件。
-ts, --start [start-date] [start-time]搜索时间戳等于或晚于给定开始时间的事件。
-tm, --terminal terminal根据给定的终端值搜索事件。某些守护进程如 cron 和 atd 使用守护进程名作为终端。
-ua, --uid-all all-user-id搜索具有用户 ID,有效用户 ID 或登录用户 ID (auid) 匹配给定用户 ID 的事件。
-ue, --uid-effective effective-user-id搜索具有给定有效用户 ID 的事件。
-ui, --uid user-id搜索具有给定用户 ID 的事件。
-ul, --loginuid login-id搜索具有给定登录用户 ID 的事件。所有使用 PAM 的入口点程序都需要在会话中配置 pam_loginuid,以便在 loginuid (auid) 上进行搜索。
-uu, --uuid guest-uuid搜索具有给定客户 UUID 的事件。
-v, --version打印版本并退出。
-vm, --vm-name guest-name搜索具有给定客户名称的事件。
-w, --word基于字符串的匹配必须匹配整个单词。这类匹配包括:文件名、主机名、终端、键和 SE Linux 上下文。
-x, --executable executable根据给定的可执行文件名搜索事件。
3. 配置文件auditd.conf

/etc/audit/auditd.conf 文件包含了特定于 你你 审计守护进程的配置信息。每一行应该包含一个配置关键字,一个等号,然后跟随适当的配置信息。所有的选项名称和值都不区分大小写。下面会列出并描述所识别的关键字。每行应限制在 160 个字符以内,否则该行将被跳过。你可以通过在行首添加 ‘#’ 字符来给文件添加注释。

下面是相关的配置关键字信息:

关键字描述
local_eventsyes/no 关键字指定是否包含本地事件,默认值是 yes。当你只想从网络聚合事件时,可能会将此设置为 no。目前,如果审计守护进程在容器中运行,这将是很有用的。这个选项只能在守护进程启动时设置一次。重新加载配置文件不会有任何效果。
log_file指定了审计记录将存储的日志文件的完整路径名。它必须是一个常规文件。
write_logsyes/no 关键字决定是否要将日志写入磁盘,默认是 yes。
log_format日志格式描述了信息应如何存储在磁盘上。有两个选项:raw 和 enriched。如果设置为 RAW,审计记录将以内核发送的格式准确地存储。ENRICHED 选项将在将事件写入磁盘之前解析所有的 uid,gid,系统调用,体系结构,和套接字地址信息。这有助于理解在一个系统上创建但在另一个系统上报告/分析的事件。NOLOG 选项现在已被弃用。如果你之前设置了这种格式,现在应将 write_logs 选项设置为 no。
log_group此关键字指定被应用于日志文件权限的组。默认是 root。组名可以是数字或拼写出来。
priority_boost这是一个非负数,告诉审计守护进程应该增加多少(boost)优先级。默认是 4。没有改变是 0。
flush有效值有 none、incremental、incremental_async、data 和 sync。如果设置为 none,则不会特别尝试将审计记录刷新到磁盘。如果设置为 incremental,则使用 freq 参数来确定多久发出一次显式的刷新到磁盘的命令。incremental_async 参数非常类似于 incremental,除了刷新是异步进行的,以获得更高的性能。data 参数告诉审计守护进程始终保持磁盘文件的数据部分同步。sync 选项告诉审计守护进程,每次写入磁盘时,都将数据和元数据完全同步。默认值是 incremental_async。
freq这是一个非负数,告诉审计守护进程在发出显式刷新到磁盘命令之前要写入多少记录。只有当 flush 关键字设置为 incremental 或 incremental_async 时,此值才有效。
num_logs此关键字指定了如果将 rotate 设置为 max_log_file_action,则保留的日志文件数量。如果数量 < 2,则不旋转日志。这个数字必须是 999 或更少。默认值是 0 - 这意味着没有旋转。随着你增加被旋转的日志文件数量,可能需要将内核 backlog 设置向上调整,因为旋转文件需要更多的时间。这通常在 /etc/audit/audit.rules 中完成。如果配置了日志旋转,则守护进程将检查过多的日志并删除它们,以节省磁盘空间。只有在启动和重新配置导致空间检查时,才会检查过量的日志。
name_format此选项控制如何将计算机节点名插入到审计事件流中。它有以下选择:none、hostname、fqd、numeric 和 user。none 表示审计事件中没有插入计算机名称。hostname 是 gethostname 系统调用返回的名称。fqd 意味着它取得主机名,并通过 dns 解析出该机器的完全限定域名。numeric 与 fqd 类似,只是它解析出机器的 IP 地址。要使用此选项,你可能希望测试 ‘hostname -i’ 或 ‘domainname -i’ 是否返回一个数字地址。此外,如果使用了 dhcp,不建议使用此选项,因为同一台机器在不同的时间可能会有不同的地址。user 是来自 name 选项的管理员定义的字符串。默认值是 none。
name这是管理员定义的字符串,如果将 user 设置为 name_format 选项,它将标识机器。
max_log_file此关键字指定了最大文件大小,以兆字节(Mb)为单位。当达到此限制时,将触发一个可配置的动作。给出的值必须是数字
max_log_file_action此参数告诉系统在检测到已达到最大文件大小限制时应采取何种行动。有效值有 ignore、syslog、suspend、rotate 和 keep_logs。如果设置为 ignore,审计守护进程不会做任何事情。syslog 表示它将向 syslog 发出警告。suspend 将导致审计守护进程停止向磁盘写入记录,守护进程仍将保持活动状态。rotate 选项将导致审计守护进程旋转日志。应注意,数字较高的日志比数字较低的日志更旧。这与 logrotate 工具使用的约定相同。keep_logs 选项类似于 rotate,除了它不使用 num_logs 设置。这可以防止覆盖审计日志。效果是日志累积并不会被删除 - 如果卷填满,将触发 space_left_action。这最好与周期性归档日志的外部脚本结合使用。
verify_email此选项确定是否检查在 action_mail_acct 中给出的电子邮件地址,以查看是否可以解析域名。此选项必须在 action_mail_acct 之前给出,否则将使用默认值 yes。
action_mail_acct此选项应包含有效的电子邮件地址或别名。默认地址为 root。如果电子邮件地址不在本地机器上,你必须确保你的机器和网络上的电子邮件配置正确。此外,此选项要求 /usr/lib/sendmail 在机器上存在。
space_left如果包含 log_file 的文件系统中的可用空间低于此值,审计守护进程将采取由 space_left_action 指定的动作。如果 space_left 的值以整数形式指定,它将被解释为以兆字节(MiB)为单位的绝对大小。如果值指定为 1 到 99 之间的数字后跟一个百分号(例如,5%),审计守护进程根据包含 log_file 的文件系统的大小计算以兆字节为单位的绝对大小。(例如,如果包含 log_file 的文件系统的大小为 2GB,且 space_left 设置为 25%,那么审计守护进程将 space_left 设置为大约 500MB。请注意,此计算在审计守护进程启动时进行,因此,如果在审计守护进程运行时调整了包含 log_file 的文件系统的大小,你应该发送 SIGHUP 信号给审计守护进程以重新读取配置文件并重新计算正确的百分比。)
space_left_action此参数告诉系统在检测到磁盘空间开始变低时应采取何种行动。有效值有 ignore、syslog、rotate、email、exec、suspend、single 和 halt。如果设置为 ignore,审计守护进程不会做任何事情。syslog 表示会向 syslog 发出警告。rotate 会旋转日志,删除最旧的日志以释放空间。email 表示会向在 action_mail_acct 中指定的电子邮件账户发送警告,并将消息发送到 syslog。exec /path-to-script 将执行脚本。你不能向脚本传递参数。脚本还负责在完成动作后告知 auditd 守护进程恢复日志记录。这可以通过在脚本中添加 service auditd resume 来完成。suspend 将导致审计守护进程停止向磁盘写入记录,守护进程仍将保持活动状态。single 选项将导致审计守护进程将计算机系统置于单用户模式。halt 选项将导致审计守护进程关闭计算机系统。除 rotate 外,它只会执行一次此操作。
admin_space_left这是以兆字节(MB)为单位的数值,告诉审计守护进程何时因系统磁盘空间不足而执行可配置的动作。这应视为在磁盘空间耗尽之前的最后机会。此参数的数值应低于 space_left 的数值。你也可以在数字后面添加一个百分比符号(例如,1%),审计守护进程会根据磁盘分区大小计算该数字。
admin_space_left_actionadmin_space_left_action:此参数告诉系统在检测到磁盘空间不足时应采取何种行动。有效值有 ignore、syslog、rotate、email、exec、suspend、single 和 halt。如果设置为 ignore,审计守护进程不会做任何事情。syslog 表示会向 syslog 发出警告。rotate 会旋转日志,删除最旧的日志以释放空间。email 表示会向在 action_mail_acct 中指定的电子邮件账户发送警告,并将消息发送到 syslog。exec /path-to-script 将执行脚本。你不能向脚本传递参数。脚本还负责在完成动作后告知 auditd 守护进程恢复日志记录。这可以通过在脚本中添加 service auditd resume 来完成。suspend 将导致审计守护进程停止向磁盘写入记录,守护进程仍将保持活动状态。single 选项将导致审计守护进程将计算机系统置于单用户模式。halt 选项将导致审计守护进程关闭计算机系统。除 rotate 外,它只会执行一次此操作。
disk_full_action此参数告诉系统在检测到写入日志文件的分区已满时应采取何种行动。有效值包括 ignore、syslog、rotate、exec、suspend、single 和 halt。如果设置为 ignore,审计守护进程会发出 syslog 消息,但不会采取其他操作。syslog 表示它将向 syslog 发出警告。rotate 将旋转日志,删除最旧的日志以释放空间。exec /path-to-script 将执行脚本。你不能向脚本传递参数。脚本还负责在完成其动作后告诉 auditd 守护进程恢复日志记录。这可以通过在脚本中添加 service auditd resume 来完成。suspend 将导致审计守护进程停止向磁盘写入记录,守护进程仍将保持活动状态。single 选项将导致审计守护进程将计算机系统置于单用户模式。halt 选项将导致审计守护进程关闭计算机系统。
disk_error_action此参数告诉系统在写入审计事件至磁盘或旋转日志时检测到错误时应采取何种行动。有效值为 ignore、syslog、exec、suspend、single 和 halt。如果设置为 ignore,审计守护进程不会采取任何行动。syslog 表示它将向 syslog 发出不超过 5 次连续的警告。exec /path-to-script 将执行脚本,你不能向脚本传递参数。suspend 将导致审计守护进程停止向磁盘写入记录,守护进程仍将保持活动状态。single 选项将导致审计守护进程将计算机系统置于单用户模式。halt 选项将导致审计守护进程关闭计算机系统。
tcp_listen_port此参数是一个在 1…65535 范围内的数值。如果指定了此参数,auditd 将在对应的 TCP 端口上监听来自远程系统的审计记录。审计守护进程可能与 tcp_wrappers 链接。你可能会希望通过在 hosts.allow 和 deny 文件中增加条目来控制访问权限。如果在基于 systemd 的操作系统上部署,则可能需要调整 ‘After’ 指令。具体信息请参见 auditd.service 文件中的注意事项。
tcp_listen_queue此参数是一个数值,表示允许多少个待处理的(已请求但未接受的)连接。默认值是 5。如果设置的太小,可能会因为太多主机在同一时刻启动(例如在电源故障后)而导致连接被拒绝。此设置仅用于聚合服务器。将日志记录到远程服务器的客户端应保持此项注释状态。
tcp_max_per_addr这是一个数值参数,表示允许来自一个 IP 地址的并发连接数。默认值为 1,最大值为 1024。如果设置得太大,可能会使日志服务器遭受拒绝服务攻击。另需注意,即使 auditd 通过配置允许它,内核也有一个内部最大值,最终会阻止这种情况。在大多数情况下,默认值应该足够使用,除非运行自定义恢复脚本以转发未发送的事件。在这种情况下,你只需将此数字增大足够让其也进入即可。
use_libwrap此设置确定是否使用 tcp_wrappers 来识别来自允许机器的连接尝试。合法值为 yes 或 no。默认值为 yes。
tcp_client_ports此参数可以是单个数值或由破折号分隔的两个值(不允许有空格)。它指示允许哪些客户端端口进行入站连接。如果未指定,则任何端口都被允许。允许的值为 1…65535。例如,要求客户端使用特权端口,将此参数设为 1-1023。你还需要在 audisp-remote.conf 文件中设置 local_port 选项。确保客户端从特权端口发送是一项安全特性,用于防止不受信任的用户进行日志注入攻击。
tcp_client_max_idle此参数表示客户端可能空闲(即完全没有来自他们的数据)的秒数,超过这个时限 auditd 将会提出警告。这用于关闭不活动的连接,如果客户端机器存在无法干净地关闭连接的问题。注意,这是一个全局设置,必须高于任何单个客户端的 heartbeat_timeout 设置,最好是其两倍。默认值为零,这将禁用此检查。
transport如果设置为 TCP,将仅使用明文 tcp 连接。如果设置为 KRB5,则将使用 Kerberos 5 进行身份验证和加密。默认值为 TCP。
enable_krb5此选项已被弃用。请使用上述的 transport 选项。如果设为 “yes”,则将使用 Kerberos 5 进行身份验证和加密。默认值为 “no”。如果此选项被设为 “yes”,并且跟在 transport 选项之后,它将覆盖 transport 的设置。这将是向后兼容性的正常预期行为。
krb5_principal这是此服务器的主体。默认值为 “auditd”。给定此默认值,服务器将查找存储在 /etc/audit/audit.key 中名为 auditd/hostname@EXAMPLE.COM 的密钥进行身份验证,其中 hostname 是服务器主机的规范名称,作为其 IP 地址的 DNS 查找返回。
krb5_key_file这是此服务器的主体。默认值为 “auditd”。给定此默认值,服务器将查找存储在 /etc/audit/audit.key 中名为 auditd/hostname@EXAMPLE.COM 的密钥进行身份验证,其中 hostname 是服务器主机的规范名称,作为其 IP 地址的 DNS 查找返回。
distribute_network如果设为 “yes”,则将网络起源的事件分发到审计调度器进行处理。默认值为 “no”。
q_depth这是一个数值参数,用于指定审计事件调度器的内部队列的大小。更大的队列可以更好地处理大量事件,但可能会保存在守护进程终止时未处理的事件。如果你在 syslog 中收到关于事件被丢弃的消息,增加这个值。默认值是 2000。
overflow_action此选项决定守护进程在内部队列溢出时应如何反应。当这种情况发生时,意味着接收到的事件数量超过了它能传递给子进程的数量。这个错误意味着它将丢失当前尝试分发的事件。此选项有以下选择:ignore(忽略)、syslog(日志)、suspend(挂起)、single(单用户模式)和 halt(停止)。如果设为 ignore,审计守护进程不做任何操作。syslog 表示它将向 syslog 发出警告。suspend 将导致审计守护进程停止向子进程发送事件。守护进程仍然会活着。single 选项将导致审计守护进程使计算机系统进入单用户模式。halt 选项将导致审计守护进程关闭计算机系统。
max_restarts这是一个非负数,告诉审计事件调度器可以尝试重启崩溃插件的次数。默认值是 10。
plugin_dir这是 auditd 用于查找其插件配置文件的位置。
end_of_event_timeout这是一个非负秒数,由用户空间的 auparse() 库例程和 aureport(8),ausearch(8) 实用程序使用,用于在解析事件日志流时考虑事件是否完成。对于正在处理的事件流,如果当前事件的时间比位于同一位置的事件的时间超过 end_of_event_timeout 秒,则认为该事件已经完成。

在一个CAPP环境中,审计追踪被认为非常重要,以至于如果无法创建审计追踪,就必须拒绝对系统资源的访问。在这种环境中,我们建议将/var/log/audit放在其自己的分区中。这是为了确保空间检测的准确性,并确保没有其他进程来消耗它的部分空间。

flush 参数应设为 syncdata

Max_log_filenum_logs 需要进行调整,以便你完全利用你的分区。应注意,需要旋转的文件越多,返回接收审计事件所花费的时间就越长。Max_log_file_action 应设为 keep_logs

Space_left 应设为一个数字,给管理员足够的时间对任何警报消息做出反应,并进行一些维护以释放磁盘空间。这通常涉及运行 aureport -t 报告并将最旧的日志移动到存档区域。space_left 的值取决于站点,因为事件生成的速率会因每次部署而异。建议将 space_left_action 设为 email。如果你需要像 snmp trap 这样的东西,你可以使用 exec 选项来发送一个。

Admin_space_left 应设为审计分区需要记录管理员动作所需的磁盘空间量。Admin_space_left_action 应设为 single,以便只限制机器的使用到控制台。

当分区上没有更多的空间时,会触发 disk_full_action。由于没有更多的审计能力存在,应终止所有访问。这可以设为 singlehalt

disk_error_action 应根据你对硬件故障处理的本地策略设为 syslogsinglehalt

指定单一允许的客户端端口可能会使客户端难以重启他们的审计子系统,因为在连接闭包 TIME_WAIT 状态超时之前,它将无法使用相同的主机地址和端口重新创建连接。

Auditd 事件由一个或多个记录组成。auditd 系统不能保证组成一个事件的记录集将原子性地发生,也就是说,流将具有不同事件的交错记录,例如:

event0_record0
event1_record0
event2_record0
event1_record3
event2_record1
event1_record4
event3_record0

auditd 系统不能保证组成一个事件的记录将按顺序出现。因此,在处理事件流时,我们需要维护一个事件列表,每个事件有自己的记录列表,因此称之为列表的列表(LOL)事件处理。

在处理事件流时,我们通过以下方式定义事件的结束:

  • 记录类型 = AUDIT_EOE(审计事件结束类型记录)
  • 或 记录类型 = AUDIT_PROCTITLE(我们注意到AUDIT_PROCTITLE总是最后一条记录)
  • 或 记录类型 = AUDIT_KERNEL(内核事件是单条记录事件)
  • 或 记录类型 < AUDIT_FIRST_EVENT(只有单条记录的事件出现在此类型之前)
  • 或 记录类型 >= AUDIT_FIRST_ANOM_MSG(只有单条记录的事件出现在此类型之后)
  • 或 记录类型 >= AUDIT_MAC_UNLBL_ALLOW && 记录类型 <= AUDIT_MAC_CALIPSO_DEL(这些也是单记录事件)
  • 或 对于被处理的流,事件的时间超过了 end_of_event_timeout 秒。
4. 配置规则

audit.rules是一个包含审计规则的文件,每当审计守护进程启动时,该文件中的规则都会被审计守护进程的初始化脚本加载。 auditctl程序被初始化脚本用来执行这个操作。规则的语法基本上与在shell提示符下输入auditctl命令时相同,只是不需要输入auditctl命令名称,因为这已经被默认了。审计规则主要有三种类型:控制规则,文件规则,和系统调用规则。

  1. 控制规则(Control rules),控制规则可以改变审计系统的行为。例如,它们可以启用或禁用审计,或者控制审计日志的旋转。
  2. 文件规则(File rules),文件规则可以跟踪对特定文件或目录的访问。例如,您可以创建一个规则来记录所有对/etc/passwd文件的修改。
  3. 系统调用规则(Syscall rules),系统调用规则可以记录特定系统调用的使用。例如,您可以创建一个规则来记录所有的openexec系统调用。

审计的目的是定期或在发生事件时进行调查。前期的几个简单的规划步骤可以使这项工作变得更加容易。最好的建议是在监视规则和系统调用规则中都使用键(key),以赋予规则含义。如果规则相关或共同满足特定的要求,那么给它们一个共同的键名。在您进行调查时,您可以使用这个键来选择具有特定含义的结果。

在进行调查时,您通常会从主要的 aureport 输出开始,以获取系统正在发生什么的大概想法。这个报告主要告诉您审计系统硬编码的事件,如登录/登出,使用的身份验证,系统异常,机器上有多少用户,以及是否有 SE Linux 检测到任何 AVCs。

aureport --start this-week

查看报告后,您可能想要获取关于已加载的触发规则的第二个视图。这就是键变得重要的地方。您通常会运行这样的键汇总报告:

aureport --start this-week --key --summary

这将提供一个有序列表,列出与已触发规则相关联的键。例如,如果您有一个系统调用审计规则,它在以 EPERM 打开文件失败时触发,并带有名为 access 的键字段,如下:

-a always,exit -F arch=b64 -S open -S openat -S openat2 -F exit=-EPERM -k access

然后您可以用 ausearch 隔离这些失败,并将结果管道到 aureport 进行显示。假设您的调查发现了很多访问被拒绝的事件。如果您想看到哪些文件尝试了未经授权的访问,您可以运行以下命令:

ausearch --start this-week -k access --raw | aureport --file --summary

这将提供一个有序列表,显示哪些文件使用 EPERM 失败被访问。假设您想看到哪些用户可能有访问失败,您将运行以下命令:

ausearch --start this-week -k access --raw | aureport --user --summary

如果您的调查显示对特定文件有很多失败的访问,您可以运行以下报告来查看是谁在进行操作:

ausearch --start this-week -k access -f /path-to/file --raw | aureport --user -i

这个报告将为您提供每个人的单个访问尝试。如果您需要查看正在报告的实际审计事件,您将查看日期、时间和事件列。假设事件是 822,发生在 2009 年 9 月 1 日的 2:30,并且您使用的是 en_US.utf8 区域设置,命令将如下所示:

ausearch --start 09/01/2009 02:30 -a 822 -i --just-one

这将选择那天和时间的第一个与匹配事件 id 相关联的事件,并将数值解释为人类可读的值。

能够进行这种分析的最重要的步骤是在规则最初编写时设置键字段。还应该指出的是,您可以有一个以上的键字段与任何给定的规则相关联。

4.1 控制规则

控制命令通常涉及配置审计系统,而不是告诉它需要监视什么。这些命令通常包括删除所有规则,设置内核的后台队列大小,设置失败模式,设置事件速率限制,或告诉 auditctl 忽略规则中的语法错误并继续加载。这些规则通常位于规则文件的顶部。

4.2 文件系统规则

文件系统规则有时被称为监视规则(watches)。这些规则用于审计可能感兴趣的特定文件或目录的访问。如果监视规则中给出的路径是目录,那么使用的规则将递归到目录树的底部,不包括可能是挂载点的任何目录。这些监视规则通常遵循以下格式:

-w path-to-file -p permissions -k keyname

其中,权限可以是以下任何一个:

  • r - 读取文件
  • w - 写入文件
  • x - 执行文件
  • a - 文件属性的变化
4.3 系统调用规则

系统调用规则被加载到拦截系统中所有程序进行的每个系统调用的匹配引擎中。因此,只有在必要时才应使用系统调用规则,因为这些规则会影响性能。规则越多,性能损失越大。然而,您可以通过尽可能将系统调用合并到一条规则中来提高性能。Linux内核有6个规则匹配列表或过滤器,分别是:task, exit, user, exclude, filesystem, 和 io_uring。系统调用规则通常形式如下:

-a action,list -S syscall -F field=value -k keyname

-a选项告诉内核的规则匹配引擎我们想要在规则列表的末尾追加一条规则。有效的操作包括:

  • always - 总是创建事件
  • never - 从不创建事件

规则中的操作和列表之间用逗号分隔,但之间没有空格。有效的列表包括:task, exit, user, exclude, filesystem, 和 io_uring。在规则中,通常会有一个或多个 -F 选项,用来细化匹配条件。审计系统将 uid 视为无符号数字,使用数字 -1 表示 loginuid 没有设置。在规则中,可以使用 “unset”,-1,或 4294967295,它们的含义是等价的。可以添加一个 key 字段,这是一个自由格式的文本字符串,您希望将其插入到事件中以帮助识别其含义。

4.4 注意事项

如果您认为应该在系统调用规则(syscall rules)上获取事件,但却没有获取到,尝试在 strace 下运行测试程序,这样您可以看到系统调用(syscalls)。有可能您可能已经识别出了错误的系统调用。

如果 auditctl 发出警告,说"在第XX行存在32/64位系统调用不匹配,您应该指定一个架构"。这意味着您在一个双架构系统上指定了一个系统调用规则,而该系统调用在32位和64位接口上有不同的系统调用号。这意味着在其中一个接口上,你可能在审计错误的系统调用。要解决这个问题,将规则重写为两个规则,每个规则指定预期的架构。例如,

-a always,exit -S openat -k access

需要重写为

-a always,exit -F arch=b32 -S openat -k access
-a always,exit -F arch=b64 -S openat -k access

如果你收到一个警告,说"入口规则已被弃用,更改为退出规则"。这意味着您有一个为入口过滤器(entry filter)准备的规则,但那个过滤器已不再可用。Auditctl 将您的规则移动到 exit filter,以便不会丢失。但为了解决这个问题,以便您不再收到警告,您需要将违规规则从入口改为退出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值