当我尝试使用 SSH 连接 EC2 实例时,为什么会出现“Server refused our key”错误?
使用 SSH 连接到 Amazon Elastic Compute Cloud(Amazon EC2)实例时,我收到“Server refused our key”错误。
简短描述
SSH 服务器(sshd)拒绝 SSH 私钥的原因有很多。下面是您可能会收到此错误的一些常见原因:
- 连接到 EC2 实例时,您使用的 AMI 用户名不正确。常用用户名是 ec2-user、ubuntu、centos、root 或 admin。
- 试图访问实例的用户已从服务器上删除,或者帐户被锁定。
- 实例存在权限问题或者您缺少目录。
- 连接到 EC2 实例时,您使用的私钥文件不正确。有关更多信息,请参阅为什么在连接 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例时会遇到“imported-openssh-key”或“Putty 致命错误”错误?中的验证私钥是否正确部分。
- /etc/ssh/sshd_config 中的 SSH 服务器设置已更改。有关更多信息,请参阅 How do I use SSH to access my EC2 instance after changing the instance’s sshd_config file?
- 操作系统无法挂载(/etc/fstab)主目录。有关更多信息,请参阅 Why is my EC2 Linux instance not booting and going into emergency mode? 中的 Dependency failed errors 部分
解决方案
连接到 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 策略。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前