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

ebn*_*ius 9 amazon-ec2 amazon-web-services amazon-iam

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

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

ec2实例如何在A中承担交叉帐户角色?

Mat*_*ser 20

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

代替:

  1. 在帐户A中创建跨帐户角色.
  2. 为帐户B中的EC2实例创建IAM角色.授予此角色执行权限sts:AssumeRole.
  3. 将IAM角色从#2分配给您的EC2实例.

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

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


Exe*_*ero 14

假设有两个账户 A 和 B 的场景,解释步骤应该是:

  1. 账户 A 中,我创建了一个角色(例如RoleForB)来信任账户 B,并将IAM 策略附加到之前创建的角色以允许它在账户 A 中执行一些读取操作。e.g ReadOnlyAccess
  2. 账户 B 中,我创建了一个角色(例如AssumeRoleInA)并附加了一个策略以允许它承担在账户 A 中创建的角色。
  3. 账户 B 中,将在步骤 2 中创建ec2-profile的 IAM 角色 ( AssumeRoleInA)关联到您的 EC2 实例。
  4. 账户 B,使用命令登录此 EC2 实例以代入账户 A 中的角色aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"
  5. 账户 B EC2 终端中,当命令完成第 4 步后,您可以看到访问密钥 ID、秘密访问密钥和会话令牌,无论您从何处路由它,在我们的示例stdout中手动或使用脚本。然后,您可以将这些值分配给环境变量 ( AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN)

所以让我们一步一步检查上面提到的配置,但有一些模式细节:

  1. 与之前在账户 A 中展示的一样,它通过创建名为B的角色RoleForBReadOnlyAccess为其附加权限来建立对账户 B的信任。
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
        "Action": "sts:AssumeRole"
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. B账户,创建一个角色命名AssumeRoleInA然后附上相应的policy允许它承担命名角色RoleForB账户A
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": [
        "arn:aws:iam::Account_A_ID:role/RoleForB"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)
  1. 账户 B 中,创建一个新的EC2 实例(如果尚不存在),并将其ec2-profile与名为的IAM 角色相关联AssumeRoleInA
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"Service": "ec2.amazonaws.com"},
        "Action": "sts:AssumeRole"
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 账户 B,使用以下命令登录此 EC2 实例以代入账户 A 中的角色
aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"`
Run Code Online (Sandbox Code Playgroud)

例如:

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"
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 账户 B EC2 终端中,当命令完成第 4 步后,您可以看到访问密钥 ID、秘密访问密钥和会话令牌,无论您从何处路由它,在我们的示例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
Run Code Online (Sandbox Code Playgroud)

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