【发布时间】:2017-10-01 07:32:27
【问题描述】:
我在我的一个账户(比如账户 A)中创建了一个跨账户 IAM 角色,并希望将该角色附加到另一个账户(账户 B)中的 ec2 实例。
我尝试在账户 B 中创建一个新角色,其中 sts:AssumeRole 指向 A 中的角色,并将其附加到 B 中的一个 ec2 实例。似乎不起作用。
ec2实例如何承担A中的跨账户角色?
【问题讨论】:
标签: amazon-web-services amazon-ec2 amazon-iam
我在我的一个账户(比如账户 A)中创建了一个跨账户 IAM 角色,并希望将该角色附加到另一个账户(账户 B)中的 ec2 实例。
我尝试在账户 B 中创建一个新角色,其中 sts:AssumeRole 指向 A 中的角色,并将其附加到 B 中的一个 ec2 实例。似乎不起作用。
ec2实例如何承担A中的跨账户角色?
【问题讨论】:
标签: amazon-web-services amazon-ec2 amazon-iam
您不能将跨账户 IAM 角色直接附加到 EC2 实例。并且拥有sts:AssumeRole 权限不会自动使一个角色成为另一个角色。
改为:
sts:AssumeRole的权限。然后,当您想从您的 EC2 实例访问 AWS API 时:
sts:AssumeRole代入账户A的跨账户角色,获取临时凭证。【讨论】:
假设有两个账户 A 和 B,解释步骤应该是:
RoleForB)来信任帐户B,并附加到之前创建的角色IAM 政策,允许它在账户 A 中执行一些读取操作。 e.g ReadOnlyAccess
AssumeRoleInA)并附加了一个 策略 以允许它承担以下角色在帐户 A 中创建。AssumeRoleInA) 关联到您的 EC2 实例 ec2-profile。aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB" 在账户 A 中担任角色。stdout 手动或使用脚本。然后,您可以将这些值分配给环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN)
所以让我们一步一步检查上面提到的配置,但有一些模式细节:
RoleForB 的角色并为其附加 ReadOnlyAccess 权限来建立对帐户 B 的信任。李>
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
"Action": "sts:AssumeRole"
}
}
AssumeRoleInA的角色,然后附加相应的policy,让它承担中名为RoleForB的角色帐户 A。{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::Account_A_ID:role/RoleForB"
]
}
]
}
AssumeRoleInA。{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}
}
aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"`
例如:
jenkins@bb-jenkins-vault:~$ aws sts assume-role --role-arn arn:aws:iam::521111111144:role/DeployMaster --role-session-name "project-dev-jenkins-deploy"
{
"AssumedRoleUser": {
"AssumedRoleId": "AROAJBXGEHOQBXGEHOQ:project-dev-jenkins-deploy",
"Arn": "arn:aws:sts::521111111144:assumed-role/DeployMaster/project-dev-jenkins-deploy"
},
"Credentials": {
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"SessionToken": "FQoGZXIvYXCUm8iG6/zLdQ7foognvCDpxKP7cRJiZgc...CUm8iG6/zLdQ7foognvCDpxKP7c+OQF",
"Expiration": "2019-03-29T15:41:02Z",
"AccessKeyId": "AKIAI44QH8DHBEXAMPLE"
}
}
stdout 手动或使用脚本。然后,您可以将这些值分配给环境变量
$ export AWS_ACCESS_KEY_ID=AKIAI44QH8DHBEXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_SESSION_TOKEN=FQoGZXIvYXCUm8iG6/zLdQ...<remainder of security token>
$ aws ec2 describe-instances --region us-east-1
补充阅读:https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html
【讨论】:
您也可以为上面的第 5 步导出如下:
TEMP_ACCESS_ACCOUNT=$(aws sts assume-role --role-arn arn:aws:iam::Account_A_ID:role/RoleForB --role-session-name example)
export AWS_ACCESS_KEY_ID=$(echo ${TEMP_ACCESS_ACCOUNT} | jq -r '.["Credentials"]["AccessKeyId"]')
export AWS_SECRET_ACCESS_KEY=$(echo ${TEMP_ACCESS_ACCOUNT} | jq -r '.["Credentials"]["SecretAccessKey"]')
export AWS_SESSION_TOKEN=$(echo ${TEMP_ACCESS_ACCOUNT} | jq -r '.["Credentials"]["SessionToken"]')
【讨论】:
根据latest docs,您可以在ACCOUNT B 的EC2 实例上的~/.aws/config 中创建命名角色配置文件,如下所示
[profile marketingadmin]
role_arn = arn:aws:iam::ACCOUNT_A:role/marketingadminrole
credential_source = Ec2InstanceMetadata
以下可能对类似情况有用
credential_source 属性支持以下值:
Environment – 从环境变量中检索源凭据。
Ec2InstanceMetadata – 使用附加到 Amazon EC2 > 实例配置文件的 IAM 角色。
EcsContainer – 使用附加到 Amazon ECS 容器的 IAM 角色。
【讨论】: