AWS KMS でのキーポリシーの使用 - AWS Key Management Service

AWS KMS でのキーポリシーの使用

キーポリシーは、AWS KMS の カスタマーマスターキー (CMKs) へのアクセスを制御するための主要な方法です。キーポリシーだけが、アクセスを制御する方法ではありませんが、キーポリシーを使用しないと、アクセスを制御することはできません。詳細については、「AWS KMS CMKs へのアクセスの管理」を参照してください。

JSON ポリシードキュメントの作成と書式設定については、IAM ユーザーガイドの「IAM JSON ポリシーリファレンス」を参照してください。

キーポリシーの概要

キーポリシーは、JSON (JavaScript Object Notation) を使用してアクセス権限を指定するドキュメントです。JSON ドキュメントは、直接操作するか、AWS マネジメントコンソール のデフォルトビューというグラフィカルインターフェイスを使用して操作できます。

コンソールのキーポリシー用デフォルトビューの詳細については、「デフォルトのキーポリシー」と「キーポリシーの変更」を参照してください。JSON ポリシードキュメントの作成と書式設定については、IAM ユーザーガイドの「IAM JSON ポリシーリファレンス」を参照してください。

キーポリシードキュメントは 32 KB (32,768 バイト) を超えることはできません。キーポリシードキュメントは AWS の他のポリシードキュメントと同じ JSON 構文を使用し、その基本構造は以下のようになっています。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "statement identifier", "Effect": "effect", "Principal": "principal", "Action": "action", "Resource": "resource", "Condition": {"condition operator": {"condition context key": "context key value"}} }] }

キーポリシードキュメントには Version 要素が必要です。バージョンを 2012-10-17 (最新バージョン) に設定することをお勧めします。さらに、キーポリシードキュメントには 1 つ以上のステートメントが必要で、各ステートメントには最大 6 つの要素が必要です。

  • Sid – (オプション) Sid はステートメント識別子で、ステートメントの識別に使用できる任意の文字列です。

  • Effect – (必須) この効果には、ポリシーステートメントのアクセス権限を許可するか拒否するかを指定します。効果は、Allow または Deny にする必要があります。CMK へのアクセスを明示的に許可しない場合、アクセスは暗黙的に拒否されます。CMK へのアクセスを明示的に拒否できます。これは、別のポリシーがアクセスを許可している場合でも、ユーザーが CMK にアクセスできないようにするために行うことができます。

  • プリンシパル – (必須) プリンシパルは、ポリシーステートメントで指定されたアクセス権限を取得するアイデンティティです。プリンシパルとして、AWS アカウント (ルート)、IAM ユーザー、IAM ロール、AWS サービスをキーポリシーで指定できます。IAM グループは有効なプリンシパルではありません。

    注記

    アクセス権限を許可するキーポリシーステートメントで、プリンシパルをアスタリスク (*) に設定しないでください。アスタリスクに設定すると、別のポリシーステートメントで明示的に拒否しない限り、すべての AWS アカウントの各 ID に、CMK を使用するアクセス権限が付与されます。他の AWS アカウントのユーザーは、各自のアカウントで CMK を使用する、該当の IAM アクセス権限を必要としているのみです。

  • Action – (必須) このアクションには、許可または拒否する API オペレーションを指定します。たとえば、kms:Encrypt アクションは AWS KMS の暗号化 オペレーションに対応します。ポリシーステートメントに複数のアクションのリストを指定できます。詳細については、「AWS KMS API アクセス許可のリファレンス」を参照してください。

  • リソース – (必須) キーポリシーでは、リソースの要素の値は "*" で、これは「この CMK」を意味します。 アスタリスク ("*") は、キーポリシーがアタッチされた CMK を識別します。

  • Condition – (オプション) この条件には、キーポリシーが有効になるために満たす必要のある要件を指定します。条件により、AWS は、API リクエストのコンテキストを評価し、ポリシーステートメントが適用されるかどうかを判断できます。詳細については、「ポリシー条件の使用」を参照してください。

AWS ポリシー構文の詳細については、『IAM ユーザーガイド』の「AWS IAM ポリシーリファレンス」を参照してください。

デフォルトのキーポリシー

CMK をプログラムにより作成した場合のデフォルトキーポリシー

