新的密钥策略将不允许您将来更新密钥策略

Rab*_*820 2 amazon-web-services aws-cloudformation aws-kms

标题说明了一切.每当我尝试通过AWS CloudFormation模板创建KMS密钥时,我都会收到此错误.我将模板创建为具有管理权限的IAM用户,并且我希望该密钥可由具有KMS权限的同一AWS账户中的任何IAM用户管理.我正在使用以下YAML资源定义作为密钥:

LambdaKmsKey:
    Type: AWS::KMS::Key
    Properties:
      Enabled: true
      KeyPolicy:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Action: kms:*
          Principal:
            AWS: <Principle>
Run Code Online (Sandbox Code Playgroud)

然而,<Principal>即使我尝试以root用户身份创建堆栈,以下任何值都无效!

  • !Join [ "", [ "arn:aws:iam::", !Ref "AWS::AccountId", ":root" ] ]
  • !Join [ "", [ "arn:aws:sts::", !Ref "AWS::AccountId", ":root" ] ]
  • !Ref "AWS::AccountId"

我不能仅仅为Principal硬编码我的用户名,因为我希望任何具有堆栈创建权限的人都可以实例化此模板.有谁知道如何解决这个令人沮丧的情况?提前致谢.

编辑:

我应该提一下,我不再在CloudFormation模板中定义KMS密钥策略.实际上,我现在完全避免在我的CF模板中定义任何安全资源,例如IAM实体,策略和ACM证书.我在GitHub问题中描述了我的原因.

spg*_*spg 9

您缺少该Resource: "*"属性.这对我有用:

  LambdaKmsKey:
    Type: AWS::KMS::Key
    Properties:
      Enabled: true
      KeyPolicy:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Action: kms:*
          Resource: "*"
          Principal:
            AWS: !Join [ "", [ "arn:aws:iam::", !Ref "AWS::AccountId", ":root" ] ]
Run Code Online (Sandbox Code Playgroud)

Resource: "*" 是必需的,也是唯一可能的值:

资源 - (必需)在密钥策略中,您对资源使用"*",这意味着"此CMK".关键策略仅适用于它所附加的CMK.

有关示例,请参阅https://aws.amazon.com/premiumsupport/knowledge-center/update-key-policy-future/.

  • 嗯 - 这对我不起作用,我仍然遇到同样的错误。 (4认同)
  • 我们需要所有“kms”权限吗?(即为什么“操作:kms:*”?) (2认同)

小智 9

如果这对某人有帮助,请注意https://aws.amazon.com/premiumsupport/knowledge-center/update-key-policy-future/中的评论

重要提示:请确保您创建的密钥策略允许当前用户管理 CMK。

我在从管道部署模板时遇到了这个问题,并且建议的解决方案对我不起作用。用于部署模板的角色具有相应的 kms 权限,但它也需要位于密钥策略的主体中!

  - Effect: Allow
    Action: kms:*
    Resource: "*"
    Principal:
      AWS:
        - !Sub arn:aws:iam::${AWS::AccountId}:role/PipelineRole 
Run Code Online (Sandbox Code Playgroud)