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

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

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

AWS KMS 支持由 AWS PrivateLink 提供支持的 Amazon Virtual Private Cloud (Amazon VPC) 终端节点。每个 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 终端节点的注意事项

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

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

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

  • 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 主机名 。如果您这样做,标准 AWS KMS DNS 主机名 (https://kms.<region>.amazonaws.com) 将解析为您的 VPC 终端节点。另外,默认情况下,AWS CLI 和 AWS 开发工具包使用标准 AWS KMS DNS 主机名,因此您不需要在应用程序和命令中指定 VPC 终端节点 URL。

您可以在创建或修改 VPC 终端节点时启用私有 DNS 主机名。有关使用私有 DNS 主机名的更多信息,请参阅 Amazon VPC 用户指南 中的终端节点服务的私有 DNS 名称

连接到 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-0295a3caf8414c94a-dfm9tr04.kms.us-east-1.vpce.amazonaws.com

如果在终端节点上启用了私有 DNS 主机名,则无需在 CLI 命令或应用程序配置中指定 VPC 终端节点 URL。有关使用私有 DNS 主机名的更多信息,请参阅 Amazon VPC 用户指南 中的终端节点服务的私有 DNS 名称

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

您可以使用 IAM 策略和 AWS KMS 密钥策略,来控制对 AWS KMS 客户主密钥 (CMK) 的访问。还可以使用全局条件键来基于请求中的 VPC 终端节点或 VPC 限制这些策略。

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

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

注意

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

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

例如,以下示例密钥策略允许用户仅在请求来自指定的 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-0295a3caf8414c94a" } } } ] }

您还可以使用 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 KMS 的请求使用 VPC 终端节点时,VPC 终端节点 ID 出现在记录该请求的 AWS CloudTrail 日志条目中。您可以使用终端节点 ID 来审核您的 AWS KMS VPC 终端节点的使用情况。

例如,此示例日志条目记录了使用 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-0295a3caf8414c94a" }