CMK をプログラムで作成する (つまり AWS KMS API (AWS SDK またはコマンドラインツールを使用する場合を含む) を使用して作成する) 場合は、新しい CMK のキーポリシーを指定することもできます。指定しない場合、このポリシーは AWS KMS によって作成されます。このデフォルトのキーポリシーには、CMK を所有する AWS アカウント (ルートユーザー) に CMK へのフルアクセスを許可し、アカウント内の IAM ポリシーが CMK へアクセスできるようにする 1 つのポリシーステートメントがあります。このポリシーステートメントの詳細については、「AWS アカウントへのアクセスを許可し、IAM ポリシーを有効にする」を参照してください。

AWS マネジメントコンソール を使用して CMK を作成した場合のデフォルトキーポリシー

AWS マネジメントコンソール で CMK を作成するときに、CMK へのアクセスが許可される IAM ユーザー、IAM ロール、AWS アカウントを選択できます。選択したユーザー、ロール、アカウントは、コンソールで作成されるデフォルトキーポリシーに追加されます。コンソールのデフォルトビューを使用して、このキーポリシーを表示または変更したり、キーポリシードキュメントを直接操作したりできます。コンソールで作成されたデフォルトキーポリシーにより、以下のアクセス権限が付与されます。各アクセス権限については、該当するセクションで説明しています。

アクセス許可

AWS アカウントへのアクセスを許可し、IAM ポリシーを有効にする

デフォルトキーポリシーでは、CMK を所有する AWS アカウント (ルートユーザー) に CMK へのフルアクセスを許可します。これにより、以下の 2 つのことが可能になります。

1.CMK を管理できなくなるリスクを減らす。

AWS アカウントのルートユーザーは削除できないため、このユーザーにアクセスを許可すれば、だれも CMK を管理できなくなるリスクが減ります。次のシナリオを考えてみます。

  1. CMK のキーポリシーにより、1 人の IAM ユーザー (Alice) のみが CMK を管理できる。このキーポリシーでは、ルートユーザーに CMK へのアクセスは許可しない。

  2. だれかが IAM ユーザー (Alice) を削除した。

このシナリオでは、CMK は管理できなくなり、CMK へのアクセスを回復するには、AWS サポートに連絡する必要があります。ルートユーザーは、キーポリシーにより明示的に許可されている場合のみ CMK にアクセスできるため、CMK にアクセスできません。これは、ルートユーザーへのアクセスを暗黙的に許可する AWS の他のほとんどのリソースとは異なります。

2.IAM ポリシーで CMK へのアクセスを許可する。

IAM ポリシー単独では、CMK へのアクセスを許可するには十分ではありません。ただし、キーポリシーによって有効になっている場合は、CMK のキーポリシーと組み合わせて使用することができます。これは、AWS アカウントに CMK へのフルアクセスを許可することで行われ、IAM ポリシーを使用してそのアカウントの IAM ユーザーおよびロールに CMK へのアクセスを許可できます。これ自体は、IAM ユーザーまたはロールに CMK へのアクセスを許可しませんが、IAM ポリシーを使用してアクセスを許可できるようになります。詳細については、「AWS KMS CMKs へのアクセスの管理」を参照してください。

次の例は、AWS アカウントへのアクセスを許可し、その結果 IAM ポリシーが有効になるポリシーステートメントを示しています。

{ "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:root"}, "Action": "kms:*", "Resource": "*" }

CMK の管理をキー管理者に許可する

コンソールによって作成されたデフォルトキーポリシーでは、アカウントの IAM ユーザーおよびロールを選択し、キー管理者とすることができます。キー管理者には、CMK を管理するためのアクセス許可はありますが、暗号化オペレーションで CMK を使用するためのアクセス許可はありません。

警告

キー管理者には、データの暗号化と復号に CMK を使用するためのアクセス許可がありませんが、キーポリシーを変更するためのアクセス許可はあります。つまり、自らに任意の AWS KMS アクセス許可を付与できます。

CMK を作成するとき、IAM ユーザーおよびロールをキー管理者のリストに追加できます。次の図に示すように、キーポリシーのコンソールのデフォルトビューを使用してリストを編集することもできます。キーポリシーのデフォルトビューは、各 CMK のキーの詳細ページで使用できます。


          コンソールのデフォルトキーポリシーのキー管理者、デフォルトビュー

