auditd:审计守护进程,负责在后台运行,收集并记录审计信息。auditctl:用于控制auditd运行时的工具,可以添加、删除规则,以及查看状态。ausearch:用于查询auditd日志的···
auditd:审计守护进程,负责在后台运行,收集并记录审计信息。
auditctl:用于控制
auditd运行时的工具,可以添加、删除规则,以及查看状态。ausearch:用于查询
auditd日志的工具,可以根据多种条件进行搜索。aureport:用于生成审计日志的汇总报告。
审计规则:定义系统需要监控什么事件。规则分为两类:
控制规则:配置审计系统本身(如日志文件大小、失败策略)。
文件系统规则:监控对特定文件或目录的访问。
系统调用规则:监控特定的系统调用,这是最强大的功能。
二、 监控系统调用:核心语法与示例
使用 auditctl 来添加系统调用规则。
基本语法
bash
auditctl -a <list>,<action> -S <system_call> -F <field=value> -k <key_name>
-a <list>,<action>:<list>:规则要加入的列表。常用task(在任务创建时检查)、entry(系统调用入口时)、exit(系统调用退出时)、user(用户空间事件)、exclude(过滤不需要的事件)。<action>:匹配规则后的动作,总是always。-S <system_call>:指定要监控的系统调用(如openat,execve,connect)。可以指定多个-S。-F <field=value>:定义过滤条件,使规则更精确。可以指定多个-F。-k <key_name>:一个可选的“关键词”,用于在日志中标记事件,方便后续搜索。
三、 实战示例:从简单到复杂
在开始前,先查看当前规则:auditctl -l
示例 1:监控所有文件的读写操作(简单但粗暴)
这会监控 openat 系统调用(常用于打开文件),并记录所有成功(exit=success)的操作。
bash
auditctl -a always,exit -S openat -F success=1
问题:这会产生海量日志,仅用于测试,不要在生产环境长期使用。
示例 2:监控 /etc/passwd 文件的任何写操作
这是一个更实际的例子。我们关心任何可能修改此文件的系统调用,如 openat(用写模式打开)、write。
bash
# 方法1:使用文件系统规则(更简单直接)auditctl -w /etc/passwd -p wa -k passwd_change# 方法2:使用系统调用规则(更底层)auditctl -a always,exit -S openat -S unlink -S rename -F "path=/etc/passwd" -F perm=wa -k passwd_change
-w /etc/passwd:监控此路径。-p wa:监控写权限或属性更改。-F "path=/etc/passwd":过滤路径。-F perm=wa:过滤访问权限(w=写,a=属性改变)。
示例 3:监控特定用户执行的命令
监控用户 uid=1000 执行的所有 execve 系统调用(用于执行程序)。
bash
auditctl -a always,exit -S execve -F auid=1000 -k user_cmd
-F auid=1000:auid是 审计用户ID,代表用户登录时的原始身份,即使用sudo也不会改变。这是追踪用户行为的最佳字段。
示例 4:监控可疑的网络连接行为
监控所有失败的(exit=-1)connect 系统调用,这可能意味着端口扫描或连接后门失败。
bash
auditctl -a always,exit -S connect -F success=0 -k failed_connect
监控所有对外部 IP(非本地回环)的 connect 调用。
bash
auditctl -a always,exit -S connect -F "a0!=2" -k external_connect
-F "a0!=2":a0是connect系统调用的第一个参数(地址族)。2代表AF_INET(IPv4)。这个条件不完整,但意在展示如何使用参数。更精确的过滤需要更复杂的条件。
示例 5:监控特权提升
监控所有使用 setuid/setgid 的程序执行。
bash
auditctl -a always,exit -S execve -F "a0&0x1" -k suid_exec
-F "a0&0x1":这是一个位运算过滤,用于检查execve的a0参数(flags)是否包含SUID位。注意:此语法可能因架构和内核版本而异,仅供参考,实际使用时需验证。
四、 查看与分析审计日志
规则生效后,日志会记录在 /var/log/audit/audit.log 中。
1. 使用 ausearch 搜索
根据我们之前设置的 -k 关键词搜索:
bash
# 搜索所有带有关键词 ‘passwd_change’ 的事件ausearch -k passwd_change# 搜索今天发生的失败连接事件ausearch -k failed_connect --start today# 搜索特定用户ID执行命令的事件ausearch -k user_cmd -ui 1000# 搜索特定时间范围内的事件ausearch -ts "2024-01-01 00:00:00" -te "2024-01-01 12:00:00"
2. 使用 aureport 生成报告
生成一个关于所有系统调用事件的汇总报告:
bash
# 生成系统调用事件报告aureport -s# 生成关于关键字的报告aureport -k# 生成认证事件报告(如用户登录)aureport -au# 生成可执行文件执行报告aureport -x# 生成一个总结报告aureport --summary
五、 让规则永久生效
通过 auditctl 添加的规则在重启后会丢失。要永久生效,需要将规则写入配置文件。
编辑规则文件:
/etc/audit/rules.d/audit.rules(在某些系统上是/etc/audit/audit.rules)。将
auditctl命令的规则部分写入文件,去掉auditctl命令本身。
例如,将示例2和3的规则永久化:
bash
# 在 /etc/audit/rules.d/audit.rules 文件中添加以下行# 监控 /etc/passwd-w /etc/passwd -p wa -k passwd_change# 监控 uid=1000 用户的命令执行-a always,exit -S execve -F auid=1000 -k user_cmd
重新加载规则以使永久规则生效:
bash
# 方法1:重启auditd服务systemctl restart auditd# 方法2:使用auditctl清除所有规则并重新读取配置文件(推荐,无需重启服务)auditctl -R /etc/audit/rules.d/audit.rules
六、 最佳实践与注意事项
明确目标:不要无差别地记录所有系统调用,这会产生大量日志,淹没真正重要的事件。始终从你的安全目标出发(如“监控敏感文件变更”、“监控特权操作”)。
使用有意义的 Key:
-k后面的关键词要清晰明了,便于后续搜索和报告。善用过滤条件
-F:这是精确审计的关键。常用字段:auid:审计用户ID(最可靠的用户标识)。uid,gid:当前进程的用户/组ID。path:文件路径。success:成功(1)或失败(0)。arch:系统架构(b32用于32位,b64用于64位)。监控日志大小:审计日志会快速增长,确保
/var/log/分区有足够空间,并配置日志轮转(通常由auditd自身管理)。性能影响:过于复杂的规则可能会对系统性能产生轻微影响,在生产环境中添加规则后需观察性能。
通过以上步骤,你可以系统地使用 Auditd 来监控 Linux 系统的系统调用,为安全审计和事件响应提供强大的底层数据支持。


发表评论
最近发表
标签列表