![如何在没有访问密钥的情况下连接到 AWS EC2 串行控制台](https://linux22.com/image/785150/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%B2%A1%E6%9C%89%E8%AE%BF%E9%97%AE%E5%AF%86%E9%92%A5%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%BF%9E%E6%8E%A5%E5%88%B0%20AWS%20EC2%20%E4%B8%B2%E8%A1%8C%E6%8E%A7%E5%88%B6%E5%8F%B0.png)
我的目标是使用 SSH(例如从笔记本电脑)连接到 EC2 实例的串行控制台,并使用最佳的现代安全实践进行设置。
AWS 文档 (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-serial-console.html) 表示应尽可能避免使用 IAM 用户访问密钥(因为它们的寿命太长,因此很容易受到攻击,并且会导致轮换和保护它们的开销)。它记录的替代方法之一是推送 SSH 公钥,以便串行控制台服务在有限的时间内接受相应的 SSH 私钥。这一切似乎都很有道理。
要运行 AWS CLI 来推送公钥(aws ec2-instance-connect send-serial-console-ssh-public-key ...
),AWS CLI 配置文件(在配置或凭证文件中)似乎必须包含与具有必要权限的 IAM 用户相对应的 IAM 访问密钥:
- 当我运行没有访问密钥的 CLI 命令时,它会失败并显示
无法找到凭证。您可以通过运行“aws configure”来配置凭证。
- 当我运行 CLI 命令并指定一个配置文件,其中包含属于 IAM 用户的访问密钥,但该用户没有权限时,它会失败并显示
调用 SendSerialConsoleSSHPublicKey 操作时发生错误 (AccessDeniedException):用户:arn:aws:iam::{my_AWS_account}:user/{my_IAM_user} 无权执行:ec2-instance-connect:SendSerialConsoleSSHPublicKey 对资源:arn:aws:ec2:us-west-2:{my_AWS_account}:instance/{my_EC2_instance},因为没有基于身份的策略允许 ec2-instance-connect:SendSerialConsoleSSHPublicKey 操作
- 当我使用包含 IAM 用户的访问密钥的配置文件运行 CLI 命令时做拥有必要的权限,它就会成功
所以看来我应该采用第三种方法。但如果推送 SSH 密钥的全部目的是为了减少 IAM 访问密钥的使用,那么我还没有实现这一点——充其量我只是在这个过程的早期推送了访问密钥。
那么正确的方法是什么?
答案1
如果有人在追寻类似问题时偶然发现了这一点,那么答案似乎是这样的:
使用联合。
更具体地说,避免将具有访问密钥的 IAM 用户分配给人类用户;相反,让这些人从您的公司身份验证系统联合起来(并且我假设,使用 IAM 角色向他们授予权限)。
IAM 用户指南中甚至有一个部分对此进行了阐述:https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html。