8

标题说明了一切。每当我尝试通过 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>

<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 问题中有所描述。

4

4 回答 4

12

您缺少该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" ] ]

是必需的Resource: "*" 并且是唯一可能的值

资源 –(必需)在密钥策略中,您使用“*”作为资源,表示“此 CMK”。密钥策略仅适用于它附加到的 CMK。

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

于 2017-02-01T23:50:01.287 回答
4

如果这对某人有帮助,请注意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 
于 2020-12-15T13:55:50.623 回答
1
LambdaKmsKey:
  Type: AWS::KMS::Key
  Properties:
    Description: Key for Lambda function
    Enabled: True
    KeyPolicy:
      Version: '2012-10-17'
      Id: key-consolepolicy-3
      Statement:
        - Sid: Enable IAM User Permissions
          Effect: Allow
          Principal:
            AWS: arn:aws:iam::AwsAccountId:root
          Action: kms:*
          Resource: "*"
        - Sid: Allow use of the key
          Effect: Allow
          Principal:
            AWS:
              Fn::GetAtt: [ IamRoleLambdaExecution, Arn ]
          Action:
            - kms:Decrypt
            - kms:Encrypt
          Resource: "*"

此策略有点危险,因为它授予具有 kms:decrypt 权限的帐户下的任何用户或角色来解密和查看密钥,这是不安全的,并且无法通过笔测试。

如果您想取消解密权限。

LambdaKmsKey:
  Type: AWS::KMS::Key
  Properties:
    Description: Key for Lambda function 
    Enabled: True
    KeyPolicy:
      Version: '2012-10-17'
      Id: key-consolepolicy-3
      Statement:
        - Sid: Enable IAM User Permissions
          Effect: Allow
          Principal:
            AWS: arn:aws:iam::AwsAccountId:role/sudo
          Action:
            - kms:Create*
            - kms:Describe*
            - kms:Enable*
            - kms:List*
            - kms:Put*
            - kmzs:Update*
            - kms:Revoke*
            - kms:Disable*
            - kms:Get*
            - kms:Delete*
            - kms:ScheduleKeyDeletion
            - kms:CancelKeyDeletion
            - kms:Encrypt
          Resource: "*"
        - Sid: Enable IAM User Permissions
          Effect: Allow
          Principal:
            AWS: arn:aws:iam::AwsAccountId:role/admin
          Action:
            - kms:Create*
            - kms:Describe*
            - kms:Enable*
            - kms:List*
            - kms:Put*
            - kmzs:Update*
            - kms:Revoke*
            - kms:Disable*
            - kms:Get*
            - kms:Delete*
            - kms:ScheduleKeyDeletion
            - kms:CancelKeyDeletion
            - kms:Encrypt
          Resource: "*"
        - Sid: Enable IAM User Permissions
          Effect: Allow
          Principal:
            AWS: arn:aws:iam::AwsAccountId:root
          Action:
            - kms:List*
            - kms:Get*
            - kms:Encrypt
          Resource: "*"
        - Sid: Allow use of the key
          Effect: Allow
          Principal:
            AWS:
              Fn::GetAtt: [ IamRoleLambdaExecution, Arn ]
          Action:
            - kms:Decrypt
            - kms:Encrypt
          Resource: "*"

这样,我将除解密之外的所有其他权限授予 sudo 和管理员角色(确保您拥有这些角色)

我正在向具有列表、获取和加密权限的角色和用户提供列表、获取和加密权限。

于 2019-04-22T18:34:38.360 回答
1

当我尝试通过 lambda 创建 CMK 时,我遇到了同样的错误。所以我在创建密钥时在密钥策略中添加了 lambda 角色 arn。

{
  "Sid": "Allow access for Key Administrators",
  "Effect": "Allow",
  "Principal": {
     "AWS": "arn of lambda role"
   }
}
于 2020-02-13T04:20:05.647 回答