应使用指定架构的 execve 审计规则监控 shell 启动行为,而非直接监控配置文件读取;需设置 -a always,exit -F arch=b64/b32 -S execve -F exe=/bin/bash 等规则,并添加 -F uid!=0 和 -F auid>=1000 过滤普通用户会话,再通过 ausearch 查看带 auid、exe 等字段的事件。
要审计用户环境初始化文件(如 /etc/profile、/etc/bash.bashrc、~/.bashrc、~/.profile 等)的读取行为,核心在于捕获 execve 系统调用中 shell 解析并加载这些文件的过程——但需注意:auditd 不直接审计“文件被读”,而是审计“谁在什么上下文中执行了触发该读取的系统调用”。单纯用 -w 监控 ~/.bashrc 的 -p r 会因高频读取导致日志爆炸且难以关联真实用户行为,不可取。
用户登录或新 shell 启动时,bash/zsh 等会调用 execve 加载自身,并在初始化阶段主动读取配置文件。要捕获这一链路,规则必须:
-a always,exit 确保每次调用都记录-F arch=b64(x86_64 系统)或 -F arch=b32(兼容 32 位),否则内核完全忽略该规则示例规则(写入 /etc/audit/rules.d/shell-init.rules):
-a always,exit -F arch=b64 -S execve -F exe=/bin/bash -k shell_bash_init<br>-a always,exit -F arch=b64 -S execve -F exe=/bin/sh -k shell_sh_init<br>-a always,exit -F arch=b32 -S execve -F exe=/bin/bash -k shell_bash_init32
仅靠 execve 只能知道“谁执行了 bash”,无法确认是否真去读了 /etc/profile。需叠加上下文字段缩小范围:
-F uid!=0:排除 root 手动执行,聚焦普通用户会话-F auid>=1000:匹配交互式登录用户的审计 UID(auid 不变,uid 可能切换)-F path=/etc/profile 或 -F path=/etc/bash.bashrc:可选,与 execve 规则组合后,能定位到具体被加载的初始化文件(需确保路径真实存在)注意:path= 过滤对 execve 规则有效,但仅当该文件作为参数被传递或被子进程显式打开时才命中;shell 内部自动加载行为通常不体现为独立 path 字段,因此主规则仍以 exe + arch 为核心。
规则生效后,触发一次新 shell(如新开终端或 su -l $USER),再执行:
sudo auditctl -l | grep shell_:确认规则已加载sudo ausearch -k shell_bash_init -i --start recent:查看带可读解释的最近匹配事件auid(登录用户)、uid(当前有效用户)、comm(命令名)、exe(执行文件路径)、cwd(工作目录)、proctitle(进程标题,常含启动参数)若需进一步追踪某次 shell 启动后读取了哪些 rc 文件,可结合 autrace 对该进程做临时跟踪,但不宜长期开启。
以下操作会导致规则失效或日志无意义:
sudo augenrules --load:仅存文件不生效.rules 结尾(如叫 init-audit.conf):augenrules 完全跳过audit 内核模块/home/*/.bashrc 使用通配符路径:auditd 不支持 glob,需按实际路径逐条写,或改用 inotify+auditd 联动方案