当我尝试使用 SSH 连接 EC2 实例时,为什么会出现“Server refused our key”错误?

3 分钟阅读
0

使用 SSH 连接到 Amazon Elastic Compute Cloud(Amazon EC2)实例时,我收到“Server refused our key”错误。

简短描述

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

解决方案

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

关于有效用户名的列表,请参阅Error: Server refused our key or No supported authentication methods available

试图访问实例的用户已从服务器上删除,或者帐户被锁定

如果试图访问实例的用户已从服务器上删除,请将该用户重新添加为新用户。有关更多信息,请参阅如何为 Amazon EC2 Linux 实例添加具有 SSH 访问权限的新用户账户?

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

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

方法 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。有关会话管理器的更多信息以及必备条件的完整列表,请参阅 Setting up Session Manager

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 计算机时导致远程连接错误的一些问题。有关更多信息,请参阅 I'm receiving errors when trying to connect to my EC2 instance using SSH。如何使用 AWSSupport-TroubleshootSSH 自动化工作流程解决 SSH 连接问题?

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

重要说明:

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

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

2.    选择实例状态,然后选择停止实例

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

3.    选择操作,选择实例设置,然后选择编辑用户数据

4.    将以下脚本复制到用户数据字段,然后选择保存。请确保复制整个脚本,不要添加额外的空格。

**注意:**下面的脚本使用用户名 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 官方已更新 2 年前