如何在 CentOS 7 上编写自定义系统审计规则

介绍

Linux 审计系统创建了一个审计轨迹,一种方式来跟踪系统上的各种信息。它可以记录大量的数据,如事件类型、日期和时间、用户ID、系统呼叫、流程、使用的文件、SELinux 背景和敏感度级别。它可以跟踪文件是否已被访问、编辑或执行。它甚至可以跟踪文件属性的变化。它能够记录系统呼叫的使用情况、用户执行的命令、未成功登录的尝试以及许多其他事件。 默认情况下,审计系统在日志中仅记录了用户登录、用户使用SUDO和SELinux相关的消息等少数事件。 它使用审计规则来监控特定事件并创建相关的日志。

在本教程中,我们将讨论不同类型的审计规则以及如何在您的服务器上添加或删除自定义规则。

前提条件

在您开始使用本教程之前,您应该有以下内容:

查看审计规则

您可以使用auditctl -l命令查看当前的审计规则。

1sudo auditctl -l

如果没有规则,则不会显示(这是默认的):

1No rules

当您在本教程中添加规则时,您可以使用此命令来验证它们是否已添加。

可以通过以下方式查看审计系统的现状:

1sudo auditctl -s

产量将类似于:

1AUDIT_STATUS: enabled=1 flag=1 pid=9736 rate_limit=0 backlog_limit=320 lost=0 backlog=0

enabled=1 值显示在该服务器上启用了审计。 pid 值是审计对象的过程号码。 0 的 pid 表示审计对象没有运行。 丢失 输入将告诉您有多少事件记录 由于内核审计队列过流而被丢弃。 backlog 字段显示了目前有多少事件记录在等待审计师读取它们的队列。

增加审计规则

您可以使用命令行工具auditctl添加自定义审计规则。默认情况下,规则会被添加到当前列表的底部,但也可以在顶部插入。 为了使您的规则永久性,您需要将它们添加到文件/etc/audit/rules.d/audit.rules中。 每当auditd服务启动时,它会激活文件中的所有规则。 您可以在我们的另一篇文章中阅读更多关于审计术语和审计系统的信息 理解 CentOS 7 上的审计系统。 审计规则以第一场比赛的胜利为基础工作 - 当规则匹配时,它不会进一步评估规则。 正确排列规则很重要。

<$>[注] 如果您在 CentOS 6 上,审计规则文件位于 /etc/audit/audit.rules 位置。

有三种类型的审计规则:

  • 控制规则:这些规则用于更改审计系统本身的配置和设置
  • 文件系统规则:这些是文件或目录时钟。 使用这些规则,我们可以对特定文件或目录的任何类型的访问进行审计
  • 系统调用规则:这些规则用于监控任何过程或特定用户进行的系统调用

控制规则

让我们看看我们可以添加的一些控制规则:

  • auditctl -b <backlog> - 设置允许排放的审计缓冲器的最大数目。如果所有缓冲器都满了,核会查阅故障标志以采取行动。 CentOS 服务器上设置的默认缓冲限制为 320. 您可以使用: 查看此信息
1sudo auditctl -s

在输出中,您可以看到当前的 backlog_limit 值:

1AUDIT_STATUS: enabled=1 flag=1 pid=9736 rate_limit=0 backlog_limit=320 lost=0 backlog=0

如果您的 backlog 值超过当前设置的 backlog_limit,则可能需要增加 backlog_limit,以便审计日志正常工作。

1sudo auditctl -b 1024

输出将显示状态:

1AUDIT_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. 除非您在您的服务器上有任何重大问题,否则您不需要更改此值
  • auditl - <Rfilename> - 阅读指定的文件的审计规则