コンソールのデフォルトビューを使用して、キー管理者のリストを変更すると、コンソールによって、キーポリシーの特定のステートメントで Principal 要素が変更されます。このステートメントは、キー管理者ステートメントと呼ばれます。以下に示しているのは、キー管理者ステートメントの例です。

{ "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSAdminUser", "arn:aws:iam::111122223333:role/KMSAdminRole" ]}, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }

キー管理者ステートメントでは、以下のアクセス権限が付与されます。

  • kms:Create* – キー管理者がこの CMK のエイリアスと許可を作成できるようにします。

  • kms:Describe* – キー管理者がこの CMK に関する情報 (識別子、作成日、状態など) を取得できるようにします。このアクセス権限は、AWS マネジメントコンソールでキーの詳細ページを表示するために必要です。

  • kms:Enable* – キー管理者がこの CMK の状態を有効に設定できるようにします。対称 CMKs の場合、キー管理者は CMK のキーマテリアルの年ごとのローテーションを指定できます。

  • kms:List* – キー管理者がこの CMK のエイリアス、許可、キーポリシー、タグのリストを取得できるようにします。このアクセス許可は、AWS マネジメントコンソール で CMKs のリストを表示するために必要です。

  • kms:Put* – キー管理者がこの CMK のキーポリシーを変更できるようにします。

  • kms:Update* – キー管理者がエイリアスの参照先をこの CMK に変更したり、この CMK の説明を変更したりできるようにします。

  • kms:Revoke* – キー管理者が、許可によって付与されたこの CMK に対するアクセス許可を取り消せるようにします。

  • kms:Disable* – キー管理者がこの CMK のキーの状態を無効に設定できるようにします。対称 CMKs の場合、キー管理者はこの CMK のキーマテリアルの年ごとのローテーションを無効にできます。

  • kms:Get* – キー管理者がこの CMK のキーポリシーを取得し、この CMK のキーマテリアルの 1 年ごとの更新が行われているかどうか確認できるようにします。インポートされたキーマテリアルを持つ対称 CMKs の場合、キー管理者は CMK にキーマテリアルをインポートするために必要なインポートトークンとパブリックキーをダウンロードできます。非対称 CMKs の場合、キー管理者は CMK のパブリックキーをダウンロードできます。

  • kms:Delete* – キー管理者が、この CMK に関連付けられているエイリアスを削除できるようにします。インポートされたキーマテリアルを持つ対称 CMKs の場合、キー管理者はインポートされたキーマテリアルを削除できます。このアクセス許可により、キー管理者が CMK を削除できるようにはなりません。

  • kms:ImportKeyMaterial – キー管理者が CMK にキーマテリアルをインポートできるようにします。このアクセス許可は、キーマテリアルのない CMK を作成する場合にのみキーポリシーに含まれます。

    注記

    このアクセス権限は、前のサンプルポリシーステートメントには表示されません。

  • kms:TagResource – キー管理者がこの CMK のタグを追加および更新できるようにします。

  • kms:UntagResource – キー管理者がこの CMK からタグを削除できるようにします。

  • kms:ScheduleKeyDeletion – キー管理者がこの CMK を削除できるようにします。

  • kms:CancelKeyDeletion – キー管理者がこの CMK の保留中の削除をキャンセルできるようにします。

前述のリストの最後の 2 つのアクセス許可 (kms:ScheduleKeyDeletion および kms:CancelKeyDeletion) は、CMK を作成するとデフォルトで含まれます。ただし、CMK を作成するとき、[キーの管理者がこのキーを削除できるようにする] チェックボックスをオフにすることにより、キーポリシーからオプションで削除することができます。同様に、キーの詳細ページを使用して既存の CMKs のデフォルトキーポリシーから削除することができます。詳細については、「キーの編集」を参照してください。

これらのアクセス権限の多くには、ワイルドカード文字 (*) が含まれています。つまり、AWS KMS が今後新しい API オペレーションを追加した場合、キー管理者は、Create、Describe、Enable、List、Put、Update、Revoke、Disable、Get、または Delete で始まるすべての新しい API オペレーションを自動的に実行することができます。

注記

