【问题标题】:Grant cross account secretsmanager access to an IAM role that does not yet exist授予对尚不存在的 IAM 角色的跨账户 secretsmanager 访问权限
【发布时间】:2020-03-31 01:23:53
【问题描述】:

我有两个 AWS 帐户:一个用于保存我的机密的帐户,一个用于部署我的 cloudformation 堆栈的帐户。我正在使用 cloudformation 将我的基础架构部署为代码,并拥有一个非常简单的 CD 管道:

  1. 部署到我的开发堆栈
  2. 等待批准
  3. 销毁开发堆栈
  4. 部署到我的生产堆栈

在我的堆栈中创建的 EC2 实例依赖于启动期间的机密。我想将秘密 ARN 添加到我的 EC2 userdata 脚本中,然后在执行 userdata 脚本时使用 AWS 命令​​行检索秘密值。

我的 EC2 实例使用的 IAM 服务角色也是作为我的 cloudformation 脚本的一部分创建的。因此,在堆栈启动之前,IAM 角色 ARN 是未知的。我发现自己陷入了一个问题 22:在授予对我的秘密的访问权限之前,我无法启动我的堆栈,但我无法授予对我的秘密的访问权限,因为资源策略中的 Principal 不接受通配符。

有人知道我如何能够为我的秘密创建一个不需要事先知道 IAM 角色 ARN 的秘密管理器资源策略吗?或者还有其他想法?

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-cloudformation amazon-iam aws-secrets-manager


    【解决方案1】:

    在资源策略中指定主体的更好替代方法是使用基于属性的访问控制(ABAC,也称为标记)。有一个相当详细的tutorial 为 IAM 策略设置此内容,可以针对资源策略进行修改。

    在这种方法中,您将创建资源策略来授予对另一个帐户的访问权限,但仅限于具有给定标签的委托人。然后,当您在另一个帐户中创建角色时,您为他们添加标签以获取他们需要访问的秘密。例如,只有当标签“access-project”的密钥和访问角色的值相同时,下面的资源策略才将 GetSecretValue 授予账户 123456789012:

    {
      "Version" : "2012-10-17",
      "Statement" : [ {
        "Effect" : "Allow",
        "Principal": {"AWS": "123456789012" }, 
        "Condition": {
            "StringEquals": {
                "aws:ResourceTag/access-project": "${aws:PrincipalTag/access-project}"
            }
        },
        "Action" : "secretsmanager:GetSecretValue",
        "Resource" : "*"
      } ]
    }
    

    将此资源策略添加到密钥后,您还需要将标签“access-project”添加到密钥和用户/角色。请注意,这只授予 GetSecretValue。让用户修改密钥或密钥上的标签可能是个坏主意,但如果您需要这样做,您还可以包括参考教程中的其他条件。当然,如果您不想在机密中添加标签,也可以在资源策略中对标签进行硬编码。

    一般而言,这种方法更易于管理,因为您无需在每次添加或删除用户/角色时都不断更新资源策略。您只需添加或删除用户和/或机密的标签。

    执行此操作的另一种方法是仅向整个账户开放密钥,然后在该账户限制内谁可以通过 IAM 策略访问密钥(可能仍使用本教程中的标签)。跨账户访问需要资源策略授予访问权限和 IAM 用户/角色策略授予访问权限。

    【讨论】:

    • 更新了我的答案以说明教程未解决资源策略。
    • 嗨@JoeB - 这就是更新。我看到了这篇文章,但无法让它发挥作用。我试试看!
    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2021-01-01
    • 2021-10-16
    • 1970-01-01
    • 2020-05-28
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多