auditd不可靠监控~/.bash_history——因其路径动态、操作复杂且易绕过;应改用监控shell执行、高危系统调用、启用bash内建日志及权限加固等分层防御措施。

直接监控用户级 .history 文件(如 ~/.bash_history)在 auditd 中**不可靠且不推荐**——auditd 是内核级审计工具,专为系统关键路径(如 /etc/passwd、/bin/ls)设计,而用户家目录下的历史文件数量多、路径动态、权限松散,用 -w 监控既易漏报,又会显著增加日志噪音和性能负担。
为什么不能像监控 /etc/passwd 那样监控 ~/.bash_history?
auditd 的 -w 规则基于 inode 和路径硬绑定,但:
-
~/.bash_history每个用户路径不同(/home/alice/.bash_history、/home/bob/.bash_history),无法统一规则覆盖 - Shell 在退出时重写该文件,常伴随临时文件(如
.bash_history.XXXXXX)和 truncate 操作,-p wa很难捕获完整行为 - 用户可手动
cat /dev/null > ~/.bash_history或改名清空,auditd 只记录“谁删了它”,不反映“谁清空了命令历史”这一安全意图 - auditd 不解析 shell 行为逻辑,它记录的是
openat(AT_FDCWD, "/home/alice/.bash_history", O_WRONLY|O_APPEND)这类系统调用,而非“用户执行了 history -c”
真正有效的替代方案:分层防御 + 行为推断
与其死盯单个文件,不如从攻击链角度切入——篡改历史的目的是掩盖操作痕迹。以下方法组合更实用、可落地:
-
监控关键 shell 可执行文件的执行与替换:
攻击者若想隐藏行为,常先替换/bin/bash、/usr/bin/sh或注入 LD_PRELOAD。用 auditd 锁定这些二进制:auditctl -w /bin/bash -p x -k shell_execauditctl -w /usr/bin/sh -p x -k shell_execauditctl -w /usr/lib64/libc.so.6 -p r -k libc_load -
捕获高危命令执行上下文:
用-a always,exit规则记录可能清空或绕过历史的系统调用:auditctl -a always,exit -F arch=b64 -S execve -F exe=/bin/bash -F key=shell_spawnauditctl -a always,exit -F arch=b64 -S unlinkat -F path=~/.bash_history -F key=history_wipe_attempt(注意:此处path=是模糊匹配,需配合ausearch -i -k history_wipe_attempt查看) -
启用 shell 内建审计(最直接):
在/etc/bash.bashrc或用户~/.bashrc中添加:export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.info "$(whoami) [$$] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//") [$RETRN_VAL]"'
再配置 rsyslog 将local6.*写入独立日志(如/var/log/shell-commands.log)。这样每条命令执行即落盘,无法被history -c删除。 -
限制历史文件写权限(防御前置):
对所有用户历史文件设为只读(仅 shell 进程自身可追加):chmod 600 ~/.bash_history
并设置 umask 077,防止新生成文件被其他用户读取。
如果仍需临时观察某用户的历史文件改动
仅限调试或取证场景,不用于长期监控:
- 确认目标用户 UID(如 alice 的 UID 是 1001),然后监控其 home 目录下该文件:
auditctl -w /home/alice/.bash_history -p wa -k alice_history_debug - 触发后,用
ausearch -k alice_history_debug | aureport -f -i查看详细事件,重点关注comm=字段(是 bash?vim?还是某个可疑进程?) - 记住:该规则重启 auditd 后失效;要持久化,需写入
/etc/audit/rules.d/10-user-history.rules并运行augenrules --load
归根结底,.history 文件本身不是攻击入口,而是攻击结果的副产品。把精力放在保护 shell 执行链、记录命令上下文、加固用户环境上,比死守一个易被绕过的文本文件更有效。


















