如何在CentOS7上编写自定义系统审计规则
介绍
Linux 审计系统创建了一个审计线索,这是一种跟踪系统上各种信息的方法。 它可以记录大量数据,例如事件类型、日期和时间、用户 ID、系统调用、进程、使用的文件、SELinux 上下文和敏感度级别。 它可以跟踪文件是否已被访问、编辑或执行。 它甚至可以跟踪文件属性的更改。 它能够记录系统调用的使用、用户执行的命令、失败的登录尝试以及许多其他事件。 默认情况下,审计系统只在日志中记录少数事件,例如用户登录、使用 sudo 的用户以及与 SELinux 相关的消息。 它使用审计规则来监控特定事件并创建相关的日志条目。 可以创建审计规则。
在本教程中,我们将讨论不同类型的审计规则以及如何在您的服务器上添加或删除自定义规则。
先决条件
在开始学习本教程之前,您应该具备以下条件:
- CentOS 7 Droplet(也适用于 CentOS 6)
- 具有 sudo 权限的非 root 用户。 要设置此类型的用户,请按照 使用 CentOS 7 的初始服务器设置教程进行操作。 所有命令都将以该用户身份运行。
- 对 Linux 审计系统的基本了解。 查看 了解 CentOS 7 上的 Linux 审计系统以获取更多信息。
查看审计规则
您可以使用命令 auditctl -l
查看当前的审计规则集。
sudo auditctl -l
如果不存在,它将不显示任何规则(这是默认设置):
No rules
在本教程中添加规则时,您可以使用此命令来验证它们是否已添加。
可以使用以下方式查看审计系统的当前状态:
sudo auditctl -s
输出将类似于:
AUDIT_STATUS: enabled=1 flag=1 pid=9736 rate_limit=0 backlog_limit=320 lost=0 backlog=0
enabled=1
值表明在此服务器上启用了审核。 pid
值是审计守护进程的进程号。 pid 为 0 表示审计守护程序没有运行。 lost
条目将告诉您由于内核审计队列溢出而丢弃了多少事件记录。 backlog
字段显示当前有多少事件记录在排队等待 auditd 读取它们。 我们将在本教程的下一部分讨论其余的输出字段。
添加审计规则
您可以使用命令行工具 auditctl
添加自定义审核规则。 默认情况下,规则将添加到当前列表的底部,但也可以插入到顶部。 要使您的规则永久化,您需要将它们添加到文件 /etc/audit/rules.d/audit.rules
中。 每当启动 auditd
服务时,它将激活文件中的所有规则。 您可以在我们的另一篇文章 Understanding the Audit System on CentOS 7 中阅读更多关于审计守护进程和审计系统的信息。 审计规则在第一次匹配获胜的基础上工作——当规则匹配时,它不会进一步评估规则。 规则的正确排序很重要。
如果您使用的是 CentOS 6,则审核规则文件位于 /etc/audit/audit.rules
。
审计规则分为三类:
- 控制规则:这些规则用于更改审计系统本身的配置和设置。
- 文件系统规则:这些是文件或目录监视。 使用这些规则,我们可以审计对特定文件或目录的任何类型的访问。
- 系统调用规则:这些规则用于监视任何进程或特定用户进行的系统调用。
控制规则
让我们看看我们可以添加的一些控制规则:
auditctl -b <backlog>
- 设置允许的未完成审计缓冲区的最大数量。 如果所有缓冲区都已满,内核会查询失败标志以进行操作。 在 CentOS 服务器上设置的默认积压限制是 320。 您可以使用以下方法查看:
sudo auditctl -s
在输出中,您可以看到当前的 backlog_limit 值:
AUDIT_STATUS: enabled=1 flag=1 pid=9736 rate_limit=0 backlog_limit=320 lost=0 backlog=0
如果您的积压值大于当前设置的 backlog_limit,您可能需要增加 backlog_limit 才能使审计日志正常运行。 例如,要将值增加到 1024,请运行:
sudo auditctl -b 1024
输出将显示状态:
AUDIT_STATUS: enabled=1 flag=1 pid=9736 rate_limit=0 backlog_limit=1024 lost=0 backlog=0
auditctl -f [0 1 2]
- 设置失败标志(0=静默,1=printk. 2=恐慌)。 此选项可让您确定您希望内核如何处理严重错误。 如果设置为 0,无法记录的审计消息将被静默丢弃。 如果设置为 1,则将消息发送到内核日志子系统。 如果设置为 2,它将触发内核恐慌。 查询此标志的示例条件包括超出积压限制、超出内核内存和超出速率限制。 默认值为 1。 除非您的服务器上的审核守护程序有任何重大问题,否则您不需要更改此值。auditctl -R <filename>
- 从指定的文件中读取审计规则。 当您正在测试一些临时规则并希望再次使用audit.rules
文件中的旧规则时,这很有用。
我们通过 auditctl
添加的规则不是永久的。 要使它们在重新启动后保持不变,您可以将它们添加到文件 /etc/audit/rules.d/audit.rules
中。 该文件使用相同的 auditctl
命令行语法来指定规则,但前面没有 auditctl
命令本身。 任何空行或井号 (#) 后面的任何文本都将被忽略。 默认规则文件如下所示:
/etc/audit/rules.d/audit.rules
# This file contains the auditctl rules that are loaded # whenever the audit daemon is started via the initscripts. # The rules are simply the parameters that would be passed # to auditctl. # First rule - delete all -D # Increase the buffers to survive stress events. # Make this bigger for busy systems -b 320 # Feel free to add below this line. See auditctl man page
要将积压值更改为 8192,您可以将 -b 320 更改为 -b 8192 并使用以下命令重新启动审核守护程序:
sudo service auditd restart
如果您不重新启动守护程序,它仍会在下次服务器重新启动时从配置中设置新值。
文件系统规则
文件系统监视可以在文件和目录上设置。 我们还可以指定要监视的访问类型。 文件系统规则的语法是:
auditctl -w path_to_file -p permissions -k key_name
在哪里
path_to_file
是被审计的文件或目录。 permissions
是记录的权限。 该值可以是 r(read)、w(write)、x(execute) 和 a(attribute change) 之一或组合。 key_name
是一个可选字符串,可帮助您识别哪些规则生成了特定的日志条目。
让我们看一些例子。
sudo auditctl -w /etc/hosts -p wa -k hosts_file_change
上述规则要求审计系统监视对文件 /etc/hosts
的任何写访问或属性更改,并使用我们指定的自定义密钥字符串 - hosts_file_change
将它们记录到审计日志中。
如果您希望将此规则永久化,请将其添加到底部的文件 /etc/audit/rules.d/audit.rules
中,如下所示:
/etc/audit/rules.d/audit.rules
-w /etc/hosts -p wa -k hosts_file_change
要确保规则添加成功,您可以运行:
sudo auditctl -l
如果一切顺利,输出应显示:
LIST_RULES: exit,always watch=/etc/hosts perm=wa key=hosts_file_change
我们还可以将手表添加到目录中。
sudo auditctl -w /etc/sysconfig/ -p rwa -k configaccess
上述规则将为目录 /etc/sysconfig
及其下的所有文件和目录添加一个监视,以进行任何读取、写入或属性更改访问。 它还将使用自定义键 configaccess 标记日志消息。
添加一条规则以监视 /sbin/modprobe
命令的执行(此命令可以从服务器添加/删除内核模块):
sudo auditctl -w /sbin/modprobe -p x -k kernel_modules
注意: 不能将watch插入到顶层目录。 这是内核禁止的。 通配符也不支持,会产生警告。
要在审计日志中搜索特定事件,可以使用命令 ausearch
。 例如,要在审核日志中搜索所有标记为 configaccess
的事件,您可以运行:
sudo ausearch -k configaccess
ausearch
在我们的其他教程 Understanding the Audit System on CentOS 7 中有详细讨论。
系统调用规则
通过审核系统调用,您可以跟踪服务器上远远超出应用程序级别的活动。 系统调用规则的语法是:
auditctl -a action,filter -S system_call -F field=value -k key_name`
在哪里:
- 将上述命令中的
-a
替换为-A
会将规则插入顶部而不是底部。 action
和filter
指定记录某个事件的时间。action
可以是always
或never
。filter
指定将哪个内核规则匹配过滤器应用于事件。 规则匹配过滤器可以是以下之一:task
、exit
、user
和exclude
。 在大多数情况下,action,filter
将是always,exit
,这告诉auditctl
您要在此系统调用退出时对其进行审核。system_call
按名称指定系统调用。 可以将多个系统调用组合成一个规则,每个规则都在-S
选项之后指定。 也可以使用单词all
。 您可以使用sudo ausyscall --dump
命令查看所有系统调用的列表及其编号。field=value
指定修改规则以匹配基于指定架构、用户 ID、进程 ID、路径等的事件的附加选项。key_name
是一个可选字符串,可帮助您稍后识别哪个规则或一组规则生成了特定的日志条目。
现在让我们看一些示例系统调用规则。
要定义一个审核规则,该规则在每次 ID 为 1000 或更大的用户重命名文件时创建一个标记为 rename
的日志条目,请运行:
sudo auditctl -a always,exit -F arch=b64 -F "auid>=1000" -S rename -S renameat -k rename
-F arch=b64
表示审核规则中系统调用的 64 位版本。
要定义记录特定用户(UID 1001)访问的文件并用 userfileaccess
标记日志条目的规则:
sudo auditctl -a always,exit -F arch=b64 -F auid=1001 -S open -k userfileaccess
如果您希望将此规则永久化,请将其添加到底部的文件 /etc/audit/rules.d/audit.rules
中,如下所示:
/etc/audit/rules.d/audit.rules
-a always,exit -F arch=b64 -F auid=1001 -S open -k userfileaccess
您还可以使用系统调用规则语法定义文件系统规则。 例如,以下规则:
sudo auditctl -a always,exit -F path=/etc/hosts -F perm=wa -k hosts_file_change
与我们在前面部分中看到的文件系统规则执行相同的工作:
sudo auditctl -w /etc/hosts -p wa -k hosts_file_change
要使用系统调用规则递归地查看目录,可以使用选项 -F "dir=/path/to/dir"
。
注意: 请注意,在审计守护进程之前启动的所有进程都将具有 4294967295
的 auid
。 要从您的规则中排除这些,您可以将 -F "auid!=4294967295"
添加到您的规则中。 为避免此问题,您可以将 audit=1
添加到内核启动参数中。 这甚至在审计守护进程启动之前就可以在引导时启用内核审计系统,并且所有进程都将具有正确的登录 uid。
删除审计规则
要删除所有当前的审计规则,可以使用命令 auditctl -D
。 要删除使用 -w
选项添加的文件系统监视规则,您可以将原始规则中的 -w
替换为 -W
。 使用 -a
或 -A
选项添加的系统调用规则可以使用带有原始规则的 -d
选项删除。 例如,假设我们添加了以下规则:
sudo auditctl -w /etc/passwd -p wa -k passwdaccess
使用以下命令查看规则集:
sudo auditctl -l
输出应包括:
LIST_RULES: exit,always watch=/etc/passwd perm=wa key=passwdaccess
要删除此规则,我们可以使用以下命令,只需将 -w
替换为 -W
:
sudo auditctl -W /etc/passwd -p wa -k passwdaccess
现在,使用以下命令查看规则集:
sudo auditctl -l
该规则现在不应出现在列表中。
注意: 如果在 audit.rules
文件中添加了任何永久审核规则,审核守护程序重新启动或系统重新启动将加载文件中的所有规则。 要永久删除审计规则,您需要将它们从文件中删除。
锁定审计规则
可以使用 auditctl -e [0 1 2]
禁用或启用审计系统并锁定审计规则。 例如,要暂时禁用审核,请运行:
auditctl -e 0
当 1
作为参数传递时,它将启用审计。 要锁定审计配置以使其无法更改,请将 2
作为参数传递。 这使得当前的审计规则集是不可变的。 不能再添加、删除或编辑规则,也不能再停止审计守护进程。 锁定配置是 audit.rules
中的最后一个命令,供任何希望启用此功能的人使用。 在此模式下更改配置的任何尝试都将被审核并拒绝。 只能通过重新启动服务器来更改配置。
结论
Linux 审计系统提供的信息对于入侵检测非常有用。 您现在应该能够添加自定义审核规则,以便您可以记录特定事件。
请记住,在添加自定义日志记录规则时,您始终可以参考 auditctl
手册页。 它提供了命令行选项、性能提示和示例的完整列表。 /usr/share/doc/audit-<version>/
目录包含具有基于一些常见认证标准的预配置审计规则的文件。