介绍
Linux 审计系统 帮助系统管理员创建审计跟踪,记录服务器上的每个操作。 我们可以跟踪与安全相关的事件,将事件记录在日志文件中,并通过检查审计日志文件来检测滥用或未经授权的活动。 我们可以选择要监控服务器上的哪些操作以及监控的程度。 审计不会为您的系统提供额外的安全性,而是帮助跟踪任何违反系统策略的行为,并使您能够采取额外的安全措施来防止它们。
本教程解释了审计系统、如何配置它、如何生成报告以及如何阅读这些报告。 我们还将了解如何在审核日志中搜索特定事件。
先决条件
对于本教程,您需要以下内容:
- CentOS 7 Droplet(也适用于 CentOS 6)
- 具有 sudo 权限的非 root 用户。 要设置此类型的用户,请按照 使用 CentOS 7 的初始服务器设置教程进行操作。 所有命令都将以该用户身份运行。
验证审计安装
审计系统有两个主要部分:
- 审计内核组件拦截来自用户应用程序的系统调用,记录事件,并将这些审计消息发送到审计守护进程
auditd
守护进程从内核收集信息并在日志文件中创建条目
审计系统使用以下软件包:audit
和 audit-libs
。 这些软件包默认安装在新的 CentOS 7 Droplet(和新的 CentOS 6 Droplet)上。 最好使用以下方法验证您是否已将它们安装在您的服务器上:
sudo yum list audit audit-libs
您应该在输出中看到 Installed Packages
下的两个包:
Installed Packages audit.x86_64 audit-libs.x86_64
配置审计
auditd
的主要配置文件是/etc/audit/auditd.conf
。 此文件由配置参数组成,其中包括记录事件的位置、如何处理完整磁盘以及日志轮换。 要编辑此文件,您需要使用 sudo:
sudo nano /etc/audit/auditd.conf
例如,要将服务器上保存的审计日志文件的数量增加到 10,请编辑以下选项:
/etc/audit/auditd.conf
num_logs = 10
您还可以配置最大日志文件大小(以 MB 为单位)以及达到大小后要执行的操作:
/etc/audit/auditd.conf
max_log_file = 30 max_log_file_action = ROTATE
当您对配置进行更改时,您需要使用以下命令重新启动 auditd 服务:
sudo service auditd restart
使更改生效。
另一个配置文件是/etc/audit/rules.d/audit.rules
。 (如果您使用的是 CentOS 6,则文件为 /etc/audit/audit.rules
。)它用于永久添加审核规则。
当 auditd
运行时,审计消息将记录在文件 /var/log/audit/audit.log
中。
了解审核日志文件
默认情况下,审计系统将审计消息记录到 /var/log/audit/audit.log
文件中。 审计日志文件包含许多有用的信息,但由于提供的信息量巨大、使用的缩写和代码等,对许多用户来说阅读和理解日志文件似乎很困难。 在本节中,我们将尝试了解审计日志文件中典型审计消息中的一些字段。
'注意:如果auditd
由于某种原因没有运行,审计消息将被发送到rsyslog。
对于此示例,假设我们在服务器上配置了一个带有标签 (key
) sshconfigchange
的审核规则,以记录对文件 /etc/ssh/sshd_config
的每次访问或修改。 如果您愿意,可以使用以下命令临时添加此规则:
sudo auditctl -w /etc/ssh/sshd_config -p rwxa -k sshconfigchange
运行以下命令查看 sshd_config
文件会在审计日志文件中创建一个新的 event:
sudo cat /etc/ssh/sshd_config
audit.log
文件中的这个事件如下所示:
/var/log/audit/audit.log
type=SYSCALL msg=audit(1434371271.277:135496): arch=c000003e syscall=2 success=yes exit=3 a0=7fff0054e929 a1=0 a2=1fffffffffff0000 a3=7fff0054c390 items=1 ppid=6265 pid=6266 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=113 comm="cat" exe="/usr/bin/cat" key="sshconfigchange" type=CWD msg=audit(1434371271.277:135496): cwd="/home/sammy" type=PATH msg=audit(1434371271.277:135496): item=0 name="/etc/ssh/sshd_config" inode=392210 dev=fd:01 mode=0100600 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL
上述事件由三个记录组成(每个记录都以 type=
关键字开头),它们共享相同的时间戳(1434371271.277
)和 id(135496
)。 每条记录由几个 name=value 对组成,由空格或逗号分隔。 我们将详细了解其中一些字段的含义。
在第一条记录中:
type=SYSCALL
type
字段包含审计消息的类型。 在这种情况下,SYSCALL
值表明此消息是由对内核的系统调用触发的。
msg=audit(1434371271.277:135496):
审核消息的时间戳和 ID,格式为 audit(time_stamp:ID)
。 如果多个审计消息/记录是作为同一审计事件的一部分生成的,则它们可以共享相同的时间戳和 ID。 在我们的示例中,我们可以在审计事件生成的所有三条消息上看到相同的时间戳 (1434371271.277) 和 ID (135496)。
arch=c000003e
arch
字段包含有关系统 CPU 架构的信息。 值 c000003e 采用十六进制表示法,代表 x86_64。
syscall=2
syscall
字段表示发送到内核的系统调用的类型。 在这种情况下,2 是 open
系统调用。 ausyscall
实用程序允许您将系统调用号转换为人类可读的等效项。 例如,运行以下命令将值 2 转换为人类可读的等价物:
sudo ausyscall 2
输出显示:
open
注意: 您可以使用 sudo ausyscall --dump
命令查看所有系统调用的列表及其编号。
success=yes
success
字段显示该特定事件中的系统调用是成功还是失败。 在这种情况下,调用成功。 运行 sudo cat /etc/ssh/sshd_config
命令时,用户 sammy 能够打开并读取文件 sshd_config
。
ppid=6265
ppid
字段记录父进程 ID (PPID)。 在这种情况下,6265
是 bash
进程的 PPID。
pid=6266
pid
字段记录进程 ID (PID)。 在这种情况下,6266
是 cat
进程的 PID。
auid=1000
auid
是审核 UID 或触发此审核消息的用户的原始 UID。 即使您在初次登录后通过 su 或 sudo 提升权限,审计系统也会记住您的原始 UID。
uid=0
uid
字段记录启动分析进程的用户的用户 ID。 在这种情况下,cat
命令由用户 root 使用 uid 0 启动。
comm="cat"
comm
记录触发此审计消息的命令的名称。
exe="/usr/bin/cat"
exe
字段记录用于触发此审计消息的命令的路径。
key="sshconfigchange"
key
字段记录管理员定义的字符串,该字符串与在日志中生成此事件的审计规则相关联。 通常在创建自定义审核规则时设置密钥,以便更轻松地从审核日志中搜索某些类型的事件。
对于第二条记录:
type=CWD
在第二条记录中,类型为 CWD
— 当前工作目录。 此类型用于记录触发第一条记录中指定的系统调用的进程所执行的工作目录。
cwd="/home/sammy"
cwd
字段包含调用系统调用的目录的路径。 在我们的例子中,在第一条记录中触发 open
系统调用的 cat
命令是从目录 /home/sammy
执行的。
第三条记录:
type=PATH
在第三条记录中,类型为PATH
。 审核事件包含作为参数传递给系统调用的每个路径的 PATH
记录。 在我们的审计事件中,只有一个路径 (/etc/ssh/sshd_config
) 用作参数。
msg=audit(1434371271.277:135496):
msg
字段显示与第一条和第二条记录相同的时间戳和 ID 组合,因为所有三个记录都是同一审计事件的一部分。
name="/etc/ssh/sshd_config"
name
字段记录了作为参数传递给系统调用(open)的文件或目录的完整路径。 在这种情况下,它是 /etc/ssh/sshd_config
文件。
ouid=0
ouid
字段记录对象所有者的用户 ID。 这里的对象是文件 /etc/ssh/sshd_config
。
注意: 有关审计记录类型的更多信息,请访问本教程末尾的链接。
在审计日志中搜索事件
Linux 审计系统附带了一个名为 ausearch
的强大工具,用于搜索审计日志。 使用 ausearch
,您可以过滤和搜索事件类型。 它还可以通过将数值转换为人类可读的值(如系统调用或用户名)来为您解释事件。
让我们看几个例子。
以下命令将在审计日志中搜索从今天开始的所有 LOGIN 类型的审计事件并解释用户名。
sudo ausearch -m LOGIN --start today -i
下面的命令将搜索事件 ID 为 27020 的所有事件(前提是存在具有该 ID 的事件)。
sudo ausearch -a 27020
此命令将搜索所有触及文件 /etc/ssh/sshd_config
的事件(如果有)并解释它们:
sudo ausearch -f /etc/ssh/sshd_config -i
生成审计报告
您可以使用工具 aureport
获取审计消息的摘要,而不是阅读原始审计日志。 它以人类可读的格式提供报告。 这些报告可用作更复杂分析的构建块。 当 aureport
在没有任何选项的情况下运行时,它将显示审计日志中存在的不同类型事件的摘要。 当与搜索选项一起使用时,它将显示与搜索条件匹配的事件列表。
让我们尝试一些 aureport
的示例。 如果要生成服务器上所有命令执行的摘要报告,请运行:
sudo aureport -x --summary
输出看起来像这样,具有不同的值:
Executable Summary Report ================================= total file ================================= 117795 /usr/sbin/sshd 1776 /usr/sbin/crond 210 /usr/bin/sudo 141 /usr/bin/date 24 /usr/sbin/autrace 18 /usr/bin/su
第一列显示命令执行的次数,第二列显示执行的命令。 请注意,并非所有命令都默认记录。 仅记录与安全相关的内容。
以下命令将为您提供所有失败事件的统计信息:
sudo aureport --failed
输出类似于:
Failed Summary Report ====================== Number of failed logins: 11783 Number of failed authentications: 41679 Number of users: 3 Number of terminals: 4 Number of host names: 203 Number of executables: 3 Number of files: 4 Number of AVC's: 0 Number of MAC events: 0 Number of failed syscalls: 9
要生成有关使用系统调用和用户名访问的文件的报告:
sudo aureport -f -i
样本输出:
File Report =============================================== # date time file syscall success exe auid event =============================================== 1. Monday 15 June 2015 08:27:51 /etc/ssh/sshd_config open yes /usr/bin/cat sammy 135496 2. Tuesday 16 June 2015 00:40:15 /etc/ssh/sshd_config getxattr no /usr/bin/ls root 147481 3. Tuesday 16 June 2015 00:40:15 /etc/ssh/sshd_config lgetxattr yes /usr/bin/ls root 147482 4. Tuesday 16 June 2015 00:40:15 /etc/ssh/sshd_config getxattr no /usr/bin/ls root 147483 5. Tuesday 16 June 2015 00:40:15 /etc/ssh/sshd_config getxattr no /usr/bin/ls root 147484 6. Tuesday 16 June 2015 05:40:08 /bin/date execve yes /usr/bin/date root 148617
要以摘要格式查看相同内容,您可以运行:
sudo aureport -f -i --summary
注意: 只要输入是原始日志数据格式,aureport
工具也可以从标准输入而不是日志文件中获取输入。
使用 autrace 分析进程
要审计单个进程,我们可以使用 autrace
工具。 该工具跟踪进程执行的系统调用。 这对于调查可疑的特洛伊木马或有问题的进程很有用。 autrace
的输出被写入 /var/log/audit/audit.log
并且看起来类似于标准审计日志条目。 执行后,autrace
将为您提供一个示例 ausearch
命令来调查日志。 始终使用二进制文件的完整路径来跟踪 autrace,例如 sudo autrace /bin/ls /tmp
。
注意:请注意,运行autrace
将删除所有自定义审核规则。 它将它们替换为跟踪您指定的过程所需的特定规则。 autrace
完成后,会清除它添加的新规则。 出于同样的原因,当您的审核规则设置为不可变时,autrace
将不起作用。
举个例子,比如说我们要跟踪进程date
,查看它使用的文件和系统调用。 运行以下命令:
sudo autrace /bin/date
您应该会看到类似于以下内容的内容:
Waiting to execute: /bin/date Wed Jun 17 07:22:03 EDT 2015 Cleaning up... Trace complete. You can locate the records with 'ausearch -i -p 27020'
您可以使用上述输出中的 ausearch
命令查看相关日志,甚至将其传递给 aureport
以获得格式良好的人类可读输出:
sudo ausearch -p 27020 --raw | aureport -f -i
此命令从审核日志中搜索事件 ID 为 27020
的事件,以原始日志格式提取它,并将其传递给 aureport
,后者反过来解释并以更好的格式给出结果为了更容易阅读。
您应该会看到类似于以下内容的输出:
File Report =============================================== # date time file syscall success exe auid event =============================================== 1. Wednesday 17 June 2015 07:22:03 /bin/date execve yes /usr/bin/date sammy 169660 2. Wednesday 17 June 2015 07:22:03 /etc/ld.so.preload access no /usr/bin/date sammy 169663 3. Wednesday 17 June 2015 07:22:03 /etc/ld.so.cache open yes /usr/bin/date sammy 169664 4. Wednesday 17 June 2015 07:22:03 /lib64/libc.so.6 open yes /usr/bin/date sammy 169668 5. Wednesday 17 June 2015 07:22:03 /usr/lib/locale/locale-archive open yes /usr/bin/date sammy 169683 6. Wednesday 17 June 2015 07:22:03 /etc/localtime open yes /usr/bin/date sammy 169691
结论
我们在本教程中介绍了 Linux 审计系统的基础知识。 您现在应该对审计系统的工作原理、如何阅读审计日志以及可以让您更轻松地审计服务器的不同工具有了很好的了解。
默认情况下,审计系统只在日志中记录少数事件,例如用户登录和使用 sudo 的用户。 还会记录与 SELinux 相关的消息。 审计守护程序使用规则来监视特定事件并创建相关的日志条目。 可以创建自定义审计规则来监控和记录我们想要的任何内容。 这就是审计系统对系统管理员来说变得强大的地方。 我们可以使用命令行工具 auditctl
或在文件 /etc/audit/rules.d/audit.rules
中永久添加规则。 Writing Custom System Audit Rules on CentOS 7 教程中详细讨论了编写自定义规则和使用预定义规则集。
您还可以查看以下资源,了解有关审计系统的更多信息: