跳转到内容

系统审计 (auditd)

auditd(Linux Audit Daemon)是 Linux 内核级别的安全审计框架,能够记录系统调用、文件访问、用户操作等关键事件。它是满足安全合规要求(如 PCI-DSS、HIPAA、等保)的重要工具。

大多数企业 Linux 发行版已预装 auditd,如未安装:

Terminal window
sudo dnf install audit audit-libs -y
Terminal window
sudo systemctl enable --now auditd

查看服务状态:

Terminal window
sudo systemctl status auditd
组件说明
auditd审计守护进程,负责将审计事件写入日志
auditctl审计规则管理工具(临时规则)
ausearch审计日志搜索工具
aureport审计日志报告生成工具
/etc/audit/auditd.confauditd 服务配置文件
/etc/audit/rules.d/持久化审计规则目录
/var/log/audit/audit.log审计日志文件

auditctl 用于在运行时添加、删除和查看审计规则。通过 auditctl 添加的规则是临时的,重启后会丢失。

Terminal window
sudo auditctl -l
Terminal window
sudo auditctl -s

auditd 支持三类规则:

  1. 文件系统规则(-w):监控文件或目录的访问
  2. 系统调用规则(-a):监控特定的系统调用
  3. 控制规则(-e, -b 等):控制审计系统行为
-w 路径 -p 权限 -k 关键字

权限标志:

标志说明
r读取
w写入
x执行
a属性变更
Terminal window
# 监控 /etc/passwd 的所有修改
sudo auditctl -w /etc/passwd -p wa -k identity
# 监控 /etc/shadow 的所有访问
sudo auditctl -w /etc/shadow -p rwa -k identity
# 监控 /etc/sudoers 的修改
sudo auditctl -w /etc/sudoers -p wa -k sudoers_change
# 监控 /etc/ssh/sshd_config 的修改
sudo auditctl -w /etc/ssh/sshd_config -p wa -k sshd_config
# 监控 /etc/hosts 的修改
sudo auditctl -w /etc/hosts -p wa -k hosts_change
Terminal window
# 监控 /etc/audit/ 目录下所有文件的修改
sudo auditctl -w /etc/audit/ -p wa -k audit_config
# 监控 cron 配置
sudo auditctl -w /etc/cron.d/ -p wa -k cron_change
sudo auditctl -w /etc/crontab -p wa -k cron_change
-a action,filter -S 系统调用 -F 字段=值 -k 关键字

常用参数:

参数说明
-a always,exit总是在系统调用退出时记录
-S指定系统调用名称或编号
-F arch=b6464 位系统架构
-F uid=0过滤用户 ID
-F auid>=1000过滤审计 UID(真实登录用户)
-F auid!=-1排除未登录用户(系统进程)
-k关键字标签,用于后续搜索
Terminal window
# 监控 sudo 使用
sudo auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k privilege_escalation
# 监控 su 使用
sudo auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -k privilege_escalation
# 监控 passwd 命令
sudo auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/passwd -k password_change
Terminal window
# 监控用户和组管理命令
sudo auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/useradd -k user_management
sudo auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/userdel -k user_management
sudo auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/usermod -k user_management
sudo auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/groupadd -k user_management
Terminal window
sudo auditctl -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=-1 -k file_deletion
Terminal window
sudo auditctl -a always,exit -F arch=b64 -S connect -F auid>=1000 -F auid!=-1 -k network_connect
Terminal window
# 删除所有临时规则
sudo auditctl -D
# 删除特定文件监控规则
sudo auditctl -W /etc/passwd -p wa -k identity

临时规则重启后会丢失。要使规则持久化,需要写入 /etc/audit/rules.d/ 目录下的文件。

Terminal window
sudo vi /etc/audit/rules.d/custom.rules

添加如下内容:

Terminal window
# 清除已有规则
-D
# 设置审计缓冲区大小
-b 8192
# 设置失败处理模式(0=静默,1=打印,2=panic)
-f 1
# ========== 文件访问监控 ==========
# 身份认证文件
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
# SSH 配置
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /etc/ssh/sshd_config.d/ -p wa -k sshd_config
# 权限提升配置
-w /etc/sudoers -p wa -k sudoers_change
-w /etc/sudoers.d/ -p wa -k sudoers_change
# 审计配置自身
-w /etc/audit/ -p wa -k audit_config
-w /var/log/audit/ -p wa -k audit_log
# 网络配置
-w /etc/hosts -p wa -k network_config
-w /etc/sysconfig/network-scripts/ -p wa -k network_config
# 定时任务
-w /etc/crontab -p wa -k cron_change
-w /etc/cron.d/ -p wa -k cron_change
-w /var/spool/cron/ -p wa -k cron_change
# ========== 命令执行监控 ==========
# 特权命令
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k privilege_escalation
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -k privilege_escalation
# 用户管理
-a always,exit -F arch=b64 -S execve -F path=/usr/sbin/useradd -k user_management
-a always,exit -F arch=b64 -S execve -F path=/usr/sbin/userdel -k user_management
-a always,exit -F arch=b64 -S execve -F path=/usr/sbin/usermod -k user_management
# 文件删除
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=-1 -k file_deletion
# 系统时间修改
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -k time_change
# ========== 锁定规则(放在最后) ==========
# 取消注释以下行可防止规则在运行时被修改(需要重启才能更改规则)
# -e 2
Terminal window
sudo augenrules --load

