1

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

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

只有当我不以任何条件限制帐户主体时,才消除了最小特权原则。和API 调用都为我们这些愚蠢到认为他们知道得更好的人提供了一个CreateKey选项!除了 CloudFormation 没有为:(PutKeyPolicyBypassPolicyLockoutSafetyCheckAWS::KMS::Key

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

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

我已经为主体尝试了多种选择,Condition 删除(如下所示)创建了密钥,但并不高兴。

- 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 的好汉堡可以指导我 - 未来我正在寻找同样的帮助 :)

似乎无法链接到 AWS KMS API 页面上的表格部分以获取条件键 on CreateKeyorPutKeyPolicy但我认为我没有错过这些技巧?

在此先感谢 - 罗伯特。

4

1 回答 1

3

尝试授予 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"
于 2021-08-08T20:29:40.067 回答