跨账户IAM角色的EC2实例

20

我在一个账户(比如说账户A)中创建了一个跨账户的IAM角色,并希望将该角色附加到另一个账户(账户B)中的EC2实例上。

我尝试在账户B中创建一个新角色,其中sts:AssumeRole指向账户A中的角色,并将其附加到B中的EC2实例。但似乎并没有起作用。

如何使EC2实例扮演账户A中的跨账户角色?

4个回答

29

不能直接将跨账户的IAM角色附加到EC2实例上。并且拥有sts:AssumeRole权限并不会自动使一个角色假扮成另一个角色。

相反:

  1. 在A账户中创建你的跨账户角色。
  2. 在B账户中为EC2实例创建IAM角色。给予该角色执行sts:AssumeRole的权限。
  3. 将步骤#2中的IAM角色分配给你的EC2实例。

然后,当您想要从EC2实例访问AWS API时:

  1. 执行sts:AssumeRole来假扮成A账户的跨账户角色,以获取临时凭证。
  2. 使用这些临时凭证来执行其余API方法。

14
假设有两个账户A和B,操作步骤如下:
  1. 账户A中,我创建了一个角色(例如 RoleForB)来信任账户B,并附加一种IAM策略到之前创建的角色上,以允许其执行某些读操作在账户A中。例如: ReadOnlyAccess
  2. 账户B中,我创建了一个角色(例如 AssumeRoleInA),并附加了一个策略,允许它扮演在账户A中所创建的角色。
  3. 账户B中,将IAM角色 (AssumeRoleInA) 分配给你的EC2实例ec2-profile.
  4. 账户B中登入这个EC2实例,使用命令aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB" 扮演账户A中的角色。
  5. 账户B的EC2终端,当完成步骤4的命令时,你可以从任何地方路由(例如stdout)查看访问密钥ID,秘密访问密钥和会话令牌,可以手动或使用脚本将这些值分配给环境变量:AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN

因此,让我们逐步检查上面提到的配置,但更详细一些:

  1. 如前所述,在账户A中,通过创建名为RoleForB的角色并将ReadOnlyAccess权限附加到它上面来建立对账户B的信任。
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
        "Action": "sts:AssumeRole"
    }
}
  1. 账户B中创建名为AssumeRoleInA角色,然后附加相应的策略以允许其扮演账户A中名为RoleForB的角色。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": [
        "arn:aws:iam::Account_A_ID:role/RoleForB"
      ]
    }
  ]
}
  1. 账户 B中,创建一个新的EC2 实例(如果不存在),并将其ec2-profile与名为AssumeRoleInAIAM 角色关联。
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"Service": "ec2.amazonaws.com"},
        "Action": "sts:AssumeRole"
    }
}
  1. 账户B中登录到此EC2实例,使用以下命令扮演账户A的角色:
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"
    }
}
  1. 账户B的EC2终端中,当命令步骤4完成时,您可以从任何已路由到的位置(在我们的情况下是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


运行得非常好!我一步一步地按照它的指示进行了。 - rahuljain1311

0
根据最新文档,您可以在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 角色。


0
您可以按照上述步骤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"]')

1
你能解释一下这段代码在做什么吗? - DJ_Stuffy_K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接