VPC エンドポイントを介した AWS KMS への接続 - AWS Key Management Service

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

VPC エンドポイントを介した AWS KMS への接続

仮想プライベートクラウド (VPC) 内のプライベートインターフェイスエンドポイント経由で AWS KMS に直接接続することができます。インターフェイス VPC エンドポイントを使用する場合、VPC と AWS KMS 間の通信は完全に AWS ネットワーク内で行われます。

AWS KMS は、AWS PrivateLink を利用する Amazon Virtual Private Cloud (Amazon VPC) エンドポイントをサポートしています。各 VPC エンドポイントは、VPC サブネット内のプライベート IP アドレスを持つ 1 つ以上の Elastic Network Interfaces (ENI) で表されます。

インターフェイス VPC エンドポイントは VPC を AWS KMS に直接接続します。その際、インターネットゲートウェイ、NAT デバイス、VPN 接続、または AWS Direct Connect 接続を使用しません。VPC のインスタンスは、パブリック IP アドレスがなくても AWS KMS と通信できます。

リージョン

AWS KMS は、AWS KMS がサポートされているすべての AWS リージョン で、VPC エンドポイントと VPC エンドポイントポリシーをサポートしています。

AWS KMS VPC エンドポイントに関する考慮事項

AWS KMS 用のインターフェイス VPC エンドポイントをセットアップする前に、「AWS PrivateLink ガイド」の「インターフェイスエンドポイントのプロパティと制限」のトピックを確認してください。

AWS KMS には、VPC エンドポイントをサポートするために以下の機能が用意されています。

  • VPC エンドポイントを使用して、VPC からすべての AWS KMS API オペレーションを呼び出すことができます。

  • AWS KMS リージョンエンドポイントまたは AWS KMS FIPS エンドポイントに接続するインターフェイス VPC エンドポイントを作成できます。

  • AWS CloudTrail ログを使用して、VPC エンドポイントを介した KMS キーの使用を監査することができます。詳細については、「VPC エンドポイントのログ記録」を参照してください。

AWS KMS 用の VPC エンドポイントの作成

Amazon VPC コンソールまたは Amazon VPC API を使用して、AWS KMS 用の VPC エンドポイントを作成できます。詳細については、「AWS PrivateLink ガイド」の「インターフェイスエンドポイントを作成」を参照してください。

  • AWS KMS 用の VPC エンドポイントを作成するには、次のサービス名を使用します。

    com.amazonaws.region.kms

    例えば、米国西部 (オレゴン) リージョン(us-west-2)では、サービス名は次のようになります。

    com.amazonaws.us-west-2.kms
  • AWS KMS FIPS エンドポイントに接続する VPC エンドポイントを作成するには、次のサービス名を使用します。

    com.amazonaws.region.kms-fips

    例えば、米国西部 (オレゴン) リージョン(us-west-2)では、サービス名は次のようになります。

    com.amazonaws.us-west-2.kms-fips

VPC エンドポイントを使いやすくするために、VPC エンドポイントに対してプライベート DNS 名を有効にすることができます。[Enable DNS Name] (DNS 名を有効にする) オプションを選択すると、標準の AWS KMS DNS ホスト名が VPC エンドポイントに解決されます。例えば、https://kms.us-west-2.amazonaws.com はサービス名 com.amazonaws.us-west-2.kms に接続された VPC エンドポイントに解決されます。

このオプションにより VPC エンドポイントが使いやすくなります。AWS SDK および AWS CLI はデフォルトで標準の AWS KMS DNS ホスト名を使用するため、アプリケーションおよびコマンドで VPC エンドポイント URL を指定する必要はありません。

詳細については、「AWS PrivateLink ガイド」の「インターフェイスエンドポイントを介したサービスへアクセスする」を参照してください。

AWS KMS VPC エンドポイントへの接続

AWS SDK、AWS CLI、または AWS Tools for PowerShell を使用して VPC エンドポイント経由で AWS KMS に接続できます。VPC エンドポイントを指定するには、DNS 名を使用します。

例えば、この list-keys コマンドは、 endpoint-url パラメータを使用して VPC エンドポイントを指定します。こうしたコマンドを使用するには、サンプルの VPC エンドポイント ID を、ご自身のアカウントのものに置き換えてください。

$ aws kms list-keys --endpoint-url https://vpce-1234abcdf5678c90a-09p7654s-us-east-1a.ec2.us-east-1.vpce.amazonaws.com

