具有跨帐户IAM角色的EC2实例

时间:2017-05-03 12:49:57

标签: amazon-web-services amazon-ec2 amazon-iam

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

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

ec2实例如何在A?

中承担交叉帐户角色

3 个答案:

答案 0 :(得分:17)

您无法直接将跨帐户IAM角色附加到EC2实例。拥有sts:AssumeRole权限不会自动将一个角色假定为另一个角色。

相反:

  1. 在帐户A中创建跨帐户角色。
  2. 为帐户B中的EC2实例创建IAM角色。授予此角色执行sts:AssumeRole的权限。
  3. 将IAM角色从#2分配给您的EC2实例。
  4. 然后,当您想要从EC2实例访问AWS API时:

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

答案 1 :(得分:3)

假设有两个帐户A和B的方案,说明步骤应为:

  1. 帐户A 中,我创建了一个角色(例如RoleForB)来信任帐户B ,并附加到为角色创建了 IAM策略,以使其能够在帐户A 中执行某些读取操作。 e.g ReadOnlyAccess
  2. 帐户B 中,我创建了一个角色(例如AssumeRoleInA),并附加了一个策略以使其能够承担在帐户A 中创建的角色。
  3. 帐户B 中,将您的EC2实例ec2-profile与步骤2中创建的IAM角色(AssumeRoleInA)相关联。
  4. 帐户B 中,使用命令aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"登录此EC2实例,以承担帐户A 中的角色
  5. li>
  6. 帐户B EC2终端中,当命令完成第4步。时,您可以看到访问密钥ID,秘密访问密钥和会话令牌< / strong>,无论您是手动路由还是使用脚本,都可以将其路由到任何地方(在我们的情况下为stdout)。然后,您可以将这些值分配给环境变量(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角色,然后附加相应的policy以使其担任名为{{1 }}中的帐户A
RoleForB
  1. 帐户B 中,创建一个新的 EC2实例(如果尚不存在),并将其 ec2-profile IAM角色名为{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::Account_A_ID:role/RoleForB" ] } ] }
AssumeRoleInA
  1. 帐户B 中,使用以下命令登录此EC2实例,以承担帐户A 中的角色
{
    "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"`
  1. 帐户B EC2终端中,当命令完成第4步。时,您可以看到访问密钥ID,秘密访问密钥和会话令牌< / strong>,无论您是手动路由还是使用脚本,都可以将其路由到任何地方(在我们的情况下为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

互补阅读: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html

答案 2 :(得分:0)

对于上面的第5步,您也可以按照以下步骤进行导出:

Promise.all()