linux中su命令需通过pam日志增强、shell会话捕获和auditd三方面协同实现可审计监控:配置pam_exec记录完整参数与上下文,设置root shell历史与syslog输出,启用auditd监听execve调用,并统一归集告警。

Linux 系统中,su 命令是普通用户切换身份(尤其是提权到 root)最常用的方式之一,但默认日志记录非常简略(仅在 /var/log/auth.log 或 /var/log/secure 中留下一行“pam_unix(su:session): session opened for user root by xxx”),缺乏命令行参数、执行路径、终端信息、甚至失败原因等关键上下文。要真正实现可审计的身份切换行为监控,需从 PAM 日志增强、shell 会话捕获和审计子系统三方面协同配置。
启用并配置 PAM 的详细 su 日志记录
PAM(Pluggable Authentication Modules)是 su 行为的日志源头。默认的 pam_unix.so 模块日志级别低,需显式启用调试与完整字段输出:
- 编辑
/etc/pam.d/su和/etc/pam.d/su-l(后者用于su -) - 找到类似
auth [default=ignore] pam_succeed_if.so user = root quiet或auth [success=ok default=bad] pam_unix.so的行 - 在
auth和session类型下,添加或修改为以下两行(确保位置靠前,优先生效):auth [default=info] pam_echo.so debug "su invoked by $(whoami) on $(tty) with args: $0 $@session required pam_exec.so debug log=/var/log/su-session.log /bin/sh -c 'echo "$(date +%Y-%m-%d\ %H:%M:%S) | $(tty) | $PAM_USER | $PAM_RUSER | $PAM_RHOST | $0 $@" >> /var/log/su-session.log' - 重启 rsyslog(
systemctl restart rsyslog),测试执行su -c 'id',检查/var/log/su-session.log是否包含调用者、目标用户、终端、远程主机(如 SSH)、完整命令行
强制所有 su 启动的 shell 记录操作历史(含 root 会话)
即使 su 成功,root 的后续命令仍不会自动记入原用户日志。需让每个 su 启动的交互式 shell 主动记录自身行为:
- 在
/root/.bashrc(或对应 shell 配置文件)中追加:export HISTFILE="/var/log/bash-history-$(date +%Y%m%d)-$UID-$$"export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.info "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//") [$RETRN_VAL]"' - 同时配置 rsyslog 将 local6.info 转发至独立文件:新建
/etc/rsyslog.d/50-su-commands.conf,写入:local6.info /var/log/su-commands.log& stop - 重启 rsyslog,下次 su 进入的 shell 执行任意命令,都会在
/var/log/su-commands.log中留下带时间戳、PID、命令内容和返回值的条目
使用 auditd 捕获底层 execve 调用(最可靠、不可绕过)
auditd 可监听内核级的系统调用,无论用户用 su、sudo、还是直接 exec /bin/bash,只要触发了 execve 且目标为 su 或 bash,即可捕获完整上下文:
- 确认 auditd 已启用:
systemctl enable --now auditd - 添加规则,监控 su 及其派生进程:
auditctl -a always,exit -F path=/bin/su -F perm=x -k su-execauditctl -a always,exit -F path=/usr/bin/su -F perm=x -k su-execauditctl -a always,exit -F arch=b64 -S execve -F a0=*su* -k su-exec(匹配命令行含 su 的 execve) - 为持久化,将上述规则写入
/etc/audit/rules.d/su-monitor.rules,然后augenrules --load - 查看记录:
ausearch -k su-exec | aureport -f -i,可精确还原调用者 UID、终端、命令行参数、目标可执行文件、甚至 capset 变更
统一日志归集与告警建议
分散的日志不利于审计。推荐将三类日志(PAM session、shell command、auditd event)通过 rsyslog 或 filebeat 推送到集中日志平台(如 ELK、Graylog)。对以下行为设置实时告警:
- 非白名单用户执行 su(对比
/etc/sudoers或自定义允许列表) - su 切换后 5 分钟内无有效命令(疑似提权后闲置,可能被滥用)
- 同一 IP 在 1 小时内 su 失败 ≥3 次(暴力尝试)
- su -c 执行的命令含敏感关键词(如
dd if=、mkswap、iptables -F)
不复杂但容易忽略的是:所有日志路径需设为不可删除(chattr +a /var/log/su-*.log),且定期校验日志完整性(例如用 aide 监控 /var/log/ 目录变更)。










