ECS 密钥登录报 Permission denied:先分清密钥、密码、安全组三条线
一、问题:同一个报错,可能是三条线上的不同故障
用密钥登录 Linux 云服务器时,终端只给一句 Permission denied,或者 Permission denied, please try again.,有时候还会带上 (publickey)。很多人第一反应是密钥错了,反复换密钥、重下私钥,结果还是进不去。实际上,这句报错只说明服务端拒绝了这次认证,并没有说明是哪一环拒绝的。密钥、密码、网络与服务端配置,任何一环不对都会走到同一句报错。排查时先分线,不要只在密钥这一条线上反复试。
二、前提:动手前先确认三件事
第一,确认实例本身是否正常。先看控制台里实例是不是运行中、有没有欠费停机或正在重启,实例没起来,SSH 再对也连不上。第二,确认登录方式。购买实例时选的是密钥对还是密码,两种方式的凭证完全不同,用密码去走密钥登录、拿着密钥去输密码,必然被拒。第三,确认你手里有什么:是创建实例时下载的私钥文件,还是后来导入的密钥对;私钥文件还在不在、是不是当初那一个。密钥文件丢失和密钥文件用错,处理路径完全不同,前者要走重置,后者只要换回正确的文件。
三、分步操作:按报错分层,从外到内查
第一步,先用详细模式看清卡在哪一步。执行 ssh -v -i 私钥文件 用户名@服务器地址,重点看三处:客户端有没有真正把密钥文件发出去,服务端回的是 publickey 还是 password,以及最后是卡在密钥验证还是密码验证。如果是 Permission denied (publickey),说明密钥认证没通过,或者服务端根本没有开密码认证兜底;如果是 Permission denied, please try again.,多半是密码尝试被拒,或者登录用户被服务端配置挡住。先把这两句区分开,再决定往哪条线查。
第二步,查密钥文件本身。先看权限,私钥文件权限太开放会被 SSH 直接拒绝使用,Linux 下用 chmod 600 私钥文件 把权限收紧。再看格式,Windows 下用 PuTTY 登录前,需要先用 PuTTYgen 把私钥转成 .ppk 格式,直接拿 .pem 去填 PuTTY 是不行的。最后看配对,确认这份私钥就是创建实例时绑定的那对密钥的私钥,换过密钥对、重新创建过实例、或者从别的实例复制来的私钥,都会被拒。密钥对由公钥和私钥组成,公钥存在服务器内,私钥由用户自己保管,登录时必须提供正确的私钥验证,这是官方文档对密钥对的基本说明。
第三步,查安全组和网络。确认实例绑定的安全组入方向放通了 TCP 22 端口,源地址不要写成内网地址或写错网段。没有绑定弹性公网 IP 的实例,从公网是连不上的,先确认你用的地址是不是实例的公网地址,实例和本地之间有没有经过跳板机或代理。如果是超时而不是 Permission denied,那多半是网络或安全组问题,不是密钥问题,不要把两类现象混在一起。
第四步,查服务端 SSH 配置,这是最容易被忽略的一步。用控制台的远程登录,也就是 VNC 方式先进系统,VNC 登录不依赖 SSH 配置,适合在 SSH 被锁死时救场。进去后查看 /etc/ssh/sshd_config,重点看四组参数:PubkeyAuthentication 是不是 yes,PasswordAuthentication 是不是被设成了 no,PermitRootLogin 是不是禁止了 root 登录,以及 AllowUsers、DenyUsers、AllowGroups、DenyGroups 有没有把你用的用户挡在外面。官方文档明确说明,AllowUsers 是允许登录的用户白名单,DenyUsers 是拒绝登录的用户黑名单,AllowGroups 和 DenyGroups 分别是用户组白名单和黑名单,而且拒绝策略优先级高于允许策略。也就是说,哪怕你的密钥完全正确,只要用户名出现在 DenyUsers 里,或者没出现在 AllowUsers 里,照样会被拒。改完配置后要重启 sshd 服务再生效,例如执行 service sshd restart,然后再重新登录验证。
第五步,查镜像和 Cloud-init。如果实例用的是自己制作的私有镜像,而且制作时没有安装 Cloud-init 工具,云平台就无法把密钥注入实例,此时只能用镜像原有的密码或密钥登录;如果忘记了镜像原有密码,或者原有密钥丢失,可以通过控制台提供的重置密码功能自助完成密码重置。如果镜像安装了 Cloud-init,但在创建实例时获取密钥失败,官方文档给出的办法是重启实例,重启成功后再用密钥文件登录一次确认,仍不行再联系客服。这一条很容易被误判成密钥文件损坏,其实是实例创建那一步就没拿到密钥。
第六步,密码登录也被拒绝时,先分清是密码错了还是密码登录被禁了。如果 PasswordAuthentication 是 no,就算密码完全正确,服务端也不会接受密码登录。需要先用能登录的方式进系统,或者走 VNC 进系统,把 PasswordAuthentication 改为 yes,把 PermitRootLogin 改为 yes,再重启 sshd。如果密钥文件已经丢失或损坏,官方文档给出的切换路径是:先用密钥登录并设置 root 密码,命令是 sudo passwd root;如果密钥文件已经丢失,就参考在操作系统内部修改 ECS 密码的办法重置 root 密码。切换完成后,为了防止非授权用户继续用原来的密钥文件访问,还要把 /root/.ssh/authorized_keys 文件删除或清空。
四、验证:三处都通过,才算修好
第一,重新执行 ssh -i 私钥文件 用户名@服务器地址,能够正常进入命令行,不再出现 Permission denied。第二,在系统内执行 sshd -T 查看生效配置,确认 PubkeyAuthentication、PasswordAuthentication、PermitRootLogin 以及 AllowUsers、DenyUsers 等参数和你改的一致,而不是只改了文件却没有重启服务。第三,查看登录日志,Linux 下可以看 /var/log/secure,里面会写明用户是因为不在 AllowUsers 里、还是被列入 DenyUsers、还是用户组被列入 DenyGroups 而被拒绝,日志里的原因比终端的一句报错要具体得多。
五、常见坑:这几处最容易反复踩
第一,私钥权限 777 或 644 就直接登录,SSH 会因为私钥文件权限太开放而拒绝使用它,表现常常是密钥认证直接跳过,最后变成密码被拒。第二,用错登录用户名,不同镜像的默认登录用户并不完全相同,用户名错了,密钥再对也没有用。第三,Windows 下没有把私钥转成 .ppk 格式就填进 PuTTY,或者把 .ppk 当成 Linux 下的私钥文件直接用。第四,改了 sshd_config 却没有重启 sshd,配置没有生效,就以为改法不对,又去换密钥。第五,安全组只放通了内网源地址,却用公网地址登录,或者实例根本没有绑定弹性公网 IP。第六,密钥文件丢失后还在反复试旧文件,旧文件再试多少次也不会变回有效凭证,这时应该走控制台重置密码或操作系统内重置密码的路径。
六、小结清单:下次再报 Permission denied,按这个顺序查
先用 ssh -v 确认是 publickey 还是密码那一步被拒;再查私钥权限、格式和配对;然后查安全组 22 端口和公网地址;接着用 VNC 进系统查 sshd_config 的用户白黑名单和密码登录开关,改完重启 sshd;再看是不是私有镜像没有 Cloud-init、创建时获取密钥失败;最后,密钥丢失就走重置密码和切换密码登录的路径,切换后清理旧的 authorized_keys。按这个顺序查,每一步都有明确的通过标准,不会在密钥这一条线上空转。
七、出处:本文涉及的官方说法均来自华为云帮助中心
使用SSH登录Linux云服务器时报错:Permission denied, please try again.,华为云帮助中心,弹性云服务器 ECS,故障排除,远程登录,Linux远程登录报错类,链接:https://support.huaweicloud.com/trouble-ecs/ecs_trouble_1706.html
为什么使用密钥文件无法正常登录Linux弹性云服务器?,华为云帮助中心,弹性云服务器 ECS,常见问题,密码与密钥对,链接:https://support.huaweicloud.com/ecs_faq/ecs_faq_1217.html
Linux云服务器怎样切换密钥登录为密码登录?,华为云帮助中心,弹性云服务器 ECS,故障排除,密码与密钥对,链接:https://support.huaweicloud.com/trouble-ecs/ecs_trouble_0359.html
本文为原创文章,操作涉及重启 sshd 服务、修改登录配置和重置密码,生产实例操作前请先确认业务低峰期并做好备份。
- 点赞
- 收藏
- 关注作者
评论(0)