amazon-web-services - CloudFormation 拒绝以最小权限创建 AWS::KMS::Key

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

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

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

但是当我不以任何条件限制帐户主体时,这会消除最小权限原则。 CreateKey PutKeyPolicy API 调用都有一个选项 BypassPolicyLockoutSafetyCheck对于我们这些白痴到认为自己更了解的人来说!除了 CloudFormation 不会公开 AWS::KMS::Key 的内容:(

因此,除非我基本上将关键策略保持开放状态,否则我会在堆栈中收到以下错误:

Resource handler returned message: "The new key policy will not allow you to update the key policy in the future. (Service: Kms, Status Code: 400, Request ID: xxxx, Extended Request ID: null)" (RequestToken: xxxx, HandlerErrorCode: InvalidRequest)

我已经为主体尝试了多种选项,其中 Condition 删除(如下) key 已创建,但没有高兴。

- 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 上的选项和不同设置。我尝试过在服务名称中包含或不包含区域。我肯定漏掉了一些东西,但我已经花了几个小时来思考这个问题。

网络搜索、AWS 论坛搜索一无所获,所以我希望 StackOverflow 的好心人能够指导我 - future 我也会寻求同样的帮助:)

似乎无法链接到 AWS KMS API 页面上的表部分以获取 CreateKey or PutKeyPolicy 上的条件键。但我不认为我错过了这些技巧?

提前致谢 - 罗伯特。

最佳答案

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

这将启用 IAM 用户权限。

向每个角色、用户或用户组添加其他策略。 添加 key 管理策略。 添加使用策略。 您可以在此处微调您的访问权限。

尝试使用这个关键策略并对其进行调整。 这是我在 cfn 堆栈中用于 RDS 加密的 key 。 (是的!我知道策略应该应用于用户组,而不是直接应用于最佳实践的用户......但这是在我可以从“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"

关于amazon-web-services - CloudFormation 拒绝以最小权限创建 AWS::KMS::Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68673068/

相关文章:

node.js - 即时将文件从 S3 移动到 AWS EFS

android - 使用 AWS SNS 将仅通知负载发送到 GCM

python - 在 Elastic Beanstalk 上部署 Pyramid 应用程序

amazon-web-services - Cloudformation 堆栈删除上的 Clean Chef 节点/客户端

amazon-web-services - 无法通过CloudFormation创建ECS服务

javascript - AWS Cognito 在 Web View 中保留经过身份验证的 session

yaml - 资源 SecretsManager 的资源属性 MySecretA 无效,如何在 yml 中创建多个 secret ?

amazon-web-services - 我可以从不同的 AWS 区域的不同账户解密 KMS key 吗?

amazon-web-services - AWS 拥有的 CMK 与 AWS 管理的 CMK

aws-cloudformation - 在 CloudFormation 模板中为不同区域创建 KMS 自定义 key