或重启 auditd:

Terminal window
sudo service auditd restart

验证规则已加载:

Terminal window
sudo auditctl -l

ausearch 是审计日志的强大搜索工具。

Terminal window
# 搜索身份文件变更事件
sudo ausearch -k identity
# 搜索权限提升事件
sudo ausearch -k privilege_escalation
Terminal window
# 搜索今天的事件
sudo ausearch -k identity -ts today
# 搜索最近 1 小时的事件
sudo ausearch -k identity -ts recent
# 搜索指定时间范围
sudo ausearch -ts 03/24/2026 09:00:00 -te 03/24/2026 18:00:00
Terminal window
# 搜索指定用户的操作
sudo ausearch -ua 1000
# 搜索 root 用户的操作
sudo ausearch -ua 0
Terminal window
# 搜索登录事件
sudo ausearch -m USER_LOGIN
# 搜索认证事件
sudo ausearch -m USER_AUTH
# 搜索系统调用事件
sudo ausearch -m SYSCALL -k file_deletion
Terminal window
# 以可读格式输出
sudo ausearch -k identity -i

-i 参数会将 UID、GID、系统调用号等转换为可读的名称。

Terminal window
sudo ausearch -f /etc/passwd
sudo ausearch -f /etc/shadow -i

aureport 可以生成各类审计统计报告。

Terminal window
sudo aureport --summary
Terminal window
# 认证报告
sudo aureport -au
# 登录报告
sudo aureport -l
# 失败的认证报告
sudo aureport -au --failed
# 文件访问报告
sudo aureport -f
# 可执行文件报告
sudo aureport -x
# 用户报告
sudo aureport -u
# 系统调用报告
sudo aureport -s
# 异常事件报告
sudo aureport --anomaly
# 按关键字生成报告
sudo aureport -k
Terminal window
sudo aureport -au -ts today
sudo aureport -l -ts 03/24/2026 09:00:00 -te 03/24/2026 18:00:00

可以使用管道将 ausearch 的结果传给 aureport:

Terminal window
# 查看今天的失败登录详情
sudo ausearch -m USER_LOGIN --failed -ts today | aureport -l
# 查看特定关键字的文件访问统计
sudo ausearch -k identity | aureport -f --summary
Terminal window
sudo vi /etc/audit/auditd.conf

关键参数:

# 日志文件路径
log_file = /var/log/audit/audit.log
# 日志格式(RAW 或 ENRICHED)
log_format = ENRICHED
# 单个日志文件最大大小(MB)
max_log_file = 50
# 达到最大大小后的处理(ROTATE, SYSLOG, SUSPEND, KEEP_LOGS)
max_log_file_action = ROTATE
# 保留的日志文件数量
num_logs = 10
# 磁盘空间不足时的处理
space_left = 75
space_left_action = SYSLOG
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
  1. 确认 auditd 已安装并运行:

    Terminal window
    sudo dnf install audit -y
    sudo systemctl enable --now auditd
    sudo auditctl -s
  2. 创建审计规则文件:

    Terminal window
    sudo tee /etc/audit/rules.d/security.rules <<'EOF'
    -D
    -b 8192
    -f 1
    # 身份文件监控
    -w /etc/passwd -p wa -k identity
    -w /etc/shadow -p wa -k identity
    -w /etc/group -p wa -k identity
    -w /etc/sudoers -p wa -k sudoers_change
    -w /etc/sudoers.d/ -p wa -k sudoers_change
    # SSH 配置监控
    -w /etc/ssh/sshd_config -p wa -k sshd_config
    # 特权命令监控
    -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k privilege_escalation
    -a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -k privilege_escalation
    # 用户管理命令监控
    -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/useradd -k user_mgmt
    -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/userdel -k user_mgmt
    -a always,exit -F arch=b64 -S execve -F path=/usr/sbin/usermod -k user_mgmt
    # 文件删除监控
    -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=-1 -k file_deletion
    EOF
  3. 加载规则:

    Terminal window
    sudo augenrules --load
    sudo auditctl -l
  4. 测试审计是否正常工作:

    Terminal window
    # 修改一个被监控的文件
    sudo touch /etc/passwd
    # 搜索对应的审计记录
    sudo ausearch -k identity -ts recent -i
  5. 生成每日审计报告:

    Terminal window
    # 汇总报告
    sudo aureport --summary -ts today
    # 认证报告
    sudo aureport -au -ts today
    # 关键字报告
    sudo aureport -k -ts today
  6. 可选:设置每日自动报告(添加 cron 任务):

    sudo tee /etc/cron.daily/audit-report <<'EOF'
    #!/bin/bash
    aureport --summary -ts yesterday -te today > /var/log/audit/daily-report-$(date +%Y%m%d).txt
    aureport -au --failed -ts yesterday -te today >> /var/log/audit/daily-report-$(date +%Y%m%d).txt
    EOF
    sudo chmod +x /etc/cron.daily/audit-report

auditd 是 Linux 系统安全审计的基石。通过合理配置审计规则,可以全面追踪系统中的关键操作,为安全事件调查和合规审计提供可靠的数据支撑。