AWS KMS キーポリシーと CloudFormation フック結果を保管中に暗号化するためのアクセス許可 - CloudFormation

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS KMS キーポリシーと CloudFormation フック結果を保管中に暗号化するためのアクセス許可

このトピックでは、GetHookResult API から利用可能な Hooks 注釈データを暗号化するためのカスタマーマネージドキーを指定するときに必要な AWS KMS キーポリシーとアクセス許可を設定する方法について説明します。

注記

CloudFormation フックは、アカウントの注釈データを暗号化するためにデフォルト AWS 所有のキー を使用するための追加の認可を必要としません。

概要

フック注釈データの暗号化には AWS KMS keys 、以下を使用できます。

  • AWS 所有のキー – デフォルトでは、CloudFormation は AWS 所有のキー を使用してデータを暗号化します。表示、管理、使用 AWS 所有のキー、またはそれらの使用を監査することはできません。ただし、データの暗号化に使用されるキーを保護するために明示的な設定を実行する必要はありません。 AWS 所有のキー は無料で提供されます (月額料金や使用料金はかかりません)。注釈データを保護する暗号化キーを監査または制御する必要がない限り、 AWS 所有のキー が適しています。

  • カスタマーマネージドキー – CloudFormation は、作成、所有、管理する対称カスタマーマネージドキーの使用をサポートし、既存の に 2 番目の暗号化レイヤーを追加します AWS 所有のキー。 AWS KMS 料金が適用されます。詳細については、「AWS Key Management Service デベロッパーガイド」の「キーの作成」を参照してください。キーを管理するには、 AWS KMS コンソール、、 AWS CLIまたは AWS KMS API で (AWS KMS) を使用します AWS Key Management Service 。詳細については、AWS Key Management Service デベロッパーガイドを参照してください。

フックを作成および更新するときに、カスタマーマネージドキーを設定できます。カスタマーマネージドキーを指定すると、CloudFormation はこのキーを使用して注釈データを暗号化してから保存します。GetHookResult API オペレーション中に注釈データに後でアクセスすると、CloudFormation は自動的にデータを復号します。フックの暗号化キーの設定については、「」を参照してくださいフック設定スキーマ構文リファレンス

重要

カスタマーマネージドキーを指定するKmsKeyIdオプションは現在、 を使用してフック AWS CLI を設定する場合にのみ使用できます。

暗号化コンテキストを使用してカスタマーマネージドキーへのアクセスを制御する

CloudFormation フックには、すべての注釈ストレージおよび取得オペレーションで暗号化コンテキストが自動的に含まれます。これにより、キーポリシーで暗号化コンテキスト条件を設定して、キーを特定のフックにのみ使用できるようにします。

  • kms:EncryptionContext:aws:cloudformation:hooks:service – キーが CloudFormation Hooks サービスでのみ使用されるようにします。

  • kms:EncryptionContext:aws:cloudformation:account-id – AWS アカウント ID を一致させることで、クロスアカウントキーの使用を防止します。

  • kms:EncryptionContext:aws:cloudformation:arn – ARN パターンを使用して、特定のフックの使用を制限します。

これらの条件は、暗号化されたデータを特定のフックコンテキストに暗号的にバインドすることで、混乱した代理攻撃に対する保護を強化します。

カスタマーマネージド型 KMS キーのポリシー

