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

17
标题已经说明了一切。每当我尝试通过AWS CloudFormation模板创建KMS密钥时,就会出现此错误。我正在以管理员权限的IAM用户身份创建模板,并希望任何具有KMS权限的IAM用户在同一AWS帐户中都可以管理该密钥。我正在使用以下YAML资源定义来定义密钥:

The title says it all. 我尝试通过AWS CloudFormation模板创建KMS密钥时,会收到此错误。我是以拥有管理员权限的IAM用户身份创建模板的,并且想要让任何在同一AWS帐户中具备KMS权限的IAM用户都能够管理该密钥。以下是我用于定义密钥的YAML资源定义:

LambdaKmsKey:
    Type: AWS::KMS::Key
    Properties:
      Enabled: true
      KeyPolicy:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Action: kms:*
          Principal:
            AWS: <Principle>

然而,即使我尝试以root用户身份创建堆栈,以下<Principal>的值都不起作用!

  • !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问题中描述。


当您尝试访问CloudFormation堆栈时,您会收到什么错误消息? - spg
1
@Simon-Pierre 这个问题的标题就是我的错误。 - Rabadash8820
1
我们需要所有的kms权限吗?(即为什么使用 Action: kms:*?) - prime
4个回答

18

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

资源:"*"是必需的,并且是唯一可能的值:在密钥策略中,您可以使用 "*" 代表 "此 CMK"。密钥策略仅适用于其所附加到的 CMK。

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


哦天啊,我会一直盯着那个看好几天的!你说得对,Resource: "*" 就是我需要的全部内容。我认为在基于资源的策略中必须包含 Resource 行,而在用户策略中不需要放置 Principal 行真的很荒谬,但是没关系,感谢你的快速回答! - Rabadash8820
2
我们需要所有的 kms 权限吗?(即为什么是 Action: kms:* ?) - prime
@prime 你不需要所有的kms权限。与任何IAM策略一样,您可以根据需要指定尽可能多或尽可能少的操作。@spg回答中提供的链接实际上提供了一个具有更具体“Action”权限的密钥策略示例。 - Rabadash8820
4
嗯,对我来说没有用,我仍然得到相同的错误。 - scubbo
尽管在kms.Key CDK中将用户定义为“admins”可以提供很多操作,但仍然不够。对我来说,“Action:kms:”+“Resource:”就足够了。这似乎有点像一个bug。 - AronNeewart

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 

这超出了我的理解范围 / 不知怎么的,通过阅读您的解决方案,我没有意识到这也是我的情况。 "当前用户" 意味着创建 KMS 密钥的用户必须对密钥及其它任何您想要的用户拥有访问权限。在 Terraform 中,这是用于创建 Terraform 资源的用户,可能是 root 用户。 - vladimirror

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和管理员角色除了解密以外的所有权限(确保这些角色已存在)

并且我会给拥有列表、获取和加密权限的角色和用户提供列表、获取和加密权限。


1

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

{
  "Sid": "Allow access for Key Administrators",
  "Effect": "Allow",
  "Principal": {
     "AWS": "arn of lambda role"
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接