VPC エンドポイントの作成時にプライベートホスト名を有効にした場合は、CLI コマンドまたはアプリケーションの設定で VPC エンドポイント URL を指定する必要はありません。標準の AWS KMS DNS ホスト名は VPC エンドポイントに解決されます。AWS CLI と SDK はデフォルトでこのホスト名を使用します。このため、VPC エンドポイントの使用を開始して、スクリプトやアプリケーションで何も変更することなく AWS KMS リージョンエンドポイントに接続できます。

プライベートホスト名を使用するには、VPC の enableDnsHostnames 属性と enableDnsSupport 属性を true に設定する必要があります。これらの属性を設定するには、 ModifyVpcAttributeオペレーションを使用します。詳細については、「Amazon VPC ユーザーガイド」の「VPC の DNS 属性の表示と更新」を参照してください。

VPC エンドポイントへのアクセスの制御

AWS KMS の VPC エンドポイントへのアクセスを制御するには、VPC エンドポイントポリシーを VPC エンドポイントにアタッチします。エンドポイントポリシーは、プリンシパルが VPC エンドポイントを使用して AWS KMS リソースに対する AWS KMS オペレーションを呼び出すことができるかどうかを決定します。

エンドポイントの作成時に VPC エンドポイントポリシーを作成できます。また、VPC エンドポイントポリシーはいつでも変更できます。VPC マネジメントコンソール、または CreateVpcEndpointまたは ModifyVpcEndpointオペレーションを使用します。AWS CloudFormation テンプレートを使用して VPC エンドポイントポリシーを作成および変更することもできます。VPC マネジメントコンソールの使用方法については、「AWS PrivateLink ガイド」の「インターフェイスエンドポイントの作成」および「インターフェイスエンドポイントの変更」を参照してください。

注記

AWS KMS は、2020 年 7 月以降、VPC エンドポイントポリシーをサポートします。その日付以前に作成された AWS KMS の VPC エンドポイントには、デフォルトの VPC エンドポイントポリシーが設定されていますが、いつでも変更できます。

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

VPC エンドポイントポリシーについて

VPC エンドポイントを使用する AWS KMS リクエストが成功するには、プリンシパルに 2 つのソースからのアクセス許可が必要です。

  • キーポリシーIAM ポリシー権限が リソース (KMS キーまたはエイリアス) でオペレーションを呼び出すために、プリンシパルにアクセス許可を付与する必要があります。

  • VPC エンドポイントポリシーは、エンドポイントを使用してリクエストを実行するためのアクセス権限をプリンシパルに付与する必要があります。

例えば、キーポリシーがプリンシパルに、特定の KMS キーで Decrypt を呼び出すためのアクセス許可を付与します。ただし、VPC エンドポイントポリシーは、プリンシパルがエンドポイントを使用して、その KMS キー で Decrypt を呼び出すことを許可しない場合があります。

または、VPC エンドポイントポリシーは、プリンシパルがエンドポイントを使用して特定の KMS キーDisableKeyで を呼び出すことを許可する場合があります。ただし、プリンシパルにキーポリシー、IAM ポリシー、または付与からのアクセス権限がない場合、リクエストは失敗します。

デフォルトの VPC エンドポイントポリシー

すべての VPC エンドポイントには VPC エンドポイントポリシーがありますが、ポリシーを指定する必要はありません。ポリシーを指定しない場合、デフォルトのエンドポイントポリシーでは、エンドポイント上のすべてのリソースのすべてのプリンシパルによるすべてのオペレーションが許可されます。

ただし、AWS KMS リソースでは、プリンシパルがキーポリシーIAM ポリシー権限からオペレーションを呼び出すアクセス許可も必要です。したがって、実際には、デフォルトポリシーでは、プリンシパルがリソースに対してオペレーションを呼び出す権限を持っている場合、エンドポイントを使用してオペレーションを呼び出すこともできます。

{ "Statement": [ { "Action": "*", "Effect": "Allow", "Principal": "*", "Resource": "*" } ] }

許可されたオペレーションのサブセットのみに VPC エンドポイントを使用することをプリンシパルに許可するには、VPC エンドポイントポリシーを作成または変更します。

VPCエンドポイントポリシーの作成

VPC エンドポイントポリシーは、プリンシパルに VPC エンドポイントを使用してリソースに対してオペレーションを実行するアクセス許可があるかどうかを決定します。AWS KMS リソースでは、プリンシパルがキーポリシーIAM ポリシー権限からオペレーションを実行するアクセス許可も必要です。

各 VPC エンドポイントポリシーステートメントには、次の要素が必要です。

  • アクションを実行できるプリンシパル

  • 実行可能なアクション

  • アクションを実行できるリソース

