AWS CloudFormation を使用して AWS KMS キーを作成したときに発生するエラーを解決する方法を教えてください。

所要時間2分
0

AWS Key Management Service (AWS KMS) キーを作成し、AWS CloudFormation を使用して AWS KMS キーポリシーを定義しましたが、キーを作成できず、次のエラーメッセージが表示されます。 "新しいキーポリシーでは、今後キーポリシーを更新することはできません。"

簡単な説明

AWS KMS は、キーにキーポリシーを適用するときに安全性チェックを実行します。安全性チェックには、キーポリシー内のプリンシパルに CreateKeyPutKeyPolicy API 操作を実行するために必要なアクセス許可があることを確認するものが含まれています。このチェックにより、AWS KMS キーが引き続き管理可能であることが保証されます。

重要: 作成したキーポリシーで、AWS KMS キーを管理するための適切な AWS Identity and Access Management (IAM) プリンシパルを許可していることを確認してください。

解決策

注: AWS CloudFormation スタックの作成時には、IAM ユーザーまたはロールを使用して CreateStack API 操作が実行されます。AWS CloudFormation テンプレートで指定されたリソースの作成にも、このユーザーを使用します。

AWS KMS キーを作成する

次の手順を実行します。

  1. AWS CloudFormation を使用して AWS KMS キーを作成します。
  2. 今後キーを管理するために使用できる、適切な IAM ユーザーまたはロールを選択してください。
  3. kms:PutKeyPolicy アクションの Allow ステートメントに有効な管理プリンシパルを含めた後、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 が原因でキーが管理不能になる可能性があります。ポリシーに有効なプリンシパルを使用していることを確認してください。

プリンシパルキーの管理者を設定する

フェデレーション ID プロバイダーのプリンシパルキー管理者を設定するには、ロールセッションの Amazon リソースネーム (ARN) を使用します。外部 ID プロバイダーの特定の管理ユーザーが持つロール引き受けセッションをキー管理のプリンシパルとして使用することもできます。

例:

"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 アカウントの root ユーザーをプリンシパルキー管理者として設定するには、次のコマンドを実行します。

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

注: プリンシパルキー管理者が root の ARN に設定されている場合は、正しいアクセス許可があることを確認してください。AWS CloudFormation スタックを作成する IAM ユーザー、ロール、サービスロールには、CreateKey および PutKeyPolicy API 操作を実行するための IAM アクセス許可が必要です。

重要: プリンシパルキー管理者を root の ARN に設定した場合、root ユーザーに加え、十分な 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公式
AWS公式更新しました 2ヶ月前