【问题标题】:CloudFormation refusing to create AWS::KMS::Key with least privilegeCloudFormation 拒绝以最低权限创建 AWS::KMS::Key
【发布时间】:2021-08-05 20:22:31
【问题描述】:

努力将最小权限原则应用于我正在创建的 CMK,目标是创建一个 CloudFormation 模板,该模板可通过 StackSets 用于整个组织。因此,我想要一个可用于帐户中的一般加密任务的密钥(kms:Encryptkms:Decrypt 等),但不能由帐户中的主体修改(特别是 kms:PutKeyPolicy,但不仅如此) .

我有一个从手工制作的钥匙中提取的工作政策。 CloudFormation 模板工作正常,StackSet 启动资源创建。

当我不使用任何条件限制帐户主体时,这消除了最小权限原则。 CreateKeyPutKeyPolicy API 调用都有一个选项 BypassPolicyLockoutSafetyCheck 供我们这些愚蠢到认为自己更了解的人使用!除了 CloudFormation 没有为 AWS::KMS::Key 公开它之外:(

因此,除非我基本上将密钥策略完全打开,否则我会在堆栈中收到以下错误:

资源处理程序返回消息:“新的密钥策略将不允许您将来更新密钥策略。(服务:Kms,状态代码:400,请求 ID:xxxx,扩展请求 ID:null)”(RequestToken : xxxx, HandlerErrorCode: InvalidRequest)

我已经为主体尝试了多种选择,Condition removed(如下所示)创建了密钥,in 没有任何乐趣。

- Sid: AllowUpdatesByCloudFormation
          Effect: Allow
          Principal:
            AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
          Action:
          - kms:Describe*
          - kms:List*
          - kms:PutKeyPolicy
          - kms:CreateAlias
          - kms:UpdateAlias
          - kms:UpdateKeyDescription
          - kms:EnableKey
          - kms:DisableKey
          - kms:EnableKeyRotation
          - kms:DisableKeyRotation
          - kms:GetKey*
          - kms:DeleteAlias
          - kms:TagResource
          - kms:UntagResource
          - kms:ScheduleKeyDeletion
          - kms:CancelKeyDeletion
          Resource: '*'
          # Condition:
          #   StringEquals:
          #     "aws:PrincipalAccount": !Sub ${AWS::AccountId}
          #     "kms:ViaService": !Sub "cloudformation.${AWS::Region}.amazonaws.com"

我尝试了不同的主要设置,包括AWS: "*" 和一些不同的Service 选项,以及Condition 上的不同设置。我已经尝试过在服务名称中使用和不使用区域。我一定错过了什么,但我已经浪费了几个小时来摸索这个。

Web 搜索、AWS 论坛搜索什么都没有,所以我希望 StackOverflow 的好人可以指导我 - 并且将来我会寻求同样的帮助 :)

对于CreateKey or PutKeyPolicy 上的条件键,似乎无法链接到 AWS KMS API 页面上的表格部分,但我认为我没有错过这些技巧?

提前致谢 - 罗伯特。

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-kms least-privilege


    【解决方案1】:

    尝试授予 root 用户所有 kms 权限 - (kms:*) 授予root所有访问权限时,最小权限原则仍然适用。

    这将启用 IAM 用户权限。

    为每个角色或用户或用户组添加额外的策略。 添加密钥管理策略。 添加使用策略。 在那里您可以微调您的访问权限。

    尝试使用此关键策略并对其进行调整。 这是我在 cfn 堆栈中用于 RDS 加密的密钥。 (是的!我知道策略应该应用于用户组,而不是直接应用于最佳实践的用户......但这是在我可以从“aCloud guru”访问的沙盒环境中)

      KeyPolicy:
        Id: key-consolepolicy-3
        Version: "2012-10-17"
        Statement:
          - Sid: Enable IAM User Permissions
            Effect: Allow
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
            Action: kms:*
            Resource: '*'
          - Sid: Allow access for Key Administrators
            Effect: Allow
            Principal:
              AWS:
                - !Sub "arn:aws:iam::${AWS::AccountId}:role/admin"
                - !Sub "arn:aws:iam::${AWS::AccountId}:user/cloud_user"
            Action:
              - kms:Create*
              - kms:Describe*
              - kms:Enable*
              - kms:List*
              - kms:Put*
              - kms:Update*
              - kms:Revoke*
              - kms:Disable*
              - kms:Get*
              - kms:Delete*
              - kms:TagResource
              - kms:UntagResource
              - kms:ScheduleKeyDeletion
              - kms:CancelKeyDeletion
            Resource: '*'
          - Sid: Allow use of the key
            Effect: Allow
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS"
            Action:
              - kms:Encrypt
              - kms:Decrypt
              - kms:ReEncrypt*
              - kms:GenerateDataKey*
              - kms:DescribeKey
            Resource: '*'
          - Sid: Allow attachment of persistent resources
            Effect: Allow
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS"
            Action:
              - kms:CreateGrant
              - kms:ListGrants
              - kms:RevokeGrant
            Resource: '*'
            Condition:
              Bool:
                kms:GrantIsForAWSResource: "true"
    

    【讨论】:

    • 感谢@not-a-coderp,您的政策基本上就是我所拥有的,我必须道歉,我只包括了我想专门用于 CloudFormation 本身的 sn-p。在这个环境中只有角色,根本没有用户,我的策略很一致,除了 CloudFormation 的这个小问题,它希望能够自我更新,并且不授予我绕过绕过的权限。
    猜你喜欢
    • 2017-06-09
    • 2018-08-03
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多