我在一个账户(比如说账户A)中创建了一个跨账户的IAM角色,并希望将该角色附加到另一个账户(账户B)中的EC2实例上。
我尝试在账户B中创建一个新角色,其中sts:AssumeRole指向账户A中的角色,并将其附加到B中的EC2实例。但似乎并没有起作用。
如何使EC2实例扮演账户A中的跨账户角色?
我在一个账户(比如说账户A)中创建了一个跨账户的IAM角色,并希望将该角色附加到另一个账户(账户B)中的EC2实例上。
我尝试在账户B中创建一个新角色,其中sts:AssumeRole指向账户A中的角色,并将其附加到B中的EC2实例。但似乎并没有起作用。
如何使EC2实例扮演账户A中的跨账户角色?
不能直接将跨账户的IAM角色附加到EC2实例上。并且拥有sts:AssumeRole
权限并不会自动使一个角色假扮成另一个角色。
相反:
sts:AssumeRole
的权限。然后,当您想要从EC2实例访问AWS API时:
sts:AssumeRole
来假扮成A账户的跨账户角色,以获取临时凭证。RoleForB
)来信任账户B,并附加一种IAM策略到之前创建的角色上,以允许其执行某些读操作在账户A中。例如: 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
)查看访问密钥ID,秘密访问密钥和会话令牌,可以手动或使用脚本将这些值分配给环境变量: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
的角色,然后附加相应的策略
以允许其扮演账户A中名为RoleForB
的角色。{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::Account_A_ID:role/RoleForB"
]
}
]
}
AssumeRoleInA
的IAM 角色关联。{
"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
),通过手动方式或使用脚本查看访问密钥ID、秘密访问密钥和会话令牌。然后,您可以将这些值分配给环境变量。$ 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
~/.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 角色。
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"]')