我的目标是使用 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。