前のセクションで説明したキー管理者ステートメントは、デフォルトキーポリシーの最新バージョンです。デフォルトキーポリシーの以前のバージョンについては、「キーポリシーを最新の状態に保つ」を参照してください。

CMK の使用をキーユーザーに許可する

対称 CMKs にコンソールが作成するデフォルトキーポリシーを使用すると、アカウントの IAM ユーザーおよびロール、外部 AWS アカウントを選択し、キーユーザーとすることができます。

コンソールは、キーユーザーのキーポリシーに 2 つのポリシーステートメントを追加します。

CMK を作成するとき、IAM ユーザー、IAM ロール、および他の AWS アカウントをキーユーザーのリストに追加できます。次の図に示すように、キーポリシーのコンソールのデフォルトビューを使用してリストを編集することもできます。キーポリシー用デフォルトビューは、キーの詳細ページにあります。他の AWS アカウントのユーザーに CMK の使用を許可する方法の詳細については、「他のアカウントのユーザーに CMK の使用を許可する」を参照してください 。


          コンソールのデフォルトキーポリシーのキーユーザー、デフォルトビュー

コンソールのデフォルトビューを使用して、キーユーザーのリストを変更すると、コンソールによって、キーポリシーの 2 つのステートメントで Principal 要素が変更されます。これらのステートメントはキーユーザーステートメントと呼ばれます。以下に示しているのは、対称 CMKs のキーユーザーステートメントの例です。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

暗号化オペレーションで CMK を使用することをキーユーザーに許可する

キーユーザーには、CMK でサポートされているすべての暗号化オペレーションで CMK を直接使用するためのアクセス許可があります。また、DescribeKey オペレーションを使用して、AWS KMS コンソールで、または AWS KMS API オペレーションを使用し、CMK に関する詳細情報を取得することもできます。

デフォルトでは、AWS KMS コンソールはデフォルトのキーポリシーに次の例のようなキーユーザーのステートメントを追加します。異なる API オペレーションをサポートするため、対称 CMKs のポリシーステートメント、パブリックキー暗号化の非対称 CMKs、署名と検証用の非対称 CMKs のアクションはわずかに異なります。

対称 CMKs

コンソールは、シンメトリック CMKs のキーポリシーに次のステートメントを追加します。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey*", "kms:ReEncrypt*" ], "Resource": "*" }
パブリックキー暗号化用の非対称 CMKs

コンソールは、[暗号化と復号] のキーの使用方法を使用して、非対称 CMKs のキーポリシーに次のステートメントを追加します。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:DescribeKey", "kms:GetPublicKey" ], "Resource": "*" }
署名および検証用の非対称 CMKs

コンソールは、[署名および検証] のキーの使用方法を使用して、非対称 CMKs のキーポリシーに次のステートメントを追加します。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:DescribeKey", "kms:GetPublicKey", "kms:Sign", "kms:Verify" ], "Resource": "*" }

これらのステートメントのアクションは、キーユーザーに以下のアクセス許可の一部を与えます。

  • kms:Encrypt – キーユーザーがこの CMK でデータを暗号化できるようにします。

  • kms:Decrypt – キーユーザーがこの CMK でデータを復号できるようにします。

  • kms:DescribeKey – キーユーザーがこの CMK に関する詳細情報 (その識別子、作成日、キーの状態など) を取得できるようにします。また、キーユーザーは CMK の詳細を AWS KMS コンソールに表示できます。

  • km:GenerateDataKey* – キーユーザーは、クライアント側の暗号化オペレーションのために、対称データキーまたは非対称データキーペアを要求できます。コンソールでは、* ワイルドカード文字を使用して、以下の API オペレーションに対するアクセス許可を表します。GenerateDataKeyGenerateDataKeyWithoutPlaintextGenerateDataKeyPair、および GenerateDataKeyPairWithoutPlaintext

  • kms:GetPublicKey – キーユーザーが非対称 CMK のパブリックキーをダウンロードできるようにします。このパブリックキーを共有する当事者は、AWS KMS の外部のデータを暗号化できます。ただし、これらの暗号文は、AWS KMS で Decrypt オペレーションを呼び出すことによってのみ復号できます。

  • kms:ReEncrypt* – この CMK でもともと暗号化されたデータを再暗号化すること、以前に暗号化されたデータをこの CMK で再暗号化することを、キーユーザーに許可します。ReEncrypt オペレーションでは、ソースおよび宛先 CMKsの両方にアクセスする必要があります。これを行うには、ソース CMK の kms:ReEncryptFrom アクセス許可と宛先 CMK の kms:ReEncryptTo アクセス許可を許可します。ただし、わかりやすいように、コンソールは両方の CMKs で kms:ReEncrypt* を (* ワイルドカード文字で) 許可します。

  • kms: Sign – キーユーザーがこの CMK でメッセージに署名できるようにします。

  • kms:Verify – キーユーザーがこの CMK で署名を検証できるようにします。

