通过 VPC 终端节点连接到 Amazon KMS - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

通过 VPC 终端节点连接到 Amazon KMS

您可以通过 Virtual Private Cloud(VPC)中的一个私有接口终端节点直接连接到 Amazon KMS。当您使用接口 VPC 端点时,您的 VPC 与 Amazon KMS 之间的通信完全在 Amazon 网络内进行。

Amazon KMS 支持由 Amazon PrivateLink 提供支持的 Amazon Virtual Private Cloud(Amazon VPC)端点。每个 VPC 终端节点都由您的 VPC 子网中一个或多个使用私有 IP 地址的弹性网络接口 (ENI) 代表。

接口 VPC 终端节点将您的 VPC 直接连接到 Amazon KMS,而无需 Internet 网关、NAT 设备、VPN 连接或 Amazon Direct Connect 连接。VPC 中的实例不需要公有 IP 地址便可与 Amazon KMS 进行通信。

区域

Amazon KMS 支持所有支持 Amazon KMS 的 Amazon Web Services 区域 中的 VPC 端点和 VPC 端点策略。

Amazon KMS VPC 端点注意事项

请先查看 Amazon PrivateLink 指南中的接口终端节点属性和限制主题,然后再为 Amazon KMS 设置接口 VPC 终端节点。

Amazon KMS 对 VPC 终端节点的支持包括以下内容。

为 Amazon KMS 创建 VPC 终端节点

您可以使用 Amazon VPC 控制台或 Amazon VPC API 为 Amazon KMS 创建 VPC 终端节点。有关更多信息,请参阅 Amazon PrivateLink 指南中的创建接口端点

  • 要为 Amazon KMS 创建 VPC 终端节点,请使用以下服务名称:

    com.amazonaws.region.kms

    例如,在美国西部(俄勒冈)区域 (us-west-2),服务名称为:

    com.amazonaws.us-west-2.kms
  • 要创建连接到 Amazon 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 名称)选项,标准 Amazon KMS DNS 主机名将解析为您的 VPC 端点。例如,https://kms.us-west-2.amazonaws.com 将解析为连接到服务名称 com.amazonaws.us-west-2.kms 的 VPC 端点。

此选项可让您更轻松地使用 VPC 终端节点。默认情况下,Amazon 开发工具包和 Amazon CLI 使用标准 Amazon KMS DNS 主机名,因此您不需要在应用程序和命令中指定 VPC 终端节点 URL。

有关更多信息,请参阅 Amazon PrivateLink 指南中的通过接口终端节点访问服务

连接到 Amazon KMS VPC 终端节点

您可以使用 Amazon 开发工具包、Amazon CLI 或 Amazon Tools for PowerShell 通过 VPC 终端节点连接到 Amazon KMS。要指定 VPC 终端节点,请使用其 DNS 名称。

例如,此 list-keys 命令使用 endpoint-url 参数指定 VPC 终端节点。要使用类似命令,请将示例中的 VPC 终端节点 ID 替换为您账户中的 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。标准 Amazon KMS DNS 主机名将解析为您的 VPC 端点。默认情况下,Amazon CLI 和开发工具包使用此主机名,因此您可以立即开始使用 VPC 端点连接到 Amazon KMS 区域端点,而无需在您的脚本和应用程序中更改任何内容。

要使用私有主机名,您的 VPC 的 enableDnsHostnamesenableDnsSupport 属性必须设置为 true。要设置这些属性,请使用ModifyVpcAttribute操作。有关详细信息,请参阅《Amazon VPC 用户指南》中的查看和更新 VPC 的 DNS 属性

控制对 VPC 终端节点的访问

要控制对 Amazon KMS 的 VPC 终端节点的访问,请附加 VPC 终端节点策略到您的 VPC 终端节点中。终端节点策略确定委托人是否可以使用 VPC 终端节点调用对 Amazon KMS 资源的 Amazon KMS 操作。

您可以在创建终端节点时创建 VPC 终端节点策略,并且可以随时更改 VPC 终端节点策略。使用 VPC 管理控制台或CreateVpcEndpointModifyVpcEndpoint操作。您还可以通过使用 Amazon CloudFormation 模板创建和更改 VPC 终端节点策略。有关使用 VPC 管理控制台的帮助,请参阅 Amazon PrivateLink 指南中的创建接口终端节点修改接口终端节点

注意

Amazon KMS 支持从 2020 年 7 月开始的 VPC 终端节点策略。在该日期之前创建的 Amazon KMS 的 VPC 终端节点具有默认的 VPC 终端节点策略,但您可以随时更改它。

有关编写和格式化 JSON 策略文档的帮助,请参阅 IAM 用户指南中的 IAM JSON 策略参考

关于 VPC 终端节点策略

对于使用 VPC 终端节点才能成功的 Amazon KMS 请求,委托人需要来自以下两个来源的权限:

  • 密钥策略IAM policy 或者授权必须授予委托人对资源(KMS 密钥或别名)调用操作的权限。

  • VPC 终端节点策略必须授予委托人使用终端节点发出请求的权限。

