跳至內容

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

2 分的閱讀內容
0

當我使用 AWS CloudFormation 建立 AWS Key Management Service (KMS) 並定義 AWS KMS 金鑰政策時,金鑰建立會失敗。然後,我收到下列錯誤訊息: 「新的金鑰政策將不允許您在未來更新金鑰政策」。

簡短描述

AWS KMS 會在您將金鑰政策套用至金鑰時,執行安全檢查。一項安全檢查會確認金鑰政策中的主體具有執行 CreateKeyPutKeyPolicy API 作業所需的許可。此檢查確保 AWS KMS 金鑰維持可管理狀態。

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

解決方案

**注意:**當您建立 AWS CloudFormation 堆疊時,會使用 IAM 使用者或角色來執行 CreateStack API 作業。此使用者也可用來建立 AWS CloudFormation 範本中指定的資源。

建立 AWS KMS 金鑰

請完成下列步驟:

  1. 使用 AWS CloudFormation 建立 AWS KMS 金鑰
  2. 選擇一個適當的 IAM 使用者或角色,日後可用來管理您的金鑰。
  3. 透過 kms:PutKeyPolicy 動作在允許陳述式中包含有效的管理主體後,請使用 BypassPolicyLockoutSafetyCheck 資源參數。

在下列範例中,AWS CloudFormation 堆疊由 IAM 使用者 arn:aws:iam::123456789012:user/Alice 建立。KeyAdmin 角色指定為金鑰管理員。使用下列格式的金鑰政策建立金鑰時,IAM 角色 KeyAdmin 可以修改金鑰政策:

{
    "Type": "AWS::KMS::Key",
    "Properties": {
        "Description": "A sample key",
        "KeyPolicy": {
            "Version": "2012-10-17",
            "Id": "key-default-1",
            "Statement": [
                {
                    "Sid": "Allow administration of the key",
                    "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" }

在上述範例中,IAM 角色的名稱是 FederatedAccess,而聯合身分使用者的名稱是 FederatedUsername。這允許多個使用者,使用相同的角色,同時只有受信任的使用者可以修改金鑰政策。

當您使用 AWS CloudFormation 服務角色建立堆疊時,您可以將主體設定為服務角色 ARN,以避免錯誤。

範例:

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

在上述範例中,AWS CloudFormation 服務角色的名稱是 ServiceRoleName

若要將 AWS 帳戶根使用者設定為主體金鑰管理員,請執行下列命令:

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

**注意:**如果主體金鑰管理員設定為根 ARN,請確保您擁有正確的許可。建立 AWS CloudFormation 堆疊的 IAM 使用者、角色或服務角色必須具備執行 CreateKeyPutKeyPolicy API 作業的 IAM 許可。

**重要:**當您將主體金鑰管理員設定為根 ARN 時,帳戶中具有足夠 IAM 許可的任何主體都可以修改金鑰,而不僅限於根使用者。

金鑰政策中擁有具備 kms:PutKeyPolicy 許可的主體後,您即可使用 AWS CloudFormation 建立您的 AWS KMS 金鑰。使用 AWS CloudFormation 範本中的 BypassPolicyLockoutSafetyCheck 屬性。

範例:

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 administration of the key
          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 官方已更新 1 年前