我们通过auditctl添加的规则不是永久性的,要使它们在重启中持久,您可以将它们添加到/etc/audit/rules.d/audit.rules文件中。 此文件使用相同的auditctl命令行语法来指定规则,但没有前面的auditctl命令本身。 任何空行或随哈希符号(#)之后的任何文本都被忽略。 默认规则文件看起来如下:

 1[label /etc/audit/rules.d/audit.rules]
 2# This file contains the auditctl rules that are loaded
 3# whenever the audit daemon is started via the initscripts.
 4# The rules are simply the parameters that would be passed
 5# to auditctl.
 6
 7# First rule - delete all
 8-D
 9
10# Increase the buffers to survive stress events.
11# Make this bigger for busy systems
12-b 320
13
14# Feel free to add below this line. See auditctl man page

若要更改 backlog 值为 8192,您可以将 -b 320 更改为 -b 8192 并使用下列方式重新启动审计对象:

1sudo service auditd restart

如果您不重新启动戴蒙,它仍然会在下一个服务器重新启动时从配置中设置新的值。

文件系统规则

文件系统时钟可以设置在文件和目录上,我们也可以指定要监视的访问类型,文件系统规则的语法是:

1auditctl -w path_to_file -p permissions -k key_name

哪里

path_to_file 是被审核的文件或目录。 permissions 是被登录的权限。 此值可以是 r(read), w(write), x(execute)和 a(attribute change)的组合。

让我们看看一些例子。

1sudo auditctl -w /etc/hosts -p wa -k hosts_file_change

上面的规则要求审计系统监控文件 /etc/hosts 的任何写入访问或属性变化,并使用我们指定的自定义密钥字符串 - hosts_file_change` 将其登录到审计日志。

如果您想将此规则永久化,请将其添加到下方的 /etc/audit/rules.d/audit.rules 文件中,如下:

1[label /etc/audit/rules.d/audit.rules]
2-w /etc/hosts -p wa -k hosts_file_change

要确保规则已成功添加,您可以运行:

1sudo auditctl -l

如果一切顺利,结果应该显示:

1LIST_RULES: exit,always watch=/etc/hosts perm=wa key=hosts_file_change

我们还可以向目录添加手表。

1sudo auditctl -w /etc/sysconfig/ -p rwa -k configaccess

上面的规则将为目录 /etc/sysconfig 和其下方的所有文件和目录添加一个观察器,以便访问任何阅读、写入或分配更改。

要添加一个规则,以监视/sbin/modprobe命令的执行(此命令可以从服务器上添加/删除内核模块):

1sudo auditctl -w /sbin/modprobe -p x -k kernel_modules

<$>[注] 注: 您不能将手表插入顶级目录. 这是内核禁止的。 Wildcards 也不支持,并且会发出警告 <$>

要搜索特定事件的审计日志,您可以使用命令 ausearch. 例如,要搜索标记为‘configaccess’的所有事件的审计日志,您可以运行:

1sudo ausearch -k configaccess

「ausearch」在我們的其他教程中詳細討論 理解 CentOS 7 的審核系統

系统调用规则

通过审核系统呼叫,您可以追踪服务器上的活动远远超出应用程序级别,系统呼叫规则的语法是:

1auditctl -a action,filter -S system_call -F field=value -k key_name`

何处:

  • 在上述命令中以-A'取代-a',将在上方而不是下方插入该规则。 *行动'和过滤器'指定某一事件何时记录。 行动 ' 可以是永远',也可以是永远'。 规则匹配过滤器可以是以下之一: " 任务 " 、 " 退出 " 、 " 用户 " 和 " 排除 " 。 在大多数情况下, " 行动、过滤 " 将是 " 永远的 " ,它告诉 " 审计者 " ,你想在该系统退出时对其进行审计。 (_) ) *系统_call'指定了系统名称。 几种系统调用可分为一条规则,每一条规则在-S ' 选项后指定。 也可以使用 " 所有 " 一词。 您可以使用 sudo ausyscall -- dump命令查看所有系统呼叫的列表及其编号。 (_) ) *field=value'指定了额外的选项来修改规则以匹配基于指定架构,用户ID,进程ID,路径等的事件. () ) * `key_name' 是一条可选的字符串,它帮助您日后识别哪个规则或一组规则生成了特定的日志条目. () (英语)

现在让我们来看看一些系统调用规则的例子。

若要定义创建一个名为重命名的日志条目的审计规则,每次由 1000 或更大的 ID 用户重命名文件时,运行:

1sudo auditctl -a always,exit -F arch=b64 -F "auid>=1000" -S rename -S renameat -k rename

-F arch=b64表示要审核规则中的系统呼叫的 64 位版本。

要定义一个规则,该规则会记录特定用户(使用UID 1001)访问的文件,并将日志条目标记为userfileaccess:

1sudo auditctl -a always,exit -F arch=b64 -F auid=1001 -S open -k userfileaccess

如果您想将此规则永久化,请将其添加到下方的 /etc/audit/rules.d/audit.rules 文件中,如下:

1[label /etc/audit/rules.d/audit.rules]
2-a always,exit -F arch=b64 -F auid=1001 -S open -k userfileaccess

您还可以使用系统调用规则语法定义文件系统规则,例如:

1sudo auditctl -a always,exit -F path=/etc/hosts -F perm=wa -k hosts_file_change

与我们在上一节看到的文件系统规则相同的工作:

1sudo auditctl -w /etc/hosts -p wa -k hosts_file_change

若要使用系统调用规则反复查看目录,可以使用 `-F "dir=/path/to/dir" 选项。

<$>[note] 注: 请注意,所有比审计示范器本身开始的流程都将具有 auid 的值 4294967295. 要将这些流程从您的规则中排除,您可以将 -F 'auid!=4294967295' 添加到您的规则中。 为了避免此问题,您可以将 audit=1' 添加到内核启动参数中。

废除审计规则

要删除所有当前的审计规则,可以使用命令 auditctl -D. 若要删除使用 -woption 添加的文件系统观察规则,则可以在原始规则中用 -w 代替。

1sudo auditctl -w /etc/passwd -p wa -k passwdaccess

查看使用设置的规则:

1sudo auditctl -l

产量应包括:

1LIST_RULES: exit,always watch=/etc/passwd perm=wa key=passwdaccess

要删除这个规则,我们可以使用以下命令,只需用-w代替-W:

1sudo auditctl -W /etc/passwd -p wa -k passwdaccess

现在,看看使用设置的规则:

1sudo auditctl -l

这个规则现在不应该出现在名单上。

<$>[注] **注:**如果在audit.rules文件中添加了任何永久性审计规则,则审计戴蒙重新启动或系统重新启动将从文件中加载所有规则。

锁定审计规则

可以使用「auditctl -e [0 1 2]」禁用或启用审计系统,并锁定审计规则。

1auditctl -e 0

1作为一个参数传递时,它将允许审计。为了锁定审计配置,以便无法更改,请将2传递为参数。这使得当前审计规则的组合不可变。规则不再可以添加、删除或编辑,审计示威不再可以停止。锁定配置是audit.rules中的最后一个命令,对于任何希望此功能在此模式下更改配置的用户。任何尝试在此模式下更改配置都会被审计和拒绝。

结论

Linux 审计系统提供的信息对于入侵检测非常有用,您现在应该能够添加自定义审计规则,以便记录特定事件。

请记住,在添加自定义日志规则时,您可以始终参考auditctl人页面,它提供了完整的命令行选项、性能提示和示例列表。

Published At
Categories with 技术
comments powered by Disqus