香港服务器安全审计:如何使用Auditd监控Linux系统调用?

auditd:审计守护进程,负责在后台运行,收集并记录审计信息。auditctl:用于控制auditd运行时的工具,可以添加、删除规则,以及查看状态。ausearch:用于查询auditd日志的···

  1. auditd:审计守护进程,负责在后台运行,收集并记录审计信息。

  2. auditctl:用于控制 auditd 运行时的工具,可以添加、删除规则,以及查看状态。

  3. ausearch:用于查询 auditd 日志的工具,可以根据多种条件进行搜索。

  4. aureport:用于生成审计日志的汇总报告。

  5. 审计规则:定义系统需要监控什么事件。规则分为两类:

    • 控制规则:配置审计系统本身(如日志文件大小、失败策略)。

    • 文件系统规则:监控对特定文件或目录的访问。

    • 系统调用规则监控特定的系统调用,这是最强大的功能。


二、 监控系统调用:核心语法与示例

使用 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>:指定要监控的系统调用(如 openatexecveconnect)。可以指定多个 -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=1000auid 是 审计用户ID,代表用户登录时的原始身份,即使用 sudo 也不会改变。这是追踪用户行为的最佳字段。

示例 4:监控可疑的网络连接行为

监控所有失败的(exit=-1connect 系统调用,这可能意味着端口扫描或连接后门失败。

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 添加的规则在重启后会丢失。要永久生效,需要将规则写入配置文件。

  1. 编辑规则文件:/etc/audit/rules.d/audit.rules(在某些系统上是 /etc/audit/audit.rules)。

  2. 将 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

  1. 重新加载规则以使永久规则生效:

    bash

    # 方法1:重启auditd服务systemctl restart auditd# 方法2:使用auditctl清除所有规则并重新读取配置文件(推荐,无需重启服务)auditctl -R /etc/audit/rules.d/audit.rules


六、 最佳实践与注意事项

  1. 明确目标:不要无差别地记录所有系统调用,这会产生大量日志,淹没真正重要的事件。始终从你的安全目标出发(如“监控敏感文件变更”、“监控特权操作”)。

  2. 使用有意义的 Key-k 后面的关键词要清晰明了,便于后续搜索和报告。

  3. 善用过滤条件 -F:这是精确审计的关键。常用字段:

    • auid:审计用户ID(最可靠的用户标识)。

    • uidgid:当前进程的用户/组ID。

    • path:文件路径。

    • success:成功(1)或失败(0)。

    • arch:系统架构(b32 用于32位,b64 用于64位)。

  4. 监控日志大小:审计日志会快速增长,确保 /var/log/ 分区有足够空间,并配置日志轮转(通常由 auditd 自身管理)。

  5. 性能影响:过于复杂的规则可能会对系统性能产生轻微影响,在生产环境中添加规则后需观察性能。

通过以上步骤,你可以系统地使用 Auditd 来监控 Linux 系统的系统调用,为安全审计和事件响应提供强大的底层数据支持。

生成文章图片 (49).jpg

您好:云优数据云计算 www.yunyoushuju.cn 2核2G6M最低19.9元/月 欢迎开机

发表评论

评论列表
未查询到任何数据!