sshd 配置后门检查
SSH 服务的配置文件决定了谁能以什么方式登录,改一处就相当于开一扇长期的门:把公钥文件指到攻击者可控的目录、允许空口令、放开 root 直接登录、替换 sftp 子系统指向脚本。排查时不能只读主文件,因为生效配置由主文件、Include 引入的片段与 Match 条件块共同决定,而且同一项在 Match 块内可以覆盖全局设置。
基本信息
| 查看生效配置 | sshd -T 输出最终结果(通常需要 root 才能读取主机密钥与完整配置) |
|---|---|
| 分段查看 | sshd -T -C user=root,host=示例,addr=1.2.3.4 可查看特定连接条件下的生效值 |
| 配置文件 | /etc/ssh/sshd_config 以及 Include 引入的 /etc/ssh/sshd_config.d/*.conf 等 |
| 语法检查 | sshd -t 在重载前验证配置 |
| 高风险项 | AuthorizedKeysFile 被改向、AuthorizedKeysCommand、PermitEmptyPasswords yes、Subsystem 被替换 |
| 次要风险项 | PermitRootLogin yes、PasswordAuthentication yes、AllowTcpForwarding yes、GatewayPorts yes |
典型使用场景
- 确认是否存在绕过口令的隐藏登录通道
- 核查密钥文件路径是否被改到攻击者可控的位置
- 上线与巡检时核对加固项是否被覆盖
- 排查异常登录方式:明明是密钥认证环境却出现密码登录成功
- 清理后验证配置已恢复并确认语法正确
导出并筛查生效配置
导出并筛查生效配置
sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|authorizedkeysfile|authorizedkeyscommand|allowtcpforwarding|gatewayports' # 关键项
sudo sshd -T -C user=root,host=h,addr=1.2.3.4 | grep -iE 'authorizedkeysfile|forcecommand|permitrootlogin' # Match 条件下的生效值
sudo sshd -t # 语法检查
ls -lt --time-style=full-iso /etc/ssh/ | head -n 15 # 目录内文件的修改时间
sudo grep -RIn 'Include\|Subsystem\|ForceCommand\|Match' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ 2>/dev/null | head -n 20
sudo sshd -T | grep -i subsystem # 确认 sftp 子系统指向的程序高风险项读法
| 配置项 | 正常值 | 被改动的后果 |
|---|---|---|
| AuthorizedKeysFile | 默认 ~/.ssh/authorized_keys | 指向攻击者可控目录即可长期免密登录 |
| AuthorizedKeysCommand | 默认为空或不配置 | 外部命令返回密钥即可造出隐蔽入口 |
| PermitEmptyPasswords | no | 口令为空的账号可直接登录 |
| Subsystem sftp | sftp-server 或 internal-sftp | 被替换成脚本则是稳定的文件投放与执行通道 |
| PermitRootLogin | prohibit-password 或 no | yes 会让爆破成功后的破坏力显著放大 |
| AllowTcpForwarding 与 GatewayPorts | 按需开启 | 可被用作跳板或反向暴露内网服务 |
| Match 块内覆盖 | 与全局一致 | 块内设置会覆盖全局,只看全局会漏判 |
修改 sshd 配置属于高危操作:改前保留一个已登录的会话,改后先执行 sshd -t 检查语法,再 reload 而不是 restart,并用新窗口验证能正常登录,避免把自己锁在门外。
生效值比文件内容更可靠:多个片段叠加与 Match 条件会改变最终结果,判断一定要以 sshd -T 的输出为准;同时记录 /etc/ssh 下文件的 mtime 与哈希,作为进一步比对基线。