真正可用的审计必须从系统层入手,用auditd捕获execve系统调用为核心手段,辅以PROMPT_COMMAND实时落盘和rsyslog远程转发,并落实规则持久化、防篡改等加固措施。

Linux 审计用户历史操作命令不能只靠 history 命令或 ~/.bash_history 文件——它只是 shell 的本地缓存,易被清除、不记录非交互式执行(如 ssh user@host 'cmd')、无法捕获 su/sudo -i 切换后的命令,更不会保存执行时间、终端、IP 等上下文。真正可用的审计必须从系统层入手,分层次覆盖所有执行路径。
用 auditd 捕获 execve 系统调用(核心手段)
这是唯一能覆盖全部场景的方式:无论命令来自交互终端、cron、脚本、SSH 非交互调用,还是通过 sudo 或 su 执行,最终都触发 execve() 系统调用。auditd 可精准记录 UID、PID、TTY、命令路径及参数。
- 确认内核支持 argv 记录:
echo 1 > /proc/sys/kernel/audit_backlog_limit;运行auditctl -e 2 && auditctl -s | grep argv,输出含argv=1表示启用成功 - 添加双架构规则(x86_64 必须同时配置 b64 和 b32):
-a always,exit -F arch=b64 -S execve -k cmd_audit-a always,exit -F arch=b32 -S execve -k cmd_audit - 将规则写入
/etc/audit/rules.d/cmd.rules,重启服务:systemctl restart auditd - 查某用户所有命令:
ausearch -u username -m execve --raw | aureport -f -i
用 PROMPT_COMMAND 实现用户级实时落盘(辅助增强)
对交互式 shell 提供补充记录,确保命令执行后立刻写入日志文件,避免因异常退出导致丢失。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 在
/etc/profile.d/audit_cmd.sh中添加:export HISTTIMEFORMAT="%Y-%m-%d %T "export HISTFILE="/var/log/bash_history_$(whoami)"export PROMPT_COMMAND='history -a' - 设置权限防止篡改:
chmod 600 /var/log/bash_history_* - 注意:该方式对
unset HISTFILE或history -c无效,仅作辅助线索
用 rsyslog 转发命令事件至远程审计平台
把命令行为作为日志事件实时发送出去,便于集中存储、分析与告警,适合等保、金融等合规场景。
- 在
/etc/profile.d/bash-audit.sh中定义捕获函数:function log_command { local cmd=$(fc -ln -0 2>/dev/null | sed 's/^[[:space:]]*//'); [ -n "$cmd" ] && logger -p local6.notice -t "cmd" "user=$USER, tty=$TTY, ip=${SSH_CLIENT%% *}, cmd=$cmd"; }trap log_command DEBUG - 配置 rsyslog 转发:
编辑/etc/rsyslog.d/10-cmd-audit.conf,添加:local6.* @@audit-server.example.com:514(TCP 更可靠) - 重启服务:
systemctl restart rsyslog
加固与避坑要点
光记录不够,还要防绕过、防抵赖、防丢日志。
- auditd 规则必须持久化到
/etc/audit/rules.d/下以.rules结尾的文件,否则重启失效 - 禁用用户修改历史能力:在
/etc/profile中加readonly HISTFILE(Bash 支持),或用chattr +a ~/.bash_history(需 root 执行) - 不要依赖轮询上传
~/.bash_history文件——它不实时、可被删改、多终端会覆盖 - 避免在 audit 规则中加
-F uid!=0这类过滤,应统一记录再用ausearch过滤,防止漏记

