ポリシーステートメントは VPC エンドポイントを指定しません。代わりに、ポリシーがアタッチされているすべての VPC エンドポイントに適用されます。詳細については、「Amazon VPC ユーザーガイド」の「VPC エンドポイントでサービスへのアクセスを制御する」を参照してください。

AWS KMS の VPC エンドポイントポリシーの例を以下に示します。VPC エンドポイントにアタッチされると、このポリシーは ExampleUser に、VPC エンドポイントを使用して指定された KMS キーで指定されたオペレーションを呼び出すことを許可します。このようなポリシーを使用する前に、プリンシパルと キー ARN の例をアカウントの有効な値に置き換えてください。

{ "Statement":[ { "Sid": "AllowDecryptAndView", "Principal": {"AWS": "arn:aws:iam::111122223333:user/ExampleUser"}, "Effect":"Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:ListAliases", "kms:ListKeys" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

AWS CloudTrail は、VPC エンドポイントを使用するすべてのオペレーションを記録します。ただし、 CloudTrail ログには、他のアカウントのプリンシパルによって要求されたオペレーションや、他のアカウントの KMS キーのオペレーションは含まれません。

そのため、外部アカウントのプリンシパルが VPC エンドポイントを使用してローカルアカウントの任意のキーで AWS KMS オペレーションを呼び出すことを阻止する、VPC エンドポイントポリシーを作成することもできます。

次の例では、aws:PrincipalAccount グローバル条件キーを使用して、プリンシパルがローカルアカウントに存在しない限り、すべての KMS キーに対するすべてのオペレーションのすべてのプリンシパルへのアクセスを拒否します。このようなポリシーを使用する前に、サンプルアカウント ID を有効なものに置き換えてください。

{ "Statement": [ { "Sid": "AccessForASpecificAccount", "Principal": {"AWS": "*"}, "Action": "kms:*", "Effect": "Deny", "Resource": "arn:aws:kms:*:111122223333:key/*", "Condition": { "StringNotEquals": { "aws:PrincipalAccount": "111122223333" } } } ] }

VPC エンドポイントポリシーの表示

エンドポイントの VPC エンドポイントポリシーを表示するには、VPC マネジメントコンソールまたは DescribeVpcEndpointsオペレーションを使用します。

次の AWS CLI コマンドは、指定した VPC エンドポイント ID を持つエンドポイントのポリシーを取得します。

このコマンドを使用する前に、サンプルのエンドポイント ID をアカウントの有効なものに置き換えてください。

$ aws ec2 describe-vpc-endpoints \ --query 'VpcEndpoints[?VpcEndpointId==`vpce-1234abcdf5678c90a`].[PolicyDocument]' --output text

ポリシーステートメントでの VPC エンドポイントの使用

リクエストが VPC から送信されたとき、または VPC エンドポイントを使用するときに、AWS KMS リソースとオペレーションへのアクセスを制御できます。このためには、キーポリシーまたは IAM ポリシーで、次のいずれかのグローバル条件キーを使用します。

  • aws:sourceVpce 条件キーを使用して、VPC エンドポイントに基づいてアクセスを許可または制限します。

  • aws:sourceVpc 条件キーを使用して、プライベートエンドポイントをホストする VPC に基づいてアクセスを許可または制限します。

注記

VPC エンドポイントに基づいてキーポリシーと IAM ポリシーを作成する場合は、注意が必要です。ポリシーステートメントによって、特定の VPC または VPC エンドポイントからリクエストが送信されるように要求されている場合は、ユーザーに代わって AWS KMS リソースを使用する統合 AWS のサービスからのリクエストが失敗する可能性があります。ヘルプについては、「アクセス許可を持つ AWS KMS ポリシーでのVPCエンドポイント条件の使用」を参照してください。

また、リクエストが Amazon VPC エンドポイントから送信される場合、aws:sourceIP 条件キーは無効です。リクエストを VPC エンドポイントに制限するには、aws:sourceVpce または aws:sourceVpc 条件キーを使用します。詳細については、「AWS PrivateLink ガイド」の「VPC エンドポイントおよび VPC エンドポイントサービスの Identity and Access Management」を参照してください。

これらのグローバル条件キーを使用して、 AWS KMS keys (KMS キー)、エイリアス、および特定のリソースに依存しCreateKeyない などのオペレーションへのアクセスを制御できます。

例えば、次のサンプルキーポリシーでは、リクエストが指定された VPC エンドポイントを使用する場合にのみ、KMS キーを使用してユーザーが一部の暗号化オペレーションを実行できます。ユーザーが AWS KMS へのリクエストを行うと、リクエストの VPC エンドポイント ID が、ポリシーの aws:sourceVpce 条件キーの値と比較されます。一致しない場合、要求は拒否されます。

このようなポリシーを使用するには、AWS アカウント ID と VPC エンドポイント ID のプレースホルダーを、アカウントの有効な値で置き換えます。

{ "Id": "example-key-1", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM policies", "Effect": "Allow", "Principal": {"AWS":["111122223333"]}, "Action": ["kms:*"], "Resource": "*" }, { "Sid": "Restrict usage to my VPC endpoint", "Effect": "Deny", "Principal": "*", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1234abcdf5678c90a" } } } ] }

