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

3 分钟阅读
0

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

简短描述

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

解决方法

您在尝试连接到 Amazon EC2 实例时对 AMI 使用了错误的用户名

常用用户名为 ec2-user、ubuntu、centos、root 或 admin。有关有效用户名的列表,请参阅错误: 服务器拒绝我们的密钥或没有支持的身份验证方法

用户已从服务器中删除或 AWS 账户已锁定

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

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

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

方法 1: 使用 EC2 Serial Console

如果启用了适用于 Linux 的 Amazon EC2 Serial Console,则可以使用串行控制台对支持的基于 Nitro 的实例类型进行故障排除。您可以使用 Amazon EC2 控制台或 AWS 命令行界面 (AWS CLI) 来访问 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 实例的根卷
  • 如果您的实例是 Amazon EC2 自动扩缩组的一部分,则该实例可能会在停止时终止。这也可能发生在使用 AWS Auto Scaling 的服务(例如 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk)启动的实例上。在这种情况下,是否会发生实例终止取决于自动扩缩组的实例缩减保护设置。如果您的实例是自动扩缩组的一部分,在开始执行解决步骤之前,请从自动扩缩组中删除该实例。完成解决步骤后,您可以将实例重新添加到自动扩缩组。
  • 停止并重启实例会更改实例的公有 IP 地址。当您将外部流量路由到您的实例时,最佳做法是使用弹性 IP 地址而不是公有 IP 地址。
  • 如果实例的根设备是实例存储卷,则无法使用用户数据更改 SSH 密钥。有关详细信息,请参阅 Amazon EC2 实例的根卷
  • 对实例的用户数据的更新适用于所有支持 cloud-init 指令的发行版。必须安装和配置 Cloud-init。有关详细信息,请参阅 Cloud-init 网站上的 SSH - 配置 SSH 和 SSH 密钥

完成以下步骤:

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

  2. 选择 Instance 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 连接到 Linux 实例

Amazon EC2 密钥对和 Amazon EC2 实例

如何解决使用 SSH 连接到 Amazon EC2 Linux 实例时出现的问题?

AWS 官方
AWS 官方已更新 7 个月前