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

3 分钟阅读
0

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

解决方法

SSH 服务器 (sshd) 可能会因以下原因之一而拒绝 SSH 私钥:

如果您的实例存在权限问题或缺少目录,您可能还会收到 Server refused our key(服务器拒绝了我们的密钥)错误消息。要验证您的实例权限和目录,请使用以下方法之一。

使用 EC2 Serial Console

如果您激活了适用于 Linux 的 EC2 Serial Console,则可以使用串行控制台对支持的基于 Nitro 的实例类型进行故障排除

使用 Systems Manager 登录实例并检查权限

先决条件:安装 AWS Systems Manager Agent (SSM Agent)。此外,请确保您的配置符合会话管理器(AWS Systems Manager 的一项功能)的先决条件

要使用会话管理器对您的实例进行故障排除,请完成以下步骤:

  1. 打开 Systems Manager 控制台

  2. 启动会话

  3. 要确保目录下的文件具有正确的权限,请运行以下命令:

    stat /home/ec2-user/  
    ls -ld /home               # Should show drwxr-xr-x (755)
    ls -ld /home/ec2-user      # Should show drwx------ (700)
    ls -ld /home/ec2-user/.ssh # Should show drwx------ (700)
    ls -l /home/ec2-user/.ssh/authorized_keys # Should show -rw------- (600)     

    **注意:**请将 ec2-user 替换为您的 AMI 的正确用户名
    在输出中,检查 Access(访问权限),以确保您的配置使用以下权限:
    /home Linux 主目录必须具有 0755/drwxr-xr-x 权限。
    /home/ec2-user/ 用户的主目录必须具有 0700/drwx------ 权限。
    /home/ec2-user/.ssh .ssh 目录权限必须具有 0700/drwx------ 权限。
    /home/ec2-user/.ssh/authorized_keys authorized_keys 文件权限必须具有 0600/-rw------- 权限。
    示例输出:

    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

    **注意:**请将 ec2-user 替换为您的 AMI 的正确用户名

  5. 结束会话

  6. 使用 SSH 连接到您的实例

运行 AWSSupport-TroubleshootSSH 运行手册

要自动更正导致错误的问题,请运行 AWSSupport-TroubleshootSSH。该运行手册会在实例上安装 Amazon EC2Rescue 工具,然后识别并更正导致 SSH 远程连接错误的问题。有关详细信息,请参阅我在尝试使用 SSH 连接我的 EC2 实例时收到错误。如何使用 AWSSupport-TroubleshootSSH 自动化工作流程解决 SSH 连接问题?

使用用户数据修复实例的权限

**重要事项:**在停止并启动实例之前,请执行以下操作:

**注意:**当停止并启动某个实例时,该实例的公共 IP 地址将发生变化。最佳实践是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。如果您使用的是 Amazon Route 53,则在公共 IP 地址发生变化时可能需要更新 Route 53 DNS 记录

要使用用户数据修复权限问题,请完成以下步骤:

  1. 打开 Amazon EC2 控制台

  2. 在导航窗格中,选择 Instances(实例),然后选择您的实例。

  3. 选择 Instance state(实例状态),然后选择 Stop Instance(停止实例)。
    **注意:**如果您无法选择 Stop instance(停止实例),则表明该实例已停止,或者其根设备是实例存储卷。

  4. 选择 Actions(操作),然后选择 Instance settings(实例设置)。

  5. 选择 Edit user data(编辑用户数据),然后输入以下命令:

    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
    --//

    **注意:**请将 ec2-user 替换为您的 AMI 的正确用户名。输入上述命令时请不要添加额外的空格。

  6. 选择 Save(保存)。

  7. 启动实例,然后使用 SSH 连接到实例

默认情况下,用户数据命令对于每个实例运行一次。上述步骤会更改默认行为,会在实例每次重启、停止或启动时添加公钥。要恢复默认行为,请删除自定义用户数据命令。最佳做法是允许用户数据在实例首次启动后运行。您可以使用 ModifyInstanceAttribute API 来修改实例的用户数据。要限制对 ModifyInstanceAttribute API 的访问,请使用 AWS Identity and Access Management (IAM) 策略

相关信息

使用 PuTTY 连接到 Linux 实例

Amazon EC2 密钥对和 Amazon EC2 实例

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

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