AWS Key Management Service
開発者ガイド

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

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

キーポリシーの概要

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

キーポリシードキュメントは 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 の暗号化 API オペレーションに対応します。ポリシーステートメントに複数のアクションのリストを指定できます。詳細については、「AWS KMS API アクセス権限のリファレンス」を参照してください。

  • Resource – (必須) キーポリシーでリソースとして、"この CMK" を意味する "*" を使用します。 キーポリシーは、それがアタッチされた CMK にのみ適用されます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

キー管理者による CMK 管理の許可

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

警告

キー管理者には、データの暗号化と復号化に CMK を使用するためのアクセス権限がなくても、キーポリシーを変更するためのアクセス権限があります。つまり、キー管理者は自らにこれらのアクセス権限を付与できます。

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 のステータスを「有効」に設定し、CMK のキーマテリアルの 1 年ごとの更新を指定できるようにします。

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

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

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

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

  • kms:Disable* – キー管理者がこの CMK のステータスを「無効」に設定し、この CMK のキーマテリアルの 1 年ごとの更新を無効にできるようにします。

  • kms:Get* – キー管理者がこの CMK のキーポリシーを取得し、この CMK キーマテリアルの 1 年ごとの更新が行われているかどうか確認できるようにします。この CMK のオリジンが外部の場合、キー管理者はパブリックキーをダウンロードしてこの CMK のトークンをインポートすることもできます。CMK のオリジンの詳細については、「キーマテリアルのインポート」を参照してください。

  • kms:Delete* – キー管理者がこの CMK をポイントするエイリアスを削除できるようにし、この CMK のオリジンが外部の場合はインポートされたキーマテリアルを削除できるようにします。インポートされたキーマテリアルの詳細については、「キーマテリアルのインポート」を参照してください。このアクセス権限により、キー管理者が CMK を削除できるようにはなりません。

  • kms:ImportKeyMaterial – キー管理者が CMK にキーマテリアルをインポートできるようにします。

    注記

    このアクセス権限は、前のサンプルポリシーステートメントには表示されません。また、このアクセス権限は、オリジンが外部の CMK にのみ適用されます。コンソールを使用してキーマテリアルのない CMK を作成すると、自動的にキー管理者ステートメントに追加されます。詳細については、「キーマテリアルのインポート」を参照してください。

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

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

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

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

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

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

注記

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

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

コンソールによって作成されたデフォルトキーポリシーを使用すると、アカウントの IAM ユーザーおよびロール、外部 AWS アカウントを選択し、キーユーザーとすることができます。キーユーザーには、暗号化と復号化のために CMK を直接使用するアクセス権限があります。さらに、自身のアクセス権限のサブセットを、 と統合された AWS サービスAWS KMSの一部に委任するアクセス権限も持っています。キーユーザーは、制限された特定の方法でこれらのサービスに 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 サービスAWS KMS (特に、許可を使用するサービス) で使用して、暗号化されたリソースをそれらのサービスで作成、管理、または利用します。

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

デフォルトキーポリシーでは、キーユーザーに、許可を使用する統合サービスのすべてで KMS CMK を使用するためのアクセス権限が付与されるか、それらのアクセス権限が付与されないかのいずれかになります。デフォルトキーポリシーにより、キーユーザーが統合サービスの一部でのみ CMK を使用可能にすることはできません。ただし、そのためのカスタムキーポリシーを作成することはできます。詳細については、「kms:ViaService」の条件キーを参照してください。

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


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

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

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "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/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

これらの 2 つのうち最初のステートメントでは、キーユーザーが CMK を直接使用できるようにし、以下のアクセス権限を含めます。

  • kms:Encrypt – キーユーザーが AWS KMS でのこの CMK によるデータの暗号化を正常にリクエストできるようにする。

  • kms:Decrypt – キーユーザーが AWS KMS でのこの CMK によるデータの復号を正常にリクエストできるようにする。

  • kms:ReEncrypt* – この CMK でもともと暗号化されたデータを AWS KMS が再暗号化すること、以前に暗号化されたデータをこの CMK で再暗号化することを、キーユーザーが正常にリクエストできるようにする。ReEncrypt API オペレーションには 2 つの CMK へのアクセスが必要です。元の CMK は復号化に使用され、もう 1 つの CMK は以降の暗号化に使用されます。これを行うには、両方の CMK に kms:ReEncrypt* アクセス権限を許可できます (アクセス権限のワイルドカード文字「*」に注意)。または、復号のため CMK で kms:ReEncryptFrom アクセス権限を許可し、暗号化のため CMK で kms:ReEncryptTo アクセス権限を許可できます。

  • kms:GenerateDataKey* – クライアント側の暗号化で使用するデータ暗号化キー (データキー) をキーユーザーが正常にリクエストできるようにする。キーユーザーは、データキーの 2 つのコピーを受け取る選択ができます (1 つはプレーンテキスト形式で、もう— 1 つはこの CMK で暗号化されたもの)。—または、暗号化された形式のデータキーのみを受け取ることができます。

  • kms:DescribeKey – キーユーザーがこの CMK に関する情報 (その識別子、作成日、状態など) を取得できるようにする。

これらの 2 つのうち 2 番目のステートメントでは、キーユーザーが許可を使用して、 と統合される AWS サービスAWS KMSの一部 (特に、許可を使用するサービス) に自らのアクセス権限の一部を委任できるようにします。このポリシーステートメントでは、Condition 要素を使用して、キーユーザーが統合 AWS サービスにアクセス権限を委任するときにのみ、これらのアクセス権限を付与できるようにします。キーポリシーでの条件の使用の詳細については、「ポリシー条件の使用」を参照してください。

キーポリシーの例

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

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

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

  • IAM ユーザー KMSUser、IAM ロール KMSRole、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/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "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/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": "true"}} } ] }

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


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