跳至內容

如何解決在使用 AWS CloudFormation 建立 AWS KMS key 時收到的錯誤?

2 分的閱讀內容
0

當我建立 AWS Key Management Service (AWS KMS) key 並透過 AWS CloudFormation 定義 AWS KMS key 政策時,金鑰建立失敗。

簡短說明

當您嘗試建立並定義金鑰時,可能會收到以下錯誤訊息:

「The new key policy will not allow you to update the key policy in the future.」

您在金鑰政策中指定的主體必須具備執行 CreateKeyPutKeyPolicy API 操作所需的權限。

**重要:**請確認您建立的金鑰政策允許適當的 AWS Identity and Access Management (IAM) 主體管理 AWS KMS key。

解決方法

**注意:**當您建立 CloudFormation 堆疊時,CloudFormation 會擔任 IAM 角色來執行 CreateStack API 操作。CloudFormation 也會使用該角色建立您在 CloudFormation 範本中指定的資源。

建立 AWS KMS key

請完成以下步驟:

  1. 開啟 CloudFormation console (CloudFormation 主控台)。
  2. 使用 AWS::KMS::Key resource 建立 AWS KMS key。
  3. 選擇可用來管理金鑰的 IAM 使用者或角色。
  4. 在具有 kms:PutKeyPolicy 動作的 Allow 陳述式中加入管理主體。
  5. 使用 BypassPolicyLockoutSafetyCheck 資源參數。

在以下範例中,當政策採用以下格式時,KeyAdmin 角色可以修改金鑰政策:

{    "Type": "AWS::KMS::Key",
    "Properties": {
        "Description": "A sample key",
        "KeyPolicy": {
            "Version": "2012-10-17",
            "Id": "key-default-1",
            "Statement": [
                {
                    "Sid": "Allow access for Key Administrators",
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::123456789012:role/KeyAdmin"
                    },
                    "Action": [
                        "kms:Create*",
                        "kms:Describe*",
                        "kms:Enable*",
                        "kms:List*",
                        "kms:Put*",
                        "kms:Update*",
                        "kms:Revoke*",
                        "kms:Disable*",
                        "kms:Get*",
                        "kms:Delete*",
                        "kms:ScheduleKeyDeletion",
                        "kms:CancelKeyDeletion"
                    ],
                    "Resource": "*"
                },
                {
                    "Sid": "Allow use of the key",
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::123456789012:role/KeyUser"
                    },
                    "Action": [
                        "kms:Encrypt",
                        "kms:Decrypt",
                        "kms:ReEncrypt*",
                        "kms:GenerateDataKey*",
                        "kms:DescribeKey"
                    ],
                    "Resource": "*"
                }
            ]
        }
    }
}

**重要:**如果您的政策中未指定有效主體,則 BypassPolicyLockoutSafetyCheck 可能會導致金鑰無法管理。請確認您在政策中使用有效主體。

設定主體金鑰管理員

若要從聯合身分提供者設定主體金鑰管理員,請使用角色工作階段 Amazon Resource Name (ARN)。您也可以使用外部身分提供者中特定管理使用者的擔任角色工作階段,做為金鑰管理的主體。

政策陳述式範例:

"Principal": { "AWS": "arn:aws:sts::123456789012:assumed-role/FederatedAccess/FederatedUsername" }

注意: 將 FederatedAccess 替換為您的 IAM 角色,並將 FederatedUsername 替換為您的使用者名稱。

當您使用 CloudFormation 服務角色建立堆疊時,請將主體設定為服務角色 ARN。

政策陳述式範例:

"Principal": { "AWS": "arn:aws:iam::123456789012:role/ServiceRoleName" }

**注意:**將 ServiceRoleName 替換為您的服務角色。

若要將 AWS 帳戶根使用者設定為主體金鑰管理員,請在政策中加入以下陳述式:

"Principal": { "AWS": "arn:aws:iam::123456789012:root" }

**注意:**當您將主體金鑰管理員設定為根 ARN 時,帳戶中具備足夠 IAM 權限的任何主體都可以修改金鑰。

當金鑰政策中有具備 kms:PutKeyPolicy 權限的主體時,您可以使用 CloudFormation 建立 AWS KMS key。在 CloudFormation 範本中將 BypassPolicyLockoutSafetyCheck 屬性設定為 true

範例範本:

myKMSKey:  Type: 'AWS::KMS::Key'
  Properties:
    Description: This key is managed by the KeyAdmin role
    BypassPolicyLockoutSafetyCheck: true
    KeyPolicy:
      Version: 2012-10-17
      Id: key-policy-1
      Statement:
        - Sid: Allow access for Key Administrators
          Effect: Allow
          Principal:
            AWS: 'arn:aws:iam::123456789012:role/KeyAdmin'
          Action:
            - 'kms:Create*'
            - 'kms:Describe*'
            - 'kms:Enable*'
            - 'kms:List*'
            - 'kms:Put*'
            - 'kms:Update*'
            - 'kms:Revoke*'
            - 'kms:Disable*'
            - 'kms:Get*'
            - 'kms:Delete*'
            - 'kms:ScheduleKeyDeletion'
            - 'kms:CancelKeyDeletion'
          Resource: '*'
        - Sid: Allow use of the key
          Effect: Allow
          Principal:
            AWS: 'arn:aws:iam::123456789012:role/KeyUser'
          Action:
            - 'kms:DescribeKey'
            - 'kms:Encrypt'
            - 'kms:Decrypt'
            - 'kms:ReEncrypt*'
            - 'kms:GenerateDataKey'
            - 'kms:GenerateDataKeyWithoutPlaintext'
          Resource: '*'
    EnableKeyRotation: true
    PendingWindowInDays: 30

相關資訊

AWS Key Management Service

KMS 金鑰存取與權限

AWS 官方已更新 8 個月前