当我尝试使用 SSH 连接我的 EC2 实例时,为什么会出现“Server refused our key”(服务器拒绝了我们的密钥)错误?

3 分钟阅读
0

使用 SSH 连接到我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例时,我收到“Server refused our key”(服务器拒绝了我们的密钥)错误。

简短描述

SSH 服务器 (sshd) 拒绝 SSH 私钥的原因有很多。以下是您可能会收到此错误的一些常见原因:

解决方法

连接到 EC2 实例时,您使用的 AMI 用户名不正确

有关有效用户名的列表,请参阅错误: 服务器拒绝了我们的密钥或没有支持的身份验证方法可用

尝试访问实例的用户已从服务器上删除或账户被锁定

如果尝试访问该实例的用户已从服务器中删除,请将该用户重新添加为新用户。有关更多信息,请参阅如何添加可以通过 SSH 访问我的 Amazon EC2 Linux 实例的新用户账户?

实例存在权限问题或者您缺少目录

有四种方法可用于验证实例的权限和目录:

方法 1: 使用 EC2 Serial Console

如果您已开启适用于 Linux 的 EC2 Serial Console,则可以使用这个串行控制台对支持的基于 Nitro 的实例类型进行故障排除。串行控制台可帮助您解决启动问题、网络配置和 SSH 配置问题。串行控制台无需有效的网络连接即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS 命令行界面(AWS CLI)访问串行控制台。

在使用串行控制台之前,您必须授予账户访问权限。然后,您必须创建 AWS Identity and Access Management (IAM) 策略,用于向您的 IAM 用户授予访问权限。此外,使用串行控制台的每个实例都必须包含至少一个基于密码的用户。如果您的实例无法访问并且您尚未配置对串行控制台的访问权限,请按照方法 2、3 或 4 中的说明进行操作。有关配置适用于 Linux 的 EC2 Serial Console 的信息,请参阅配置 EC2 Serial Console 的访问权限

**方法 2:**使用 AWS Systems Manager 会话管理器登录实例并检查权限

**注意:**要使用此方法,需要安装 SSM Agent。有关会话管理器的更多信息以及必备条件的完整列表,请参阅设置会话管理器

1.    打开 AWS Systems Manager 控制台

2.    启动会话

3.    使用 stat 命令确保目录下文件的权限正确。以下是正确权限的列表:

  • 例如,Linux 主目录 /home 应为 (0755/drwxr-xr-x)
  • 例如,用户的主目录 /home/ec2-user/ 应为 (0700/drwx------)
  • 例如,.ssh 目录权限,/home/ec2-user/.ssh 应为 (0700/drwx------)
  • 例如,authorized_keys 文件权限,/home/ec2-user/.ssh/authorized_keys 应为 (0600/-rw-------)

以下是 stat 命令和生成的输出示例。在此示例中,ec2-user 是用户名。根据您的特定 AMI 更改用户名

$ stat /home/ec2-user/
  File: '/home/ec2-user/'
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: 10301h/66305d	Inode: 18322       Links: 3
Access: (0700/drwx------)  Uid: (  500/ec2-user)   Gid: (  500/ec2-user)

4.    如果权限与前面的值不匹配,则运行以下命令:

$ sudo chown root:root /home
$ sudo chmod 755 /home
$ sudo chown ec2-user:ec2-user /home/ec2-user -R
$ sudo chmod 700 /home/ec2-user /home/ec2-user/.ssh
$ sudo chmod 600 /home/ec2-user/.ssh/authorized_keys

5.    结束会话

6.    通过 SSH 连接到您的实例。

方法 3: 通过运行 AWSSupport-TroubleshootSSH 文档自动更正导致错误的问题

AWSSupport-TroubleshootSSH 自动化文档在实例上安装 Amazon EC2Rescue 工具,然后检查并更正一些通过 SSH 连接到 Linux 计算机时导致远程连接错误的问题。有关更多信息,请参阅我在尝试使用 SSH 连接我的 EC2 实例时收到错误。如何使用 AWSSupport-TroubleshootSSH 自动化工作流程来解决 SSH 连接问题?

方法 4: 使用用户数据修复实例的权限

重要信息:

  • 此恢复过程要求您停止并启动您的实例。当您这样做时,实例存储卷上的数据会丢失。有关更多信息,请参阅确定实例的根设备类型
  • 如果您的实例是 Amazon EC2 Auto Scaling 组的一部分,则该实例可能会在停止时终止。这也可能发生在使用 AWS Auto Scaling 的服务启动的实例上,例如 Amazon EMR、AWS CloudFormation、AWS Elastic Beanstalk 等。此场景中的实例终止取决于您的自动扩缩组的实例向内扩展保护设置。如果您的实例是自动扩缩组的一部分,则在开始执行解决步骤之前,请暂时将该实例从自动扩缩组中移除
  • 停止和重启实例会更改实例的公有 IP 地址。在将外部流量路由到您的实例时,最好使用弹性 IP 地址而不是公有 IP 地址。
  • 如果实例的根设备是实例存储卷,则无法使用用户数据更改 SSH 密钥。有关更多信息,请参阅确定实例的根设备类型
  • 更新实例的用户数据适用于所有支持 cloud-init 指令的发行版。必须安装和配置 Cloud-init 才能成功执行这些指令。有关 cloud-init SSH 模块的更多信息,请参阅 Cloud-init 文档中的 SSH - 配置 SSH 和 SSH 密钥

1.    打开 Amazon EC2 控制台,然后选择您的实例。

2.    选择 nstance State(实例状态),然后选择 Stop instance(停止实例)。

**注意:**如果 Stop 不可用,则实例已停止或者其根设备是实例存储卷。

3.    选择 Actions(操作),选择 Instance Settings(实例设置),然后选择 Edit User Data(编辑用户数据)。

4.    将以下脚本复制到 User Data(用户数据)字段,然后选择 Save(保存)。确保复制整个脚本,不要添加多余的空格。

**注意:**以下脚本使用用户名 ec2-user。将 ec2-user 更改为您的 AMI 的用户名

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
chown root:root /home
chmod 755 /home
chown ec2-user:ec2-user /home/ec2-user -R
chmod 700 /home/ec2-user /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys
--//

5.    启动实例,然后通过 SSH 进入实例。

**注意:**默认情况下,用户数据脚本在每个实例上运行一次。此过程更改了默认行为,为实例的每次重启、停止或启动添加公钥。要恢复默认行为,请移除自定义用户数据。作为最佳实践,请考虑允许用户数据在实例首次启动后运行所产生的安全影响。您可以使用 ModifyInstanceAttribute API 方法修改实例的用户数据。要限制对此方法的访问权限,请使用 IAM 策略

相关信息

使用 PuTTY 从 Windows 连接到您的 Linux 实例

Amazon EC2 密钥对和 Windows 实例

为什么我不能使用 SSH 连接到我的 Amazon EC2 Linux 实例?

AWS 官方
AWS 官方已更新 1 年前