【问题标题】:EC2 instance with a cross account IAM role具有跨账户 IAM 角色的 EC2 实例
【发布时间】: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


    【解决方案1】:

    您不能将跨账户 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 方法。

    【讨论】:

      【解决方案2】:

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

      1. 帐户A中,我创建了一个角色(例如RoleForB)来信任帐户B,并附加到之前创建的角色IAM 政策,允许它在账户 A 中执行一些读取操作。 e.g ReadOnlyAccess
      2. 帐户 B 中,我创建了一个 角色(例如 AssumeRoleInA)并附加了一个 策略 以允许它承担以下角色在帐户 A 中创建。
      3. 账户 B中,将第 2 步中创建的 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. account B EC2终端当命令step 4.完成后,你可以看到访问密钥ID、秘密访问密钥和会话令牌 从你路由它的任何地方,在我们的例子中 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,让它承担中名为RoleForB的角色帐户 A
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
              "arn:aws:iam::Account_A_ID:role/RoleForB"
            ]
          }
        ]
      }
      
      1. 账户 B 中,创建一个新的 EC2 实例(如果尚不存在),并将其 ec2-profileIAM 角色 名为 AssumeRoleInA
      {
          "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. account B EC2终端当命令step 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
      

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

      【讨论】:

      • 工作就像一个魅力!我一步一步地跟着它。
      【解决方案3】:

      您也可以为上面的第 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"]')
      

      【讨论】:

      • 你能解释一下这是做什么的吗?
      【解决方案4】:

      根据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 角色。

      【讨论】:

        猜你喜欢
        • 2019-09-13
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 2015-07-11
        • 1970-01-01
        • 2018-07-09
        相关资源
        最近更新 更多