また、aws:sourceVpc 条件キーを使用して、VPC エンドポイントが存在する VPC に基づいて、KMS キーへのアクセスを制限することもできます。

次のサンプルキーポリシーでは、コマンドが vpc-12345678 から送信される場合にのみ、KMS キーを管理するコマンドが許可されます。また、コマンドが vpc-2b2b2b2b から送信される場合にのみ、暗号化オペレーションで KMS キーを使用するコマンドが許可されます。ある VPC でアプリケーションが実行されていれば、このようなポリシーを使用できますが、管理機能のために 2 番目の切り離された VPC を使用します。

このようなポリシーを使用するには、AWS アカウント ID と VPC エンドポイント ID のプレースホルダーを、アカウントの有効な値で置き換えます。

{ "Id": "example-key-2", "Version": "2012-10-17", "Statement": [ { "Sid": "Allow administrative actions from vpc-12345678", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": [ "kms:Create*","kms:Enable*","kms:Put*","kms:Update*", "kms:Revoke*","kms:Disable*","kms:Delete*", "kms:TagResource", "kms:UntagResource" ], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpc": "vpc-12345678" } } }, { "Sid": "Allow key usage from vpc-2b2b2b2b", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": [ "kms:Encrypt","kms:Decrypt","kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpc": "vpc-2b2b2b2b" } } }, { "Sid": "Allow read actions from everywhere", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": [ "kms:Describe*","kms:List*","kms:Get*" ], "Resource": "*", } ] }

VPC エンドポイントのログ記録

AWS CloudTrail は、VPC エンドポイントを使用するすべてのオペレーションを記録します。AWS KMS へのリクエストで VPC エンドポイントが使用されている場合、VPC エンドポイント ID は、そのリクエストが記録されている AWS CloudTrail ログのエントリに表示されます。このエンドポイント ID を使用して、AWS KMS VPC エンドポイントの使用状況を監査できます。

ただし、 CloudTrail ログには、他のアカウントのプリンシパルによって要求されたオペレーションや、他のアカウントの KMS キーおよびエイリアスに対するAWS KMSオペレーションのリクエストは含まれません。また、VPC を保護するために VPC エンドポイントポリシーによって拒否されたが、それ以外の場合は許可されるリクエストは AWS CloudTrail に記録されません。

例えば、次のサンプルログエントリには、VPC エンドポイントを使用した GenerateDataKey リクエストが記録されます。vpcEndpointId フィールドは、ログエントリの最後に表示されます。

{ "eventVersion":"1.05", "userIdentity": { "type": "IAMUser", "principalId": "EX_PRINCIPAL_ID", "arn": "arn:aws:iam::111122223333:user/Alice", "accessKeyId": "EXAMPLE_KEY_ID", "accountId": "111122223333", "userName": "Alice" }, "eventTime":"2018-01-16T05:46:57Z", "eventSource":"kms.amazonaws.com", "eventName":"GenerateDataKey", "awsRegion":"eu-west-1", "sourceIPAddress":"172.01.01.001", "userAgent":"aws-cli/1.14.23 Python/2.7.12 Linux/4.9.75-25.55.amzn1.x86_64 botocore/1.8.27", "requestParameters":{ "keyId":"1234abcd-12ab-34cd-56ef-1234567890ab", "numberOfBytes":128 }, "responseElements":null, "requestID":"a9fff0bf-fa80-11e7-a13c-afcabff2f04c", "eventID":"77274901-88bc-4e3f-9bb6-acf1c16f6a7c", "readOnly":true, "resources":[{ "ARN":"arn:aws:kms:eu-west-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId":"111122223333", "type":"AWS::KMS::Key" }], "eventType":"AwsApiCall", "recipientAccountId":"111122223333", "vpcEndpointId": "vpce-1234abcdf5678c90a" }