与其他资源一样,跨账户共享 AWS“实例角色”?

与其他资源一样,跨账户共享 AWS“实例角色”?

什么有效

我们有几个 EC2 实例,它们在启动时(以及其他时间)从 S3 存储桶中提取内容。为了实现这一点,我们制定了授予只读访问权限的 IAM 策略...

"Effect": "Allow",
"Action": [
    "s3:ListBucket"
],
"Resource": [
    "arn:aws:s3:::BUCKET"
]

"Effect": "Allow",
"Action": [
    "s3:GetObject"
],
"Resource": [
    "arn:aws:s3:::BUCKET/prefix-for-folder",
    "arn:aws:s3:::BUCKET/prefix-for-folder/*",
]

# other similar Get/List/Read permissions for S3, EFS, etc, all
# specifically to support automated read-only instance actions

...是的,这些可能应该合并为单个Statement块;其中一些是生成的,一些是手动管理的。无论如何,我们还有一个附加了上述策略的 IAM 角色。然后,此帐户的 EC2 实例将该角色列为其“实例角色”,并在启动时神奇地获得读取权限。

奇迹般有效。

目标

尝试在不同的 AWS 帐户中创建一些 EC2 实例。理想情况下,我们希望它们能够从第一个帐户列出“实例角色”,并获得对第一个帐户中的存储桶等的相同只读访问权限。

我尝试过的方法

尝试编辑上面提到的 IAM 角色。按照各种“授予跨账户资源访问权限”教程,很明显权限政策/角色中的信任关系在角色中。在“实例角色”中,工作信任关系是

"Effect": "Allow",
"Principal": {
    "Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"

在跨账户共享的示例中,主体是被共享账户的 AWS 账户 ID:

# they're careful to point out that 'root' means any authenticated
# user in that account, not the special root user for the account
"Principal": {
    "AWS": "arn:aws:iam::other-account-12-digit-ID:root",
},

我希望避免为了更换校长而重复角色和制定整个复杂政策,并且根据AWS IAM 用户指南可以列出多个主体,因此我尝试将现有角色的信任关系更改为

"Effect": "Allow",
"Principal": {
    "AWS": "arn:aws:iam::other-account-12-digit-ID:root",
    "Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"

IAM 控制台支持主体语法,并且我已经验证同一帐户中的 EC2 实例继续启动并承担指定的实例角色/策略。

但是,在其他帐户 12 位数字 ID 中创建 EC2 实例不会将此角色显示为实例角色的选项。(在 EC2 的“新启动体验”向导中,如果相关的话。)

我的模糊理论是,arn:aws:iam::other-account-12-digit-ID:root在其他账户中指定 EC2 实例的 ARN 是错误的——猜测这种语法可能适用于人员,而不是实例配置文件——但我不知道我应该尝试什么?我还假设其中任何一个都是可能的——我能找到的所有跨账户共享示例都直接引用 S3 存储桶,而不是 EC2 实例角色。不知道这有多重要?

还有一些涉及 IAM 角色的 SO/SE/ServerFault 问题,例如这个,但问题和答案都涉及 Ansible 或 Elastic Beanstalk 等其他部分。我希望弄清楚我需要手动对 IAM(或 EC2 启动器)本身做什么,并最终将其应用于 CloudFormation 和 AWS CDK 等。

答案1

有几件事:

  1. 创建 EC2 时,您看不到IAM 角色来自其他账户 - 这是意料之中的。控制台向导将仅列出来自同一账户的兼容 IAM 角色。

    我认为您实际上不能直接使用其他帐户中的实例角色。相反,您必须创建授予其权限的实例角色承担角色在另一个帐户中通过信任关系,然后在实例中执行类似的操作aws sts assume-role --role-arn arn:aws:iam::{other-acct-id}:role/ThatS3Role。这将返回临时凭证,您稍后可以使用运行awscli 命令,就像实例在另一个帐户中一样。

    或者aws sts assume-role你也可以使用类似这样的辅助脚本assume-role您稍后可以使用assume-role -r arn:aws:iam::{other-acct}:role/ThatS3Role aws s3 cp ...- 此处“aws s3 cp”命令将与其他帐户凭证一起运行。

  2. 如果仅涉及 S3,您也可以直接授予第二个帐户对另一个帐户中的 S3 存储桶的只读访问权限。以下是一些很好的例子:https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html

希望有帮助:)

答案2

使用外部 ID 和帐户主体,如下所示。这适用于通用角色共享,但我不确定它是否适用于共享实例角色 - 可能不行,因为我不确定您如何传递外部 ID。

RoleAbc:
  Type: "AWS::IAM::Role"
  Properties:
    RoleName: RoleNameGoesHere
    AssumeRolePolicyDocument:
      Version: 2012-10-17
      Statement:
      - Effect: Allow
        Principal:
          AWS: 'arn:aws:iam::123456789012:root'
        Action: 'sts:AssumeRole'
        Condition:
          StringEquals:
            'sts:ExternalId': abc123abc123abc123
    ManagedPolicyArns:
      - arn:aws:iam::123456789012:role/PowerUserRoleOrWhatever
    

相关内容