审计框架
Linux 审计框架提供了一个符合 CAPP(Controlled Access Protection Profile)标准的审计系统,它能够可靠地收集系统上任何安全相关(或非安全相关)事件的信息。它可以帮助您跟踪在系统上执行的操作。
Linux 审计通过提供详细分析系统上发生情况的手段,有助于提高系统的安全性。但是,它本身不提供额外的安全性——它不会保护您的系统免受代码故障或任何类型的漏洞利用。相反,审计对于跟踪这些问题非常有用,并帮助您采取额外的安全措施来防止它们。
审计框架通过监听内核报告的事件并将其记录到日志文件中来工作。
安装
内核中的审计支持在所有 官方支持的内核中都可用。对于自定义内核,应启用 CONFIG_AUDIT。用户空间支持由 audit 包提供,该包已作为 base 包的依赖项安装。
可以通过将 audit=1 设置为 内核参数来在启动时启用审计。这将确保在审计守护进程启动之前运行的所有进程都被内核标记为可审计。如果不这样做,一些进程将无法被正确审计。请参阅 auditd(8)。
审计框架由 auditd 守护进程组成,该守护进程负责写入通过审计内核接口生成并由应用程序和系统活动触发的审计消息。 启动/启用 auditd.service 来激活该守护进程。
此守护进程可以通过多个命令和文件进行控制
- auditctl(8):用于实时控制守护进程的行为,添加规则等。
/etc/audit/audit.rules:包含规则和 auditd 守护进程的各种参数。该文件由audit-rules.service从/etc/audit/rules.d/自动生成。有关详细信息,请参阅 audit.rules(7) 和 augenrules(8)。- aureport(8):生成系统活动报告
- ausearch(8):搜索各种事件
- auditspd:一个守护进程,可以用来将事件通知中继给其他应用程序,而不是将它们写入审计日志文件。
- autrace:这个命令可以用来跟踪一个进程,类似于 strace。
/etc/audit/auditd.conf:与日志记录相关的配置文件。有关详细信息,请参阅 auditd.conf(5)。
添加规则
在添加规则之前,您必须知道审计框架可能非常冗长,并且每条规则在实际部署之前都必须仔细测试。事实上,仅仅一条规则就可能在几分钟内使您的所有日志泛滥。
审计文件和目录访问
审计框架最基本的使用是记录您想要监控的文件访问。为此,您必须使用 -w 选项后跟一个路径来监视文件或目录。最基本的设置规则是跟踪对 passwd 文件的访问。
# auditctl -a always,exit -F arch=b64 -F path=/etc/passwd -F perm=rwxa # auditctl -a always,exit -F arch=b32 -F path=/etc/passwd -F perm=rwxa
您可以使用以下命令跟踪对文件夹的访问:
# auditctl -a always,exit -F arch=b64 -F dir=/etc/security # auditctl -a always,exit -F arch=b32 -F dir=/etc/security
第一条规则跟踪对文件 /etc/passwd 的所有读取 r 、写入 w 、执行 x 、属性更改 a 操作。第二条规则跟踪对 /etc/security/ 文件夹的任何访问。
您可以使用以下命令列出所有活动的规则:
# auditctl -l
您可以使用以下命令删除所有规则:
# auditctl -D
一旦您验证了规则,就可以将它们添加到 /etc/audit/rules.d/ 中的 .rules 文件中。
/etc/audit/rules.d/example.rules
-a always,exit -F arch=b64 -F path=/etc/passwd -F perm=rwxa -a always,exit -F arch=b32 -F path=/etc/passwd -F perm=rwxa -a always,exit -F arch=b64 -F dir=/etc/security -a always,exit -F arch=b32 -F dir=/etc/security
审计系统调用
审计框架允许您使用 -a 选项审计执行的系统调用。
一条与安全相关的规则是跟踪 chmod(2) 系统调用,以检测文件所有权的更改。
# auditctl -a exit,always -S chmod
所有系统调用的列表: syscalls(2)
有许多可用的规则和可能性,请参阅 auditctl(8) 和 audit.rules(7)。
过滤不需要的消息
为了防止嘈杂的审计消息淹没系统日志,您可以添加规则来排除其中一些。
/etc/audit/rules.d/quiet.rules
-a exclude,always -F msgtype=SERVICE_START -a exclude,always -F msgtype=SERVICE_STOP -a exclude,always -F msgtype=BPF -a exclude,always -F exe=/usr/bin/sudo
请记住验证更改(必要时修复)并按如下方式重新生成 /etc/audit/audit.rules:
# augenrules --check # augenrules --load
搜索日志
审计框架提供了一些工具来简化系统上事件的使用和搜索。
使用 PID
您可以使用 ausearch 搜索与特定 PID 相关的事件。
# ausearch -p 1
此命令将显示与 PID 1(即 systemd)相关的所有根据您的规则记录的事件。
使用密钥
审计框架的一大特点是其使用 密钥 来管理事件的能力,这种用法是推荐的。
您可以在规则中使用 -F key= 选项,以便能够轻松找到相关事件。
# auditctl -a always,exit -F arch=b64 -F path=/etc/passwd -F perm=rwxa -F key=KEY_pwd
然后,如果您搜索带有密钥 KEY_pwd 的事件,ausearch 将只显示与文件 /etc/passwd 相关的事件。
# ausearch -k KEY_pwd
查找异常
aureport 工具可用于快速报告系统上执行的任何异常事件,包括在混杂模式下使用的网络接口、进程或线程崩溃或因 ENOMEM 错误退出等。
使用 aureport 的最简单方法是:
# aureport -n
aureport 可用于生成自定义报告,请参阅 aureport(8)。
哪些文件或系统调用值得审计?
请记住,每添加一条审计规则都会生成日志,因此您必须准备好处理这些信息量。基本上,每个与安全相关的事件/文件都必须被监控,例如 ids、ips、反rootkits 等。另一方面,跟踪每一个写系统调用是完全没有用的,最小的编译就会用这个事件填满您的日志。
可以设置更复杂的规则集,进行非常精细的审计。如果您想这样做,请参阅 auditctl(8)。
从不同主机收集日志
审计框架有一个插件系统,提供了将本地日志文件发送到远程 auditd 的可能性。
发送日志文件
要将日志文件发送到远程主机,您需要 audisp-remote 插件,该插件随 audit 包自动安装。激活该插件:
/etc/audisp/plugins.d/au-remote.conf
active = yes direction = out path = /usr/bin/audisp-remote type = always format = string
并设置日志应发送到的远程主机:
/etc/audisp/audisp-remote.conf
remote_server = domain.name.or.ip port = 60 ##local_port = optional transport = tcp
接收日志文件
要让 audit 监听远程 audispd,您只需设置 tcp 选项:
/etc/audit/auditd.conf
tcp_listen_port = 60 tcp_listen_queue = 5 tcp_max_per_addr = 1 ##tcp_client_ports = 1024-65535 #optional tcp_client_max_idle = 0
现在您可以在接收 auditd 的日志文件中查看所有配置主机的日志。
轮转日志
向审计守护进程发送 SIGUSR1 信号。
# pkill -USR1 -x auditd
故障排除
审计日志涌入虚拟控制台
对于未启用 auditd 的用户,使用高于 loglevel=4 的内核调试消息可能会导致审计在虚拟终端之上产生安全通知泛滥。
可以通过 启用 auditd.service 来抑制这些消息。
替代解决方案是:
- 降低您的 loglevel;
- 使用 内核参数
audit=0禁用审计日志。
有关详细信息,请参阅 GitHub 上的 systemd issue 15324。