真正防篡改的审计必须监控execve系统调用,而非.bash_history文件;auditd通过捕获execve可获取真实UID/GID、完整命令路径与参数、TTY、PID/PPID等不可伪造信息,覆盖sh -c、python -c、SSH直连等所有绕过shell的执行方式。

不能靠监控 /root/.bash_history 文件本身来防范审计篡改 —— 因为攻击者删改该文件、清空历史、绕过 shell、甚至直接用其他解释器执行命令,auditd 对这个路径的读写事件记录毫无意义。真正防篡改的审计,必须从命令执行源头抓起,而不是盯住事后缓存文件。
auditd 不该监控 .bash_history,而应监控 execve 系统调用
用户所有命令(无论是否写入 history)最终都通过 execve() 系统调用执行。auditd 捕获该事件,才能拿到不可伪造的原始信息:
- 真实 UID/GID,不依赖环境变量或 sudo 配置
- 完整命令路径(如
/bin/ls)和参数(-la /tmp),避免命令别名或函数混淆 - 终端类型(tty)、进程 PID、父进程 PPID、会话 ID
- 即使用户删了
.bash_history、用了zsh、或直接python -c "import os;os.system('rm -rf /')",execve 日志依然存在
配置 auditd 实时捕获所有命令执行
在 /etc/audit/rules.d/cmd.rules 中添加规则(需重启 auditd 或 augenrules --load):
-a always,exit -F arch=b64 -S execve -k command_exec -a always,exit -F arch=b32 -S execve -k command_exec
说明:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
-F arch=b64和b32覆盖 x86_64 下的 64/32 位调用,防止绕过 -
-k command_exec统一打标,便于后续用aureport -i -k command_exec提取 - 不加
-F uid!=0等过滤,确保 root 和普通用户全部覆盖
补充关键防护:禁用 history 篡改能力 + 强制日志分离
仅靠 auditd 还不够,需同步削弱用户篡改条件:
- 在
/etc/profile或/etc/skel/.bashrc中设置:export HISTFILE=/dev/null(禁用个人 history 文件)unset HISTSIZE HISTFILESIZE(清除缓存控制) - 对 root 用户,禁止交互式登录,强制走
sudo -i或跳板机,并开启sudoers的log_input和logfile,记录输入流与时间戳 - 定期用
aureport --start yesterday -k command_exec --format csv > /var/log/audit/cmd-$(date +%F).csv归档,权限设为600并移出被审计主机
为什么监控 /root/.bash_history 是无效且危险的
以下操作均不会触发对该文件的写入,但都能完成高危操作:
- 用户用
sh -c 'rm -rf /data',不经过 bash,不写.bash_history - 执行
history -c && rm ~/.bash_history后再操作,auditd 若只盯该路径,只能看到两次删除,看不到真实命令 - 通过 SSH 直接传入命令:
ssh user@host 'killall nginx',全程无本地 history 缓存 - 攻击者修改
HISTFILE指向自定义路径,或用set +o histexpand关闭历史记录
归根结底,.bash_history 是用户态缓存,不是审计证据;execve 是内核态事实,才是唯一可信入口。

















