sshd 强制命令核查
sshd 在会话建立后可能执行 /etc/ssh/sshrc 与 ~/.ssh/rc,ForceCommand 还能强制会话只运行指定命令。这几个位置是登录链路上的持久化点:脚本在用户操作之前执行,而且往往不在常规的 shell 启动文件检查范围内。
基本信息
| 系统级脚本 | /etc/ssh/sshrc |
|---|---|
| 用户级脚本 | ~/.ssh/rc,受 PermitUserRC 开关控制 |
| 强制命令 | ForceCommand,可写在全局配置或 Match 块中 |
| 相关开关 | PermitUserRC、PermitLocalCommand、AllowUsers、Match |
| 检查位置 | /etc/ssh/sshd_config 与 /etc/ssh/sshd_config.d/*.conf |
| 权限要求 | 读取系统配置与家目录文件需要 root 或属主权限 |
典型使用场景
- 排查登录链路上的持久化脚本
- 确认是否有会话被强制运行指定命令
- 检查跳板机与容器内被改造的登录行为
- 与 sshd 生效配置核对,确认真实行为
- 审计后按需清理并复测登录是否正常
最小示例
最小示例
grep -Rn 'ForceCommand\|PermitUserRC\|PermitLocalCommand' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ 2>/dev/null
cat /etc/ssh/sshrc 2>/dev/null # 阅读内容,不要执行
ls -l --time-style=long-iso /home/*/.ssh/rc /root/.ssh/rc 2>/dev/null
sshd -T 2>/dev/null | grep -Ei 'forcecommand|permituserrc|permitlocalcommand'
sudo sshd -t # 配置语法检查,改动前后都要做
sudo sha256sum /etc/ssh/sshrc /etc/ssh/sshd_config 2>/dev/null位置与作用
| 位置 | 作用 | 注意 |
|---|---|---|
| /etc/ssh/sshrc | 登录后全局执行 | 内容改动影响所有用户 |
| ~/.ssh/rc | 登录后按用户执行 | 受 PermitUserRC 控制 |
| ForceCommand | 强制会话运行指定命令 | 可写在 Match 块中按条件生效 |
| authorized_keys 前缀 | 单密钥的限制与强制命令 | 写在密钥行的行首选项中 |
| sshd -T 输出 | 实际生效的配置 | 文件存在不等于生效 |
配置文件中有某段内容不等于生效:必须结合 sshd -T 的实际输出判断,尤其注意 sshd_config.d 目录下的覆盖关系。
authorized_keys 行首的 command=、from=、no-pty 等选项只作用于单把钥匙,排查时容易被整行跳过。
Match 块可以按用户、来源地址或组限定 ForceCommand,只做全局搜索容易漏掉条件性配置,阅读时要把 Match 段一并看完。
sshrc 与 rc 文件在会话建立之后、用户命令之前执行,一旦内容有问题会直接影响登录本身,确认改动前先记录文件哈希与时间戳。
阅读这些文件用 cat 直接查看,不要执行其中内容;脚本里可能包含会改变系统状态的命令。