如何解决访问 EC2 实例时收到的“Permission denied (publickey)”(权限被拒绝 (publickey))或“Authentication failed, permission denied”(身份验证失败,权限被拒绝)错误?

3 分钟阅读
0

当我访问 Amazon Elastic Compute Cloud (Amazon EC2) 实例时,我收到“Permission denied (publickey)”(权限被拒绝 (publickey))或“Authentication failed, permission denied”(身份验证失败,权限被拒绝)错误。

简短描述

出现 Permission denied (publickey)(权限被拒绝 (publickey))或 Authentication failed, permission denied(身份验证失败,权限被拒绝)错误的原因如下:

  • 进行连接时,您为亚马逊机器映像 (AMI) 使用了错误的用户名。
  • 您在实例操作系统 (OS) 中的文件权限不正确。
  • authorized_keys 文件包含不正确的 SSH 公钥 (.pub) 文件,或者您在没有密钥的情况下启动了实例。
  • authorized_keys 文件或 .ssh 文件夹的名称不正确。
  • authorized_keys 文件或 .ssh 文件夹已被删除。
  • (仅适用于 Ubuntu 20.x)您在 SSH 配置中使用了 AuthorizedKeysCommand

解决方法

验证是否为您的 AMI 使用了正确的用户名

确保为您的 AMI 使用了有效的用户名

验证操作系统中的文件权限是否正确,以及 authorized_keys 文件中的 SSH 公钥是否正确

要验证您的配置,请使用以下方法之一。

使用 EC2 Serial Console

如果您为 Linux 激活了 EC2 Serial Console,则可以使用该控制台对受支持的基于 Nitro 的实例类型进行故障排除。Serial Console 无需网络连接即可连接到您的实例。您可以通过 Amazon EC2 控制台或 AWS 命令行界面 (AWS CLI) 访问 Serial Console。

在使用 Serial Console 之前,请在 AWS 账户级别授予对控制台的访问权限。然后,创建 AWS Identity and Access Management (IAM) 策略,以便为您的 IAM 用户授予对该控制台的访问权限。每个使用 Serial Console 的实例都必须包含至少一个基于密码的用户。有关如何为 Linux 配置 EC2 Serial Console 的信息,请参阅配置对 EC2 Serial Console 的访问

如果您的实例无法访问,并且您尚未配置对 Serial Console 的访问权限,请使用另一种方法来验证您的配置。

**注意:**如果您在运行 AWS CLI 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI

使用 Systems Manager 会话管理器

**注意:**要使用此方法,必须安装 SSM Agent。有关使用 Systems Manager 的先决条件列表,请参阅步骤 1: 满足 Session Manager 先决条件

使用 AWS Systems Manager 会话管理器登录实例并进行更正。完成以下步骤:

  1. 打开 Systems Manager 控制台

  2. 启动会话

  3. 要检查目录下文件的权限是否正确,请运行 ls -ld 命令:

    ls -ld /home/ec2-user/

    **注意:**请将 ec2-user 替换为基于实例的亚马逊机器映像 (AMI) 的用户名
    您收到的输出结果类似于以下示例:

    drwx------ 3 ec2-user ec2-user 4096 Apr  1 08:31 /home/ec2-user/

    以下示例显示了所需的正确权限列表:
    要获取 Linux 主目录 /home,请使用 (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-------)

  4. 在本地计算机上,验证是否使用 SSH 公钥

  5. 如果 SSH 公钥的签名不在输出中,请更新 authorized_keys 文件以允许您的 SSH 密钥。运行以下命令:

    echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys

    **注意:**请将示例密钥替换为您的 SSH 公钥。

  6. 要更正权限,请对您的 EC2 实例运行以下命令:

    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
  7. 结束会话

  8. 使用 SSH 连接到实例

运行 AWSSupport-TroubleshootSSH Automation 运行手册

使用 AWSSupport-TroubleshootSSH 检查并更正通过 SSH 连接到 Linux 计算机时导致远程连接错误的问题。有关详细信息,请参阅我在尝试使用 SSH 连接我的 EC2 实例时收到错误。如何使用 AWSSupport-TroubleshootSSH 自动化工作流程解决 SSH 连接问题?

使用用户数据脚本修复 SSH 权限****并将正确的 SSH 公钥添加到 authorized_keys 文件

**重要事项:**要使用此方法,必须停止实例。当停止实例时,会产生以下影响:

  • 如果您的实例由 Amazon Elastic Block Storage (Amazon EBS) 实例存储提供支持,或者具有包含数据的实例存储卷,则数据将丢失。
  • 如果您的实例是 Amazon EC2 自动扩缩组的一部分,则 Amazon EC2 Auto Scaling 可能会终止该实例。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动的实例可能是自动扩缩组的一部分。在这种情况下,实例终止取决于您的自动扩缩组的实例横向缩减保护设置。如果您的实例是自动扩缩组的一部分,则在完成以下步骤之前,请暂时从自动扩缩组中删除该实例
  • 实例的公有 IP 地址发生变化。当您将外部流量路由到您的实例时,最佳做法是使用弹性 IP 地址而不是公共 IP 地址。

要修复您的 SSH 权限,请完成以下步骤:

  1. 打开 Amazon EC2 控制台

  2. 从导航窗格中选择 Instances(实例),然后选择要启动的实例。

  3. 停止实例

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

  5. 选择 Edit User Data(编辑用户数据)。

  6. 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
    OS_USER=os-user
    chown root:root /home
    chmod 755 /home
    chown $OS_USER:$OS_USER /home/$OS_USER -R
    chmod 700 /home/$OS_USER
    chmod 700 /home/$OS_USER/.ssh
    chmod 600 /home/$OS_USER/.ssh/authorized_keys
    --//

    **注意:**请将 os-user 替换为与用于启动实例的 AMI 关联的用户名

  7. 选择 Save(保存)。

  8. 在本地计算机上,验证是否使用 SSH 公钥

  9. 如果 SSH 公钥的签名不在输出中,请将该密钥添加到用户数据脚本中。如果签名匹配,请继续执行下一步。

    使用 SSH 公钥的用户数据脚本示例:

    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
    OS_USER=os-user
    chown root:root /home
    chmod 755 /home
    chmod 700 /home/$OS_USER
    chmod 700 /home/$OS_USER/.ssh
    chmod 600 /home/$OS_USER/.ssh/authorized_keys
    echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/$OS_USER/.ssh/authorized_keys
    chown $OS_USER:$OS_USER /home/$OS_USER -R
    --//
  10. 启动实例

**注意:**上述用户数据脚本设置为在实例每次重新启动时运行。重新获得对实例的访问权限后,删除该用户数据脚本。

(仅适用于 Ubuntu 20.x)检查 SSH 配置中的 AuthorizedKeysCommand

在 Ubuntu 20.x 中,默认安装了 EC2 Instance Connect。当您为 SSH 身份验证配置 AuthorizedKeysCommandAuthorizedKeysCommandUser 设置时,EC2 Instance Connect 安装不会更新这些设置。因此,您无法使用 EC2 Instance Connect。要解决此问题,请从 SSH 配置中删除 AuthorizedKeysCommandAuthorizedKeysCommandUser

相关信息

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

我丢失了私有密钥。我该如何连接到我的实例?

如果我在 Amazon EC2 实例初次启动后丢失了 SSH 密钥对,我该如何连接到该实例?

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