Linux不提供开箱即用SSH全操作录屏功能,需分层实现:auditd提供内核级命令审计(最可靠),PROMPT_COMMAND辅助记录bash命令,rsyslog外发日志防篡改,生产环境应接入堡垒机满足合规要求。

Linux 本身不提供“一键开启 SSH 全操作录屏”功能,所谓“记录所有 SSH 执行命令”,本质是分层捕获:命令级靠 auditd(最可靠),会话级靠 shell 追踪(如 PROMPT_COMMAND),日志归集靠 rsyslog(防篡改)。单靠修改 .bash_history 或只调高 LogLevel VERBOSE 都无法满足合规审计要求——前者可被用户清空,后者仅记登录/登出,不记具体命令。
auditd:内核级命令审计(推荐首选)
这是最可信的方式,工作在系统调用层,绕过 shell,能捕获 sudo、su、脚本中 sh -c 或 python -c 调用的真实执行行为,普通用户无法禁用或删除(除非 root 主动清空)。
确保服务运行:
systemctl enable --now auditd-
添加持久化规则(以 x86_64 为例):
在/etc/audit/rules.d/cmd.rules中写入:-a always,exit -F arch=b64 -S execve -F uid!=0 -k ssh_commands
(加
-F uid!=0可过滤 root 自身运维命令,避免日志爆炸;如需兼容 32 位程序,再加一行-F arch=b32) 加载并验证:
augenrules --load && auditctl -l | grep ssh_commands查看日志:
ausearch -k ssh_commands | aureport -f -i
关键字段:exe是执行的二进制路径(如/bin/ls),cwd是当前工作目录,comm是命令名,argv是完整参数(需启用-F auid!=unset并配合auditctl -e 2锁定规则才稳定输出)
PROMPT_COMMAND:轻量级 Bash 命令追加(快速上线)
适合快速部署基础记录,但仅对交互式 bash/sh 有效,对 ssh user@host command、zsh、fish 或非交互场景无效。
-
在
/etc/profile.d/audit.sh中添加:log_cmd() { [[ -z "$BASH_COMMAND" || "$BASH_COMMAND" =~ ^(PS1=|PS2=|trap|history) ]] && return [[ "$-" != *i* ]] && return local ip="${SSH_CLIENT%% *}" ; [[ -z "$ip" ]] && ip="LOCAL" echo "[$(date '+%F %T')] $ip $(whoami): $BASH_COMMAND" >> /var/log/ssh_commands.log } trap log_cmd DEBUG 设置日志权限(生产环境建议
640+adm组):touch /var/log/ssh_commands.log && chmod 640 /var/log/ssh_commands.log && chown root:adm /var/log/ssh_commands.log
日志加固与集中管理(防止抵赖)
有记录不等于可审计,必须确保日志真实、完整、不可篡改:
-
启用
rsyslog远程转发(TCP 更可靠):
在/etc/rsyslog.conf末尾添加:$ActionQueueFileName fwdRule1 $ActionQueueMaxDiskSpace 1g $ActionQueueSaveOnShutdown on *.* @@192.168.10.100:514 # 替换为你的日志服务器地址
对本地敏感日志设仅追加属性:
chattr +a /var/log/audit/audit.log单独保护 sudo 日志(若启用):
在/etc/sudoers中添加:Defaults logfile="/var/log/sudo.log"
并设置:chmod 600 /var/log/sudo.log && chown root:root /var/log/sudo.log
不复杂但容易忽略


















