我有一台 EC2 Ubuntu 主机,其中有一个用户帐户负责在不同时间运行不同的任务。每个任务都需要由相应 IAM 角色(我称之为“配置文件角色”)表示的特定权限。这个想法是在需要时授予此用户承担这些角色的权限。
目前的~/.aws/credentials
配置如下:
[default]
aws_access_key_id = XXX
aws_secret_access_key = YYY
[profile1]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile1
source_profile = default
[profile2]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile2
source_profile = default
...
[profileN]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profileN
source_profile = default
配置文件中的用户default
具有单一权限:承担以 开头的任何角色role-for-profile
。策略 JSON 如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1494333413000",
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::XXXXXXXXXX:role/role-for-profile*"
]
}
]
}
因此,任何需要访问特定 AWS 服务以执行特定任务的应用程序(无论它使用 AWS CLI、Boto、Ansible 模块还是其他什么)都可以指定配置文件名称并透明地承担所需的配置文件角色。
现在我担心的是:由于这是在 EC2 主机上运行的,我根本不需要明确地将任何凭据放入此主机。理论上,我可以将“主” IAM 角色直接附加到 EC2 主机,而不是创建用户、授予其切换角色权限并将其凭据明确放入default
配置文件中。
但是,我似乎无法做到这一点,因为source_profile
参数是必需的。有人知道我如何在不提供任何凭证的情况下授权 EC2 主机承担角色吗?换句话说,我希望主机原则上按照“我的东西”(具有给定 IAM 角色的 EC2 实例)而不是“我知道的东西”(明确提供的 IAM 用户的访问密钥和密钥)进行身份验证。
更新。发现了几个功能请求 - 看起来这个还不支持 :(
UPDATE2。看来我需要澄清一下此设置的目的。我有不同的脚本在同一台主机上运行(甚至可能并行运行)。每个脚本都需要一组特定的权限。我想要实现的是,每个脚本只有这组权限,而不是更多。在我看来,实现此目的的最佳方法如下:
- 在主机级别不提供任何权限,除了承担多个特定角色的权限。
- 当脚本开始工作时,它需要承担相应的角色才能获得所需的权限。
- 同时,我不想将角色 ARN 嵌入到脚本中。相反,我想在 中定义多个配置文件
~/.aws/credentials
,每个配置文件都定义为承担特定角色。
我对前两项没有问题。但是,实现第三项需要我创建一个“默认”配置文件,其他配置文件将使用它作为参考,并且出于某种原因,这个“默认”配置文件必须具有用户的凭据。我想要引用附加到运行所有这些内容的 EC2 实例的角色。
答案1
我一直在尝试解决同样的问题。我能找到的最接近的要点是:https://gist.github.com/gene1wood/34b02fa3091e184e1997
它使用aws sts assume-role
命令获取一组临时凭证(默认情况下 60 分钟后过期)。我假设您可以使用此脚本获取分配给 EC2 实例的角色的临时凭证,并更新“默认”配置文件的 AWS 访问密钥和 AWS 密钥。由于临时凭证每小时过期一次,因此您需要一个 cron 作业来定期更新它们。
这是一种丑陋的黑客行为,但直到它得到支持之前,我认为它很有可能发挥作用。
答案2
AWS 仅允许您为 EC2 实例分配一个角色。该角色应具有 EC2 实例可能需要承担的所有权限。参考。
您可以使用命令行更改分配给实例的角色,但这不是您想要在运行时定期执行的操作。
答案3
现在就可以了。详细说明如下: https://docs.aws.amazon.com/cli/latest/topic/config-vars.html#using-aws-iam-roles
请参阅 2018 年 10 月/12 月更新内容: https://github.com/aws/aws-cli/issues/1390
答案4
将“默认”角色附加为实例的主要角色。这样就无需在默认配置文件上输入凭据。
为其他角色创建具有凭证的非默认配置文件。