auditd是记录所有命令执行轨迹的唯一可靠手段,必须启用服务、配置双架构execve规则(-F arch=b64/b32 -S execve)、持久化保存至/etc/audit/rules.d/、加固日志防篡改,并配合shell联动syslog增强上下文。

要开启命令审计、记录所有操作轨迹,不能只靠 .bash_history 或简单配置。真正可靠的方式是启用内核级审计框架 auditd,并辅以必要加固措施,覆盖交互式、非交互式、sudo/su、cron、脚本调用等全部路径。
启用 auditd 并配置 execve 捕获规则
这是记录所有命令执行(含参数)的唯一可靠手段,因为所有程序启动最终都经过 execve() 系统调用。
-
确保服务已安装并运行:
sudo apt install auditd -y # Debian/Ubuntu sudo yum install audit -y # CentOS/RHEL sudo systemctl enable --now auditd
-
启用参数记录(关键步骤,否则日志无命令行):
echo 1 | sudo tee /proc/sys/kernel/audit_backlog_limit sudo auditctl -e 2 sudo auditctl -s | grep argv # 应显示 argv=1
-
添加双架构规则(x86_64 必须同时加 b64 + b32):
sudo auditctl -a always,exit -F arch=b64 -S execve -k cmd_log sudo auditctl -a always,exit -F arch=b32 -S execve -k cmd_log
-
持久化保存到
/etc/audit/rules.d/cmd.rules,然后重载:sudo augenrules --load
加固审计日志自身防篡改
避免攻击者清空或删除日志:
-
保护审计日志目录:
sudo auditctl -w /var/log/audit/ -p wa -k audit_log
-
设置日志轮转与权限:
编辑/etc/audit/auditd.conf,确认:max_log_file = 50 num_logs = 10 flush = incremental freq = 20
补充用户级上下文增强可读性
auditd 记录了“谁执行了什么”,但缺少终端、工作目录、返回值等。可在全局 shell 配置中联动 syslog:
-
在
/etc/bash.bashrc或/etc/profile.d/audit-logger.sh中添加:export HISTTIMEFORMAT="%Y-%m-%d %T " export PROMPT_COMMAND='RETRN=$?; logger -p local6.info "$(whoami) [$$] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//") [$RETRN]"'
-
配置 rsyslog 将 local6 日志转发至中央服务器(如
/etc/rsyslog.d/50-audit.conf):local6.* @logger.example.com:514
验证与日常查询方法
别直接翻 audit.log,用专用工具提取结构化结果:
-
查某用户全部命令(含参数):
sudo ausearch -u username -m execve --raw | aureport -f -i
-
查某次登录会话(如 tty1)完整轨迹:
sudo ausearch -ts recent -m event --session $(loginctl show-user username | grep Session | cut -d= -f2)
-
查含敏感关键词的命令(如
rm,passwd):sudo ausearch -m execve | grep -i -E "(rm|passwd|chmod|chown)"
不复杂但容易忽略


















