要实现SSH跳板机全审计网关,必须同时满足:①强制使用ProxyJump(-J)构建服务端跳转链;②每跳启用script会话录制+VERBOSE日志+auditd监控;③密钥分层隔离并限制authorized_keys命令与权限。

要通过TCP代理转发实现SSH跳板机的全审计网关,关键不是简单打通连接,而是让每一次登录、命令执行、文件传输都可记录、可定位、可回放。核心在于用对机制(ProxyJump)、配好日志(script + VERBOSE)、管住密钥(分层隔离),三者缺一不可。
必须使用 ProxyJump 而非 ProxyCommand
OpenSSH 7.3+ 原生支持 -J 参数,这是构建安全链式通道的唯一推荐方式:
- 本地只与第一层跳板机建立直连,中间跳转全部在服务端完成,本地不接触中间节点IP或密钥
- scp、rsync、sftp、IDE远程调试等工具原生兼容,无需额外封装脚本
- 会话起点统一由首层跳板机记录,审计日志链条不断裂
- 禁用
ssh -o ProxyCommand="ssh -W %h:%p jump1" user@jump2类写法——它会让本地客户端参与每跳,导致中间跳板行为无法被首层捕获,审计留白
每台跳板机强制启用会话级审计日志
仅靠 LogLevel VERBOSE 不够,必须叠加终端会话录制:
- 在
/etc/ssh/sshd_config中配置:ForceCommand /usr/bin/script -qf -e -c "/bin/bash" /var/log/ssh/session-$(date +\%Y\%m\%d)-$USER-$$ - 启用
LogLevel VERBOSE记录登录源IP、认证方式、连接时长、退出状态等元数据 - 配合
PermitTunnel yes+auditd监控/dev/pts/*设备读写,防绕过 script 的隐蔽操作 - 日志路径建议含日期与用户名,权限设为
600,归属root:adm,防止普通用户删改
密钥与访问权限必须分层隔离
不能所有跳板和目标主机共用同一套密钥,否则一处泄露,全线失守:
- 为每类跳转路径生成独立密钥对(例如:跳板机A→跳板机B用 key-bastion2,跳板机B→内网PyTorch服务器用 key-pytorch)
- 跳板机上
~/.ssh/authorized_keys中对应公钥需加限制项,如:command="script -qf -e -c '/bin/bash' /var/log/ssh/...",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA... - 内网服务器
sshd_config设置AllowUsers @jump2-group或基于IP白名单(仅允许上一级跳板机IP),拒绝直连
日志集中归集与保留策略
分散在各跳板机上的日志必须统一管理:
- 用 rsyslog 或 filebeat 将
/var/log/ssh/下带时间戳的 session 日志实时推送至中心审计服务器 - 加密存储(如 AES-256),保留期不少于 90 天,满足等保与内部合规要求
- 定期校验日志完整性(如用 sha256sum 归档后签名),防止篡改










