需启用pam_tty_audit.so模块并配合auditd服务,通过在/etc/pam.d/sshd的session段添加session required pam_tty_audit.so enable=*,实现SSH交互式会话命令行原始输入流的强制审计。

要在 RHEL/CentOS 7.9(或兼容的 Linux 系统)上强制记录所有运维人员通过 SSH 执行的终端命令,核心是启用 pam_tty_audit.so 模块,并确保它作用于 SSH 登录会话。该模块不记录密码、不捕获输出,只审计用户在交互式 shell 中键入的**原始输入流**(即命令行),且需配合内核 auditd 服务才能持久化和查询。
确认系统支持与基础准备
确保以下条件满足,否则模块无法加载或审计无效:
- 内核已启用 audit 支持:运行 zcat /proc/config.gz | grep CONFIG_AUDIT 或检查 /boot/config-$(uname -r),确认 CONFIG_AUDIT=y
- auditd 服务正在运行:systemctl is-active auditd 应返回 active;若未启动,执行 systemctl enable --now auditd
- 验证模块存在:ls /lib64/security/pam_tty_audit.so(RHEL7 默认路径为 /lib64/security/)
- 确保 PAM 配置文件可写,且已备份原配置:cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
在 sshd 的 PAM 配置中启用终端审计
编辑 /etc/pam.d/sshd,在 session 类型段添加启用规则(必须放在 session 段,不能放 auth 或 account):
- 在文件顶部或 session include password-auth 行之前插入:
session required pam_tty_audit.so enable=* - 如需仅审计特定用户(例如运维组 ops),可改用:
session [success=ok default=ignore] pam_succeed_if.so user ingroup ops
session required pam_tty_audit.so enable=* - 避免使用 disable=* 或条件冲突语句,否则可能全局禁用审计
验证审计记录是否生成并可查询
配置生效后,新建立的 SSH 会话将被审计。记录不会存于日志文件,而是由 auditd 写入二进制日志:
- 查看实时审计事件:ausearch -m TTY -i | tail -20
- 按用户筛选(如用户 admin):ausearch -m TTY -ui $(id -u admin) -i
- 解析出可读命令流:aureport -m TTY --key ssh-login -i(需提前用 -k ssh-login 标记事件更易追踪)
- 注意:lastcomm 命令在 RHEL7.9 中不可用——那是 acct 工具集的功能,与 pam_tty_audit 无关;正确工具是 ausearch 和 aureport
关键注意事项与加固建议
该机制有效但有边界,部署前须明确:
- 仅审计交互式登录(即分配了伪终端的 SSH 会话),非交互式命令(如 ssh user@host 'ls')不触发 tty_audit
- 审计数据默认保存在 /var/log/audit/audit.log 及其轮转文件中,需定期归档并限制访问权限(chmod 600 /var/log/audit/)
- 为防绕过,应同步禁用 UsePAM no(确保 /etc/ssh/sshd_config 中此项为 yes 或注释掉,默认即启用)
- 若使用集中式日志(如 rsyslog + remote audit),需配置 auditd 将事件转发,避免本地日志被删改

















