Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何解决访问 EC2 实例时收到的“Permission denied (publickey)”(权限被拒绝 (publickey))或“Authentication failed, permission denied”(身份验证失败,权限被拒绝)错误?
当我访问 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 使用了正确的用户名
验证操作系统中的文件权限是否正确,以及 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 会话管理器登录实例并进行更正。完成以下步骤:
-
启动会话。
-
要检查主目录下文件的权限是否正确,请运行 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-------)。 -
在本地计算机上,验证是否使用 SSH 公钥。
-
如果 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 公钥。
-
要更正权限,请对您的 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
-
结束会话。
运行 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 权限,请完成以下步骤:
-
打开 Amazon EC2 控制台。
-
从导航窗格中选择 Instances(实例),然后选择要启动的实例。
-
停止实例。
-
选择 Actions(操作),然后选择 Instance settings(实例设置)。
-
选择 Edit User Data(编辑用户数据)。
-
在 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 关联的用户名。
-
选择 Save(保存)。
-
在本地计算机上,验证是否使用 SSH 公钥。
-
如果 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 --//
-
启动实例。
**注意:**上述用户数据脚本设置为在实例每次重新启动时运行。重新获得对实例的访问权限后,删除该用户数据脚本。
(仅适用于 Ubuntu 20.x)检查 SSH 配置中的 AuthorizedKeysCommand
在 Ubuntu 20.x 中,默认安装了 EC2 Instance Connect。当您为 SSH 身份验证配置 AuthorizedKeysCommand 和 AuthorizedKeysCommandUser 设置时,EC2 Instance Connect 安装不会更新这些设置。因此,您无法使用 EC2 Instance Connect。要解决此问题,请从 SSH 配置中删除 AuthorizedKeysCommand 和 AuthorizedKeysCommandUser。