例如,密钥策略可能授予委托人对特定 KMS 密钥调用 Decrypt 的权限。但是,VPC 终端节点策略可能不允许该委托人通过使用终端节点对该 KMS 密钥调用 Decrypt

或者,VPC 终端节点策略可能允许委托人使用终端节点调DisableKey用某些 KMS 密钥。但是,如果委托人没有来自密钥策略、IAM policy 或授权的权限,请求将失败。

默认的 VPC 终端节点策略

每个 VPC 终端节点都有 VPC 终端节点策略,但您无需指定策略。如果未指定策略,则默认的终端节点策略允许所有委托人对终端节点上的所有资源执行所有操作。

然而,对于 Amazon KMS 资源,委托人还必须有权从密钥策略IAM policy 或者授权中调用操作。因此,在实践中,默认策略表示,如果委托人有权对资源调用操作,他们也可以通过使用终端节点调用该操作。

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

要允许主体仅将 VPC 终端节点用于其允许操作的子集,请创建或更新改 VPC 终端节点策略

创建 VPC 端点策略

VPC 终端节点策略确定委托人是否有权使用 VPC 终端节点对资源执行操作。对于 Amazon KMS 资源,委托人还必须有权从密钥策略IAM policy 或者授权中执行操作。

每个 VPC 终端节点策略语句都需要以下元素:

  • 可执行操作的委托人

  • 可执行的操作

  • 可对其执行操作的资源

策略语句不指定 VPC 终端节点。它适用于策略所附加到的任何 VPC 终端节点。有关更多信息,请参阅《Amazon VPC 用户指南》中的使用 VPC 端点控制对服务的访问权限

下面是用于 Amazon 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" } ] }

Amazon CloudTrail 记录使用 VPC 终端节点的所有操作。但是,您的 CloudTrail 日志不包括其他账户中的委托人请求的操作或其他账户中的 KMS 密钥的操作。

因此,您可能需要创建 VPC 终端节点策略,以防止外部账户中的委托人使用 VPC 终端节点对本地账户中的任何密钥的调用任何 Amazon KMS 操作。

以下示例使用 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操作。

以下 Amazon CLI 命令获取具有指定 VPC 终端节点 ID 的终端节点的策略。

在使用此命令之前,请将示例终端节点 ID 替换为您账户中的有效终端节点 ID。

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

在策略语句中使用 VPC 终端节点

您可以在请求来自于 VPC 或使用 VPC 终端节点时控制对 Amazon KMS 资源和操作的访问。为此,请在密钥策略IAM policy 中使用以下全局条件键之一。

  • 使用 aws:sourceVpce 条件键基于 VPC 终端节点授予或限制访问。

  • 使用 aws:sourceVpc 条件键基于托管私有终端节点的 VPC 授予或限制访问。

注意

根据您的 VPC 终端节点创建密钥策略和 IAM policy 时要小心。如果策略语句要求请求来自特定的 VPC 或 VPC 终端节点,则来自代表您使用 Amazon KMS 资源的集成 Amazon 服务的请求可能会失败。有关帮助信息,请参阅 在具有 Amazon KMS 权限的策略中使用 VPC 终端节点条件

此外,当请求来自 Amazon VPC 终端节点时,aws:sourceIP 条件键也不起作用。要限制对 VPC 终端节点的请求,请使用 aws:sourceVpceaws:sourceVpc 条件键。有关更多信息,请参阅《Amazon PrivateLink 指南》中的 VPC 终端节点和 VPC 终端节点服务的身份和访问管理

您可以使用这些全局条件密钥来控制对Amazon KMS keys(KMS 密钥)、别名的访问权限,以及对此类操作的访问权限 CreateKey,这些操作不依赖于任何特定资源。

例如,以下示例密钥策略允许用户仅在请求使用指定的 VPC 终端节点时,才使用 KMS 密钥执行某些加密操作。当用户向 Amazon KMS 发出请求时,系统会将请求中的 VPC 终端节点 ID 与策略中的 aws:sourceVpce 条件键值进行比较。如果它们不匹配,则请求会被拒绝。

要使用类似这样的策略,请将占位符 Amazon Web Services 账户 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 中运行,但您使用第二个隔离的 VPC 执行管理功能,则可以使用这样的策略。

要使用类似这样的策略,请将占位符 Amazon Web Services 账户 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 终端节点

Amazon CloudTrail 记录使用 VPC 终端节点的所有操作。当对 Amazon KMS 的请求使用 VPC 终端节点时,VPC 终端节点 ID 出现在记录该请求的 Amazon CloudTrail 日志条目中。您可以使用终端节点 ID 来审核您的 Amazon KMS VPC 终端节点的使用情况。

但是,您的 CloudTrail 日志不包括其他账户中的委托人请求的操作或其他账户中对 KMS 密钥和别名的Amazon KMS操作请求。此外,为了保护您的 VPC,被 VPC 终端节点策略拒绝但却以其他方式允许的请求不记录在 Amazon 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" }