カスタマーマネージドキーを作成するときは、CloudFormation Hooks サービスが AWS KMS オペレーションを実行できるように、そのキーポリシーを定義する必要があります。次のキーポリシーを使用するには、プレースホルダー値を独自の情報に置き換えます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnableIAMUserDescribeKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "cloudformation.us-east-1.amazonaws.com" } } }, { "Sid": "EnableIAMUserGenerateDataKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:GenerateDataKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "cloudformation.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:hooks:service": "hooks.cloudformation.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:account-id": "111122223333" }, "StringLike": { "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:111122223333:hook/*" } } }, { "Sid": "EnableIAMUserDecrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "cloudformation.us-east-1.amazonaws.com" } } }, { "Sid": "AllowHooksServiceDescribeKey", "Effect": "Allow", "Principal": { "Service": "hooks.cloudformation.amazonaws.com" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" }, "StringLike": { "aws:SourceArn": "arn:aws:cloudformation:*:111122223333:hook/*" } } }, { "Sid": "AllowHooksService", "Effect": "Allow", "Principal": { "Service": "hooks.cloudformation.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "kms:EncryptionContext:aws:cloudformation:hooks:service": "hooks.cloudformation.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:account-id": "111122223333" }, "StringLike": { "aws:SourceArn": "arn:aws:cloudformation:*:111122223333:hook/*", "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:111122223333:hook/*" } } } ] }

このポリシーは、IAM ロール (最初の 3 つのステートメント) と CloudFormation Hooks サービス (最後の 2 つのステートメント) の両方にアクセス許可を付与します。kms:ViaService 条件キーにより、KMS キーは CloudFormation を介してのみ使用でき、直接の KMS API コールを防ぐことができます。キーオペレーションは次のとおりです。

  • kms:DescribeKey – キープロパティとメタデータを検証します。このオペレーションは、暗号化コンテキスト条件では使用できないため、別のステートメントにあります。

  • kms:GenerateDataKey – ストレージ前に注釈を暗号化するためのデータ暗号化キーを生成します。このオペレーションには、スコープ付きアクセスコントロールの暗号化コンテキスト条件が含まれます。

  • kms:Decrypt – 以前に暗号化された注釈データを復号します。IAM ロールの場合、これには kms:ViaService条件が含まれます。サービスプリンシパルの場合、これには暗号化コンテキスト条件が含まれます。

aws:SourceAccount および aws:SourceArn条件キーは、混乱した代理攻撃に対する主要な保護を提供します。暗号化コンテキスト条件は、追加の検証レイヤーを提供します。詳細については、 AWS Key Management Service デベロッパーガイド「 aws:SourceArnまたは aws:SourceAccount条件キーの使用」を参照してください。

重要

フック実行ロールには AWS KMS アクセス許可は必要ありません。CloudFormation Hooks サービスプリンシパルは、すべての AWS KMS オペレーションを実行します。

SetTypeConfiguration API の KMS アクセス許可

SetTypeConfiguration API コール中に、CloudFormation は指定された AWS KMS キーで注釈データを暗号化するためのユーザーアクセス許可を検証します。SetTypeConfiguration API を使用して暗号化を設定するユーザーまたはロールに、次の IAM ポリシーを追加します。をカスタマーマネージドキーの ARN arn:aws:kms:us-east-1:123456789012:key/abc-123に置き換えます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cloudformation:SetTypeConfiguration", "Resource": "*" }, { "Effect": "Allow", "Action": "kms:DescribeKey", "Resource": "arn:aws:kms:us-east-1:123456789012:key/abc-123" }, { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "arn:aws:kms:us-east-1:123456789012:key/abc-123", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:cloudformation:hooks:service": "hooks.cloudformation.amazonaws.com", "kms:EncryptionContext:aws:cloudformation:account-id": "123456789012" }, "StringLike": { "kms:EncryptionContext:aws:cloudformation:arn": "arn:aws:cloudformation:*:123456789012:hook/*" } } } ] }

GetHookResult API の KMS アクセス許可

カスタマーマネージドキーを使用するフックの GetHookResult を呼び出すには、ユーザーにそのキーに対するkms:Decryptアクセス許可が必要です。を呼び出すユーザーまたはロールに、次の IAM ポリシーを追加しますGetHookResult。をカスタマーマネージドキーの ARN arn:aws:kms:us-east-1:123456789012:key/abc-123に置き換えます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cloudformation:GetHookResult", "Resource": "*" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:us-east-1:123456789012:key/abc-123" } ] }