通过 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 区域

在同时提供 Amazon VPCAWS KMS 的所有 AWS 区域中,AWS KMS 可支持的 VPC 终端节点。

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

在设置接口VPC端点之前 AWS KMS,回顾 接口端点属性和限制 主题 Amazon VPC 用户指南.

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

  • 您可以使用 VPC 接口终端节点从 VPC 调用所有 AWS KMS API 操作

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

  • 您可以使用 AWS CloudTrail 用于审核您使用 AWS KMS 客户主密钥 (CMKs)通过VPC端点。有关详细信息,请参阅 记录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 主机名 。如果选择 Enable Private DNS Name (启用私有 DNS 名称) 选项,标准 AWS KMS DNS 主机名 (https://kms.<region>.amazonaws.com) 将解析为您的 VPC 终端节点。

此选项可让您更轻松地使用 VPC 终端节点。TheThethe AWS SDK和 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端点的访问

控制对您的VPC端点的访问 AWS KMS,附加 VPC端点策略 到VPC端点。端点策略确定主体是否可以使用VPC端点来调用 AWS KMS 运营 AWS KMS 资源。

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

注意

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

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

关于VPC端点策略

对于 AWS KMS 使用VPC端点取得成功的请求,负责人需要来自两个来源的权限:

  • A 关键政策IAM 政策,或 授予 必须提供主要权限来调用资源的操作(CMK 或别名)。

  • VPC端点策略必须提供使用端点进行请求的主要权限。

例如,关键策略可能会给出主要的调用 解密 在特定CMK上。但是,VPC端点策略可能不允许该负责人调用 Decrypt 在这种情况下 CMK 通过使用端点。

或VPC端点策略可能允许负责人使用端点来调用 禁用密钥 在某些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端点服务的访问AmazonVPC用户指南.

以下是VPC端点策略的示例 AWS KMS. 连接到VPC端点时,此策略允许 ExampleUser 要使用VPC端点来呼叫指定的CMK上的指定操作。在使用此类策略之前,请更换示例负责人和 关键ARN 从您的帐户中有有效值。

{ "Statement":[ { "Sid": "Allow decrypt and view permission", "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日志不包括在其他账户或运营中所要求的操作 CMKs 在其他帐户中。

因此,您可能希望创建一个VPC端点策略,以防止外部帐户中的负责人使用VPC端点来调用本地帐户中任何密钥上的KMS操作。

以下示例使用 AWS:主要账户 全局条件密钥拒绝对所有操作的所有负责人进行访问 CMKs 除非本地账户处于本地账户。在使用这样的策略之前,请将示例帐户ID替换为有效的。

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

查看VPC端点策略

要查看端点的VPC端点策略,请使用 VPC管理控制台描述PC端点 操作。

以下内容 AWS CLI 命令使用指定的vpc端点ID获得端点的策略。

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

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

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

您可以控制访问 AWS KMS 请求来自VPC或使用VPC端点时的资源和操作。为此,请使用以下之一 全局条件密钥关键政策IAM 政策.

  • 使用 aws:sourceVpce 根据VPC端点授予或限制访问权限的条件键。

  • 使用 aws:sourceVpc 根据承载私有端点的VPC授予或限制访问权限的条件键。

注意

创建关键政策和 IAM 基于VPC端点的策略。如果策略声明要求请求来自特定VPC或VPC端点,请求来自集成 AWS 使用 AWS KMS 代表您的资源可能失败。有关帮助信息,请参阅在具有 AWS KMS 权限的策略中使用 VPC 终端节点条件

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

您可以使用这些全局条件键控制访问 客户主密钥 (CMKs)、别名和操作 Createkey 这不取决于任何特定资源。

例如,以下示例密钥策略允许用户执行某些加密操作 CMK 只有在请求使用指定的vpc端点时。当用户向 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 限制访问权限的条件键 CMKs VPC端点驻留的VPC。

以下示例关键策略允许管理 CMK 仅当他们来自 vpc-12345678。此外,它允许使用 CMK 只有当他们来自 vpc-2b2b2b2b。如果应用程序在一个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 日志不包括其他账户中负责人请求的操作,或者请求 AWS KMS 运营 CMKs 以及其他帐户中的别名。同时,要保护您的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" }