AWS サービスで CMK を使用することをキーユーザーに許可する

コンソールのデフォルトのキーポリシーでは、AWS KMS と統合された AWS のサービス (特に許可を使用するサービス) に CMK を使用できるようにするアクセス許可もキーユーザーに付与されます。

キーユーザーは、制限された特定の方法でこれらのサービスに CMK を使用するためのアクセス許可を暗黙的に付与できます。アクセス権限のこの暗黙の委任は、許可を使用して行われます。これらの許可により、統合 AWS のサービスは CMK を使用してアカウント内のリソースを保護できます。

{ "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

たとえば、キーユーザーは以下の方法で CMK でこれらのアクセス許可を使用できます。

  • CMK を Amazon Elastic Block Store (Amazon EBS) および Amazon Elastic Compute Cloud (Amazon EC2) で使用して、暗号化された EBS ボリュームを EC2 インスタンスにアタッチします。キーユーザーは、CMK を使用して暗号化されたボリュームをインスタンスにアタッチするための Amazon EC2 権限を暗黙的に付与します。詳細については、「Amazon Elastic Block Store (Amazon EBS) で AWS KMS を使用する方法」を参照してください。

  • この CMK を Amazon Redshift で使用して、暗号化クラスターを起動します。キーユーザーは、CMK を使用して暗号化されたクラスターを起動し、暗号化されたスナップショットを作成するための Amazon Redshift 権限を暗黙的に付与します。詳細については、「Amazon Redshift で AWS KMS を使用する方法」を参照してください。

  • この CMK を、AWS KMS と統合される他の AWS のサービス (特に、許可を使用するサービス) で使用して、暗号化されたリソースをそれらのサービスで作成、管理、または利用します。

kms:GrantIsForAWSResource 条件キーを使用すると、キーユーザーは許可を作成および管理できます。ただし、被付与者が許可を使用する AWS サービスである場合に限られます。この権限により、キーユーザーは、許可を使用するすべての統合サービスを使用できます。ただし、特定の AWS のサービスがキーユーザーの代わりに CMK を使用できるようにするカスタムキーポリシーを作成できます。詳細については、「kms:ViaService」の条件キーを参照してください。

キーユーザーは、統合サービスで CMK を使用するには、これらのアクセス許可の付与が必要ですが、これらのアクセス許可では不十分です。キーユーザーには、統合されたサービスを使用するアクセス許可も必要です。AWS KMS と統合される AWS サービスへのアクセスをユーザーに許可する方法の詳細については、統合されるサービスのドキュメントを参照してください。

キーポリシーの例

以下に示しているのは、対称 CMK の完全なキーポリシーの例です。このキーポリシーでは、先ほどのデフォルトキーポリシーのセクションからのポリシーステートメント例と、以下のことを行うための 1 つのキーポリシーを組み合わせています。

  • AWS アカウント (ルートユーザー) 111122223333 に CMK へのフルアクセスを許可し、そのアカウントの IAM ポリシーで CMK へのアクセスを許可します。

  • IAM ユーザー KMSAdminUser と IAM ロール KMSAdminRole が CMK を管理できるようにします。

  • IAM ユーザー CMKUser、IAM ロール CMKRole、および AWS アカウント 444455556666 に CMK の使用を許可します。

{ "Version": "2012-10-17", "Id": "key-consolepolicy-2", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:root"}, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSAdminUser", "arn:aws:iam::111122223333:role/KMSAdminRole" ]}, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": "true"}} } ] }

以下の画像に示しているのは、コンソールのキーポリシー用デフォルトビューで、このキーポリシーがどのように表示されるかの例です。


        コンソールのキーポリシー用デフォルトビューでのキーポリシー