云服务资讯

SSH密钥登录失败可从权限与服务状态排查

SSH密钥登录失败时,应按客户端提示、服务器文件权限、密钥匹配关系和sshd服务状态逐项检查。本文以Rocky Linux服务器为例,给出可执行的SSH远程登录配置排查步骤,并说明常见权限值、服务命令及恢复方法。

密钥文件看似已经上传,但登录仍提示“Permission denied (publickey)”,通常不是密钥算法本身失效,而是SSH远程登录配置中的路径、属主、权限或服务参数不一致。排查时不要反复生成密钥,先确认客户端使用了哪把私钥,再检查服务器是否读取了对应公钥。

先判断失败发生在哪一层

在Windows 11、macOS或其他类Unix客户端上,首次排查可以使用详细日志。命令为:ssh -vvv 用户名@服务器地址。输出中如果出现“Offering public key”,说明客户端已经找到并尝试使用私钥;如果服务器随后拒绝,重点检查账号、authorized_keys和sshd配置。如果连“Offering public key”都没有,可能是私钥路径不对、权限限制或SSH客户端没有加载该密钥。

若提示“Connection refused”,问题更接近服务没有监听目标端口;若提示“Connection timed out”,还需检查网络路径、防火墙或安全组。不要把这几类错误都归结为SSH远程登录配置中的密钥问题。

检查公钥文件、属主和权限

以Rocky Linux服务器为例,登录控制台或使用其他可用入口后,切换到目标账号,检查家目录和密钥文件:

  1. 确认账号的家目录:getent passwd 用户名,查看最后一个字段是否为预期路径。
  2. 确认目录存在:ls -ld /home/用户名 /home/用户名/.ssh
  3. 确认公钥文件内容:ls -l /home/用户名/.ssh/authorized_keys,并用cat查看是否包含客户端公钥的一整行。
  4. 修正属主:chown -R 用户名:用户组 /home/用户名/.ssh
  5. 修正权限:chmod 700 /home/用户名/.ssh,再执行chmod 600 /home/用户名/.ssh/authorized_keys

目录通常不应允许同组或其他用户写入,authorized_keys也不应设置为全局可写。部分系统启用了StrictModes,发现家目录或密钥路径存在不安全权限后,sshd可能直接拒绝使用该文件。家目录本身也应保持合理权限,例如常见的755或更严格设置,但应结合服务器的账号管理要求调整。

确认公钥没有被破坏

authorized_keys中的一把公钥通常占一行,不能因为复制过程产生换行,也不能把私钥内容放到服务器上。使用ssh-keygen -y -f 私钥路径可以从私钥导出公钥,再与服务器文件中的对应行进行比对。若服务器使用了自定义文件位置,还要检查sshd_config中的AuthorizedKeysFile设置,不能只盯着默认路径。

核对服务状态与实际配置

权限无误后,检查sshd是否运行以及配置文件能否通过语法验证。Rocky Linux常用命令如下:

  1. 执行sudo sshd -t。没有输出通常表示语法检查通过;若有错误,先修正报错行。
  2. 执行sudo systemctl status sshd,查看服务是否处于active状态及最近的失败原因。
  3. 需要重载配置时使用sudo systemctl reload sshd;只有服务未运行或重载失败时,才考虑sudo systemctl restart sshd
  4. 确认监听端口:sudo ss -lntp | grep sshd,核对监听地址和端口是否与客户端命令一致。

修改sshd_config前应保留当前会话,并在重启前执行sshd -t,避免因拼写错误关闭唯一管理通道。关注PubkeyAuthentication是否被禁用、AuthorizedKeysFile是否指向正确位置,以及Match User或Match Group规则是否覆盖了目标账号。若同时设置了AllowUsers、AllowGroups等访问控制项,也要确认账号确实被允许。

日志能缩小定位范围

服务状态只显示结果,日志更适合判断拒绝原因。可执行sudo journalctl -u sshd -b查看本次启动后的记录,也可以使用sudo journalctl -u sshd -f,然后在另一终端重新登录。日志中若出现“Authentication refused: bad ownership or modes”,优先回到文件属主和权限;若提示用户不存在或不在允许列表,应检查账号及访问控制;若显示SELinux拒绝,在确认路径和属主正确后,可用restorecon -Rv /home/用户名/.ssh恢复默认安全上下文。

现象优先检查项处理方向
Permission denied (publickey)公钥内容、文件权限、账号规则校验authorized_keys并检查sshd配置
Connection refusedsshd服务与监听端口执行sshd -t、systemctl status和ss检查
配置修改后服务起不来配置语法或重复指令保留现有会话,先用sshd -t修复
权限正确但仍被拒绝SELinux上下文、Match规则查看journalctl并核对实际生效配置

更稳妥的SSH远程登录配置习惯

完成修复后,建议从一台新的客户端连接验证,不要立刻关闭原有会话。客户端可显式指定私钥,例如ssh -i 私钥路径 用户名@服务器地址,避免多个密钥同时尝试造成误判。确认密钥登录稳定后,再按管理要求决定是否关闭密码登录;修改前必须确保至少保留一个可用的密钥或应急入口。

总的来说,SSH远程登录配置排查应遵循“客户端日志—账号路径—权限属主—公钥匹配—服务状态—系统日志”的顺序。这样既能快速区分密钥问题与服务问题,也能降低修改sshd配置时误锁管理员的风险。

常见问题

1. authorized_keys权限必须固定为600吗?

600是常见且稳妥的设置。某些系统允许更宽松的可读权限,但不应让其他用户拥有写权限,最终仍应以系统的StrictModes检查结果和安全要求为准。

SSH密钥登录失败可从权限与服务状态排查

2. 修改sshd_config后是否必须重启?

不一定。语法检查通过后通常可使用systemctl reload sshd让新配置生效,重启适用于服务异常或需要重新初始化的情况。

3. 为什么密钥内容正确仍然登录失败?

还可能是登录用户名错误、sshd读取了其他文件、Match规则覆盖账号、SELinux上下文异常,或客户端实际使用了另一把私钥。

4. 可以直接删除旧密钥再重新上传吗?

不建议直接删除。应先追加并验证新公钥能够登录,再移除不再使用的旧授权,避免失去唯一的远程入口。