selinux可能静默阻止ssh登录,需用ausearch查audit.log中的avc拒绝记录,setenforce临时切宽容模式验证,并用restorecon修复~/.ssh上下文。

SELinux 可能静默阻止 SSH 登录,不报错、不提示,只在日志里留痕迹。排查它不需要先关掉,而是用命令快速验证是否是它在作祟。
看日志里有没有 SELinux 拒绝记录
SSH 登录失败时,SELinux 的拒绝行为会写进 audit 日志。直接查最相关的条目:
- sudo ausearch -m avc -ts recent | grep sshd —— 查最近的 SELinux 访问控制拒绝(avc)事件,过滤含 sshd 的
- sudo ausearch -m avc -ts 5 minutes ago | grep -i "denied.*login\|sshd" —— 查过去 5 分钟内与登录或 sshd 相关的拒绝项
- 如果输出里出现类似 avc: denied { read } for pid=... comm="sshd" name=".ssh" dev="sda1",基本就锁定 SELinux 了
临时禁用 SELinux 验证是否为根因
不是为了永久关闭,而是做“开关实验”确认因果关系:
- sudo setenforce 0 —— 切换到 permissive 模式(记录但不阻止)
- 立刻尝试 SSH 登录一次,成功则说明 SELinux 策略确实拦住了
- 验证完记得恢复:sudo setenforce 1(别忘了这步)
检查关键文件的 SELinux 上下文是否正确
SSH 对用户家目录、~/.ssh 和其中文件的上下文非常敏感。常见错误包括:
- ls -Z ~/.ssh —— 查看目录及文件的 SELinux 类型,正常应为 unconfined_u:object_r:ssh_home_t:s0
- 若显示 unconfined_u:object_r:home_root_t:s0 或其他非
ssh_home_t类型,就是上下文错位 - 修复命令:restorecon -Rv ~/.ssh(递归重置上下文)
- 连带检查家目录:ls -Z ~,应为
unconfined_u:object_r:user_home_dir_t:s0;不对则运行 restorecon -v ~
确认 sshd 服务本身是否被 SELinux 限制
有时不是用户侧问题,而是 sshd 进程没拿到足够权限:
- ps -eZ | grep sshd —— 查看 sshd 进程的上下文,正常应为 system_u:system_r:sshd_t:s0-s0:c0.c1023
- 若显示 unconfined_u:unconfined_r:unconfined_t:s0,说明进程没走 SELinux 策略路径,可能配置异常
- 检查是否启用了 SELinux 的 sshd 策略:sudo semanage boolean -l | grep ssh,重点关注
sshd_disable_trans(应为 off)和allow_ssh_keysign(密钥登录需 on)











