应启用 auditd 服务并配置 execve 系统调用监控规则,写入 /etc/audit/rules.d/ 并重启以持久化;配合 ausearch/aureport 分析日志,联动 rsyslog 加密外发至远程服务器确保审计连续性。
如何让 shell 命令执行记录可追溯
Linux 默认不持久化记录用户执行的命令,history 只保存在内存或当前会话的 ~/.bash_history 中,且易被覆盖、清空或绕过。真要审计,得从系统级日志入手。
核心做法是启用 auditd 服务,并配置规则捕获关键系统调用。比如监控所有 execve 系统调用,就能记录每个进程启动时的完整命令行参数(包括脚本、参数、环境变量等):
sudo auditctl -a always,exit -F arch=b64 -S execve -k command_exec
注意:32 位系统需用 b32;-k 后的标签用于后续日志过滤;该规则仅对当前运行生效,需写入 /etc/audit/rules.d/ 下的规则文件(如 cmd.rules)并重启 auditd 才能持久化。
- 普通用户也能触发该规则,无需 sudo —— 审计是内核级行为,不依赖权限提升
-
execve记录的是“实际执行的程序路径”,不是 alias 或函数名,所以别指望它显示ll,只会看到/bin/ls --color=auto - 高频命令(如循环中反复调用
date)可能撑爆日志,建议搭配-F uid!=0过滤掉 root 自身维护行为,或用auditctl -e 2锁定规则防篡改
为什么不能只靠 /var/log/secure 或 auth.log
这些日志只记录登录、sudo、PAM 认证事件,不记录用户登录后具体执行了什么命令。例如:sudo systemctl restart nginx 在 auth.log 中只体现为一次 sudo 授权成功,而真正执行的 systemctl 和其子进程调用链完全不可见。
更隐蔽的问题是:用户可通过以下方式绕过常规日志捕获:
- 用
sh -c "command"或python3 -c "import os; os.system('...')"启动命令,绕过 shell 的 history 机制 - 直接调用二进制(如
/usr/bin/curl)而非别名或函数,跳过 bash 的命令解析层 - 使用非交互式 shell(如通过 ssh 直接执行命令)时,
~/.bash_history根本不写入
只有 auditd 能覆盖所有这些路径,因为它工作在 syscall 层。
如何安全导出和分析 audit 日志
ausearch 和 aureport 是 auditd 自带的查询工具,比直接 grep /var/log/audit/audit.log 更可靠——它们能自动解析时间戳、UID、syscall 参数等结构化字段。