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

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

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

您可以通过 VPC 中的私有终端节点直接连接到 AWS KMS,而不是通过互联网连接。当您使用 VPC 终端节点时,您的 VPC 和 AWS KMS 之间的通信完全在 AWS 网络内进行。

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

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

支持的 AWS 区域

AWS KMS 支持的所有 AWS 区域中的 VPC 终端节点Amazon VPCAWS KMS可用。

AWS KMS VPC 终端节点的注意事项

在为 AWS KMS 设置接口 VPC 终端节点之前,请查看接口终端节点属性和限制主题Amazon VPC 用户指南

AWS KMS 支持以下功能来支持 VPC 终端节点。

  • 您可以使用 VPC 接口终端节点调用所有AWS KMS API 运算从您的 VPC。

  • AWS KMS 不支持为 AWS KMS FIPS 终端节点创建 VPC 接口终端节点。

  • 您可以使用 AWS CloudTrail 日志来审核您通过 VPC 终端节点使用 AWS KMS 客户主密钥 (CMK) 的情况。有关详细信息,请参阅 记录您的 VPC 终端节点

为 AWS KMS 创建 VPC 终端节点

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

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

com.amazonaws.region.kms

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

com.amazonaws.us-west-2.kms

为了更轻松地使用 VPC 终端节点,您可以为 VPC 终端节点启用私有 DNS 主机名 。如果选择启用私有 DNS 名称选项,标准 AWS KMS DNS 主机名 (https://kms.<region>.amazonaws.com) 解析为您的 VPC 终端节点。

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

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

连接到 AWS KMS VPC 终端节点

您可以使用 AWS 软件开发工具包、AWS CLI 或适用于 PowerShell 的 AWS 工具通过 VPC 终端节点连接到 AWS 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。标准 AWS KMS DNS 主机名 (https://kms.<region>.amazonaws.com) 解析为您的 VPC 终端节点。默认情况下,AWS CLI 和开发工具包使用此主机名,因此您可以开始使用 VPC 终端节点,而无需在您的脚本和应用程序中更改任何内容。

要使用私有主机名,您的 VPC 的 enableDnsHostnamesenableDnsSupport 属性必须设置为 true。要设置这些属性,请使用 ModifyVpcAttribute 操作。

控制对 VPC 终端节点的访问

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

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

注意

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

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

关于 VPC 终端节点策略

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

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

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

例如,密钥策略可能授予委托人调用Decrypt在一个特定的 CMK 上。但是,VPC 终端节点策略可能不允许该委托人调用Decrypt在该 CMK 上使用终端节点。

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

默认 VPC 终端节点策略

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

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

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

要允许委托人仅将 VPC 终端节点用于其允许操作的子集,创建或修改 VPC 终端节点策略

创建 VPC 终端节点策略

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

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

  • 可执行操作的委托人

  • 可执行的操作

  • 可对其执行操作的资源

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

以下是适用于 AWS KMS 的 VPC 终端节点策略示例。当连接到 VPC 终端节点时,此策略允许ExampleUser以使用 VPC 终端节点调用指定 CMK 上的指定操作。使用类似于此策略之前,请将示例委托人和密钥 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 日志不包括其他帐户中委托人请求的操作或其他账户中 CMK 的操作。

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

以下示例使用aws:PrincipalAccount全局条件键,以拒绝对所有 CMK 上所有操作的所有委托人的访问,除非委托人在本地帐户中。使用类似于此策略的策略之前,请将示例账户 ID 替换为有效账户 ID。

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

查看 VPC 终端节点策略

要查看终端节点的 VPC 终端节点策略,请使用VPC 管理控制台DescribeVpcEndpointsoperation.

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

使用此命令之前,请将示例终端节点 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 终端节点

此外,aws:sourceIP当请求来自Amazon VPC 终端节点。要限制对 VPC 终端节点的请求,请使用 aws:sourceVpceaws:sourceVpc 条件键。有关更多信息,请参阅 Amazon VPC 用户指南 中的 VPC 终端节点 - 控制终端节点的使用

您可以使用这些全局条件键来控制对客户主密钥 (CMK)、别名和操作的访问,例如CreateKey不依赖于任何特定的资源。

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

要使用类似这样的策略,请将占位符 AWS 账户 ID 和 VPC 终端节点 ID 替换为您账户中的有效值。

{ "Id": "example-key-1", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM user permissions", "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 限制对您的 CMK 的访问。

以下示例密钥策略仅允许来自 vpc-12345678 的命令管理 CMK。另外,它只允许来自 vpc-2b2b2b2b 的命令使用 CMK 执行加密操作。如果应用程序在一个 VPC 中运行,但您使用第二个隔离的 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 日志不包括其他账户中委托人请求的操作,也不包括对 CMK 和其他账户中的别名进行 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" }