介绍
这是我们的SSH故障排除文章系列的延续 。
第一篇文章将帮助您确定何时解决问题,而不是迁移或重新部署问题,并为您需要有效地进行故障排除的信息提供资源。 本系列的其他部分包括如何识别和解决特定的SSH错误,并分解您需要调试成功的SSH连接的哪个阶段 :
- SSH连接故障排除 这会处理诸如连接被拒绝或超时的错误。
- 这包括客户端突然被丢弃或关闭,客户端抱怨密码协商,或与未知或更改的远程主机的问题。
- 故障排除SSH 身份验证 ,本教程是本身。 这包括密码认证或SSH密钥认证拒绝的问题。
- 解决SSH Shell环境 。 这包括无法分割进程,系统报告它不是有效的shell或到达主目录的问题。
一旦连接建立并且协议被启动以安全地通信,则系统然后可以验证连接到系统的用户。 支持各种认证机制。 这个演练将涵盖两个最常见的:密码和私钥/公钥对。
先决条件
要解决SSH问题,您需要确保您的Droplet正常从Web控制台正常响应,并使用正常的网络配置。 您可以通过遵循如何和什么时候解决SSH问题教程来执行此操作 。
在对SSH进行故障排除之前,您应该始终检查云计算面板,以了解影响您的Droplet的区域,管理程序状态以及通过Web控制台的Droplet状态的持续问题 。
错误
以下是您可能遇到的常见SSH身份验证错误。
权限被拒绝密码
注意:如果在创建Droplet时分配了SSH密钥,则您的Droplet将禁用PasswordAuthentication
,您将需要使用SSH密钥进行登录。
在尝试使用密码登录到Droplet时,您可能会在PuTTY和OpenSSH客户端中看到这些错误:
Error outputroot@111.111.111.111's password:
Permission denied (publickey,password).
PuTTY Error outputroot@111.111.111.111's password:
Access denied
Server sent disconnect message
type 2 (protocol error):
"Too many authentication failures for root"
这表示身份验证失败,可能是由一些问题引起的。 以下是您可以采取的一些步骤来解决此问题:
- 确保您使用的是正确的用户名。 在CoreOS上,使用核心用户。 在FreeBSD上,使用freebsd用户。
- 用户密码认证可能会损坏,因此请检查Droplet Web控制台是否支持密码登录。 如果没有,您将需要尝试重置密码或请求恢复环境尝试恢复访问。
- 检查服务器是否允许密码验证 。
权限被拒绝
此登录方法使用加密密钥来验证用户。 您可以在SSH Essentials教程中了解SSH密钥如何工作。
当使用SSH密钥创建Droplet时,这是唯一的身份验证方法。 一旦您使用SSH密钥成功登录,您可以在SSH服务配置文件中启用密码验证。
您可能会看到如下错误:
Error outputPermission denied (publickey).
PuTTY Error outputDisconnected: No supported authentication methods available (server sent: publickey)
关于基于密钥的身份验证的许多常见问题是由文件权限或所有权不正确导致的。 以下是您可以采取的一些步骤来解决此问题:
- 确保
authorized_keys
文件和私钥本身具有正确的权限和所有权 。 - 检查服务器是否允许基于密钥的身份验证 。
- 确保SSH客户端可以读取私钥。 如果您使用PuTTY,请确保您的SSH密钥已正确配置为会话 。 如果您使用OpenSSH客户端,请确保您的私有SSH密钥具有适当的权限 。
- 确保
authorized_keys
文件包含匹配的公钥。 您将要检查您的公钥是否添加到Droplet 。 - 您可能正在使用OpenSSH服务不再支持的私钥。 这通常会在使用私有SSH DSA密钥时影响OpenSSH 7+服务器(如我们的FreeBSD映像)。 您需要更新服务器配置以允许此密钥类型 。
密码在控制台中不起作用
如果您无法恢复对控制台的访问,则可能会指示影响PAM子系统中的身份验证机制或配置问题的文件系统问题。 这也将影响重置Droplet的根密码并通过控制台登录的尝试。
您可以从控制台看到此登录提示:
PromptUbuntu 14.04.4 LTS server tty1
server Login:
Password:
但是当您输入正确的密码时,您可能会收到以下错误:
OutputLogin incorrect
密码重置后 ,您会收到以下提示:
PromptYou are required to change your password immediately (root enforced)
Changing password for root.
(Current) UNIX Password:
您必须重新输入当前密码。 如果您的连接立即关闭,那么您可能会错误地重新输入当前密码,请重试。
成功后,系统会提示您输入两次新密码:
PromptEnter new UNIX password:
Retype new UNIX password:
但是,如果在两次重新启动会话后输入相同的新密码(即,您将被重新发送回提示进行登录),或者看到错误,则通常意味着管理中使用的关键文件之一存在问题您的身份验证数据。
在这种情况下,您将考虑使用恢复环境来准备数据以便重新部署或尝试解决PAM配置或文件系统的问题。
解决方案
以下是常见的SSH身份验证错误的一些故障排除方法和解决方案。
检查可用的身份验证方法
如果您使用详细的SSH客户端输出或日志记录,请检查列出身份验证方式的消息是否包含password
和/或publickey
:
Outputdebug1: Authentications that can continue: publickey,password
如果消息不包含要使用的身份验证方法,请查看/etc/ssh/sshd_config
配置文件。 当以root身份 without-password
时,将PasswordAuthentication
值意外设置为yes
但PermitRootLogin
为no
或no
without-password
是一个常见错误。
确保为登录方法设置了适当的配置,然后重新启动该服务。
确定关键权限和所有权
OpenSSH服务器和客户端对所使用的密钥文件需要严格的权限 。
主机和客户端都应具有以下权限和所有者:
-
~./ssh
权限应该是700
-
~./ssh
应由您的帐户拥有 -
~/.ssh/authorized_keys
权限应为600
-
~/.ssh/authorized_keys
应由您的帐户所有
客户端环境还应具有以下权限和所有者:
-
~/.ssh/config
权限应为600
-
~/.ssh/id_ *
权限应为600
这些更改可能需要通过Droplet Web控制台进行 。
检查SSH公钥和私钥
如果您忘记了哪个私钥匹配哪个公钥,OpenSSH工具和PuTTY应用程序提供了一种从私钥生成公钥的方法。 您可以使用它来比较您的Droplet上的~/.ssh/authorized_keys
文件的内容。
要从OpenSSH环境中的私钥ssh-keygen
公钥,请使用ssh-keygen
命令,如下所示,指定私钥的路径。 默认情况下是~/.ssh/id_rsa
。
ssh-keygen -y -f ~/.ssh/id_rsa
这将生成一个公共密钥,如下所示:
Outputssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfBiMwCU1xoVVp0VbSYV3gTDV/jB57IHdILQ8kJ2622//Lmi4gDPlxA6HXVKq8odkGD/5MjqUw85X2rwEbhoBul74+LCToYJvvvBaDPCgg5z1icCKIJ1m/LJBrGNqPKCgqFWu0EH4/EFP2XIQqWqX1BZtJu/2YWrTr+xFOE/umoYmOd+t3dzQqMsv/2Aw+WmA/x/B9h+41WrobDgCExYNLPYcD0PO7fpsa8CcrZCo+TUWCe7MgQQCSM6WD4+PuYFpUWGw3ILTT51bOxoUhAo19U8B2QqxbMwZomzL1vIBhbUlbzyP/xgePTUhEXROTiTFx8W9yetDYLkfrQI8Q05+f
在PuTTY环境中, PuTTYgen.exe
命令将加载GUI,您可以使用“ 加载”操作导入私钥文件。 在PuTTY中,通常以.ppk
格式存储,您需要知道文件的位置。
导入密钥后,该窗口将包含一个公钥,用于粘贴OpenSSH authorized_keys文件部分,具有相似的顺序。 如果您选择该文本并将其粘贴到文件中,它将折叠它显示的+
字符,并产生公钥。
Outputssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfBiMwCU1xoVVp0VbSYV3gTDV/jB57IHdILQ8kJ2622//Lmi4gDPlxA6HXVKq8odkGD/5MjqUw85X2rwEbhoBul74+LCToYJvvvBaDPCgg5z1icCKIJ1m/LJBrGNqPKCgqFWu0EH4/EFP2XIQqWqX1BZtJu/2YWrTr+xFOE/umoYmOd+t3dzQqMsv/2Aw+WmA/x/B9h+41WrobDgCExYNLPYcD0PO7fpsa8CcrZCo+TUWCe7MgQQCSM6WD4+PuYFpUWGw3ILTT51bOxoUhAo19U8B2QqxbMwZomzL1vIBhbUlbzyP/xgePTUhEXROTiTFx8W9yetDYLkfrQI8Q05+f imported-openssh-key
您可以忽略公钥(这是imported-openssh-key
)后的注释,因为它可能与您生成的密钥注释不同。
在这两种情况下,请确保该服务器上的~/.ssh/authorized_keys
文件中包含该公钥,并将其添加。
OpenSSH 7和已弃用的关键算法
在使用OpenSSH 7(默认情况下为FreeBSD和CoreOS)的系统上,任何旧的基于DSA的密钥将不被认证支持。 ssh-dss
密钥被认为是弱的,强烈建议使用更现代的密钥算法。
因此,最好的解决方案是生成更多现代密钥,并更新现有主机以允许新的密钥。 但是,作为解决方法,您可以在/etc/ssh/sshd_config
文件PubkeyAcceptedKeyTypes
指令设置为+ssh-dss
。
结论
有关成功设置基于密钥的身份验证的步骤,以下指南是伟大的参考:
如果您需要通过SSH进一步的帮助认证,您可以与我们的支持团队打开一张机票 。 确保包括:
- 用于连接的用户名,主机和端口
- 您希望使用的身份验证机制
- 全部输出的错误链接到错误阶段,包括SSH客户端的详细输出
- 目前为止您从故障排除收集的所有信息
- 在引用这篇文章时,你不清楚什么
包括所有上述诊断信息,并澄清您在尝试连接时遇到问题的位置,可以帮助我们快速加快您在需要时遇到问题的速度。