AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

AWS KMS 支持由 https://docs.amazonaws.cn/AmazonVPC/latest/UserGuide/VPC_Introduction.html#what-is-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 KMS API 操作AWS CLI 命令中指定 VPC 终端节点。例如,以下命令使用 endpoint-url 参数在 AWS KMS 的 AWS CLI 命令中指定 VPC 终端节点。

$ aws kms list-keys --endpoint-url https://-dfm9tr04.kms.us-east-1.vpce.amazonaws.com

如果您使用默认域名服务器 ( AmazonProvidedDNS) 并启用 VPC 终端节点的私有 DNS 主机名,则无需指定终端节点 URL。AWS 将使用私有区域数据填充 VPC 名称服务器,以便公有 KMS 终端节点 (https://kms.<region>.amazonaws.com) 解析为您的私有 VPC 终端节点。要在使用您自己的名称服务器时启用此功能,请将 KMS 域的请求转发到 VPC 名称服务器。

您还可以使用 AWS CloudTrail 日志来审核您通过 VPC 终端节点使用 KMS 密钥的情况。此外,您还可以使用 IAM 中的条件和密钥策略拒绝访问不是来自指定 VPC 或 VPC 终端节点的请求。

注意

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

支持的 AWS 区域

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

创建 AWS KMS VPC 终端节点

您可以使用每个区域中的 KMS VPC 终端节点服务在您的 VPC 中创建接口终端节点。您可以在 AWS 管理控制台中创建 VPC 终端节点,或者使用 AWS CLIAmazon EC2 API 创建。

创建 AWS KMS VPC 终端节点(VPC 控制台)

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon VPC 控制台:https://console.amazonaws.cn/vpc/

  2. 在导航栏上,使用区域选择器来选择您的区域。

  3. 在导航窗格中,选择 Endpoints。在主窗格中,选择创建终端节点

  4. 对于服务类别,选择 AWS 服务

  5. Service Name (服务名称) 列表中,选择该区域中 AWS KMS 接口终端节点的条目。例如,在美国东部 (弗吉尼亚北部) 区域,条目名称是 com.amazonaws.us-east-1.kms

  6. 对于 VPC,选择一个 VPC。将在您选择的 VPC 中创建终端节点。

  7. 对于子网,请从您希望包含的每个可用区中选择一个子网。

    VPC 终端节点可以跨越多个可用区。将在您选择的每个子网中创建 VPC 终端节点的弹性网络接口 (ENI)。每个 ENI 都有一个 DNS 主机名和私有 IP 地址。

  8. 在此步骤中,您可以为您的 VPC 终端节点启用私有 DNS 主机名。如果选择 Enable Private DNS Name (启用私有 DNS 名称) 选项,标准 AWS KMS DNS 主机名 (https://kms.<region>.amazonaws.com) 将解析为您的 VPC 终端节点。

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

    仅当您的 VPC 的 enableDnsHostnamesenableDnsSupport 属性设置为 true 时,此功能才适用。要设置这些属性,请为您的 VPC 更新 DNS 支持

    要启用私有 DNS 主机名,对于启用私有 DNS 名称,请选择为此终端节点启用

  9. 对于安全组,选择或创建一个安全组。

    您可以使用安全组来控制对您的终端节点的访问,就像您使用防火墙一样。

  10. 选择创建终端节点

结果显示 VPC 终端节点,包括您用来连接 VPC 终端节点的 VPC 终端节点 ID 和 DNS 名称。

您也可以使用 Amazon VPC 工具来查看和管理您的终端节点,包括在终端节点属性发生更改以及删除终端节点时创建通知。有关说明,请参阅接口 VPC 终端节点


          在 VPC 控制台中创建终端节点

创建 AWS KMS VPC 终端节点 (AWS CLI)

您可以在 AWS CLI 中使用 create-vpc-endpoint 命令创建连接到 AWS KMS 的 VPC 终端节点。

请务必使用 interface 作为 VPC 终端节点类型,并且服务名称值包含 kms 以及您的 VPC 所在的区域。

该命令不包含 PrivateDnsNames 参数,因为其默认值为 true。要禁用此选项,您可以包含值为 false 的参数。仅当您的 VPC 的 enableDnsHostnamesenableDnsSupport 属性设置为 true 时,私有 DNS 名称才可用。要设置这些属性,请使用 ModifyVpcAttribute API。

下图显示了此命令的语法。

aws ec2 create-vpc-endpoint --vpc-id <vpc id> \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.<region>.kms \ --subnet-ids <subnet id> \ --security-group-id <security group id>

例如,该命令使用位于 us-east-1 区域中的 VPC ID 在 VPC 中创建一个 VPC 终端节点。它只指定一个子网 ID 来表示可用区,但您可以指定多个 ID。安全组 ID 也是必需的。

输出包括用于连接到新 VPC 终端节点的 VPC 终端节点 ID 和 DNS 名称。

$ aws ec2 create-vpc-endpoint --vpc-id \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.us-west-1.kms \ --subnet-ids \ --security-group-id sg-1a2b3c4d { "VpcEndpoint": { "PolicyDocument": "{\n \"Statement\": [\n {\n \"Action\": \"*\", \n \"Effect\": \"Allow\", \n \"Principal\": \"*\", \n \"Resource\": \"*\"\n }\n ]\n}", "VpcId": "", "NetworkInterfaceIds": [ "eni-bf8aa46b" ], "SubnetIds": [ "" ], "PrivateDnsEnabled": true, "State": "pending", "ServiceName": "com.amazonaws.us-east-1.kms", "RouteTableIds": [], "Groups": [ { "GroupName": "default", "GroupId": "sg-1a2b3c4d" } ], "VpcEndpointId": "", "VpcEndpointType": "Interface", "CreationTimestamp": "2017-09-05T20:14:41.240Z", "DnsEntries": [ { "HostedZoneId": "Z7HUB22UULQXV", "DnsName": "-dfm9tr04.kms.us-east-1.vpce.amazonaws.com" }, { "HostedZoneId": "Z7HUB22UULQXV", "DnsName": "-dfm9tr04-us-east-1a.kms.us-east-1.vpce.amazonaws.com" }, { "HostedZoneId": "Z1K56Z6FNPJRR", "DnsName": "kms.us-east-1.amazonaws.com" } ] } }

连接到 AWS KMS VPC 终端节点

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

例如,此 list-keys 命令使用 endpoint-url 参数指定 VPC 终端节点。要使用类似命令,请将示例中的 VPC 终端节点 ID 替换为您账户中的 ID。

aws kms list-keys --endpoint-url https://-dfm9tr04.kms.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 API。

在策略语句中使用 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": "" } } } ] }

您还可以使用 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 的 CMK 使用情况

当对 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":"", "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/", "accountId":"111122223333", "type":"AWS::KMS::Key" }], "eventType":"AwsApiCall", "recipientAccountId":"111122223333", "vpcEndpointId": "" }