创建外部密钥存储 - AWS Key Management Service

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

创建外部密钥存储

您可以在每个 AWS 账户 和区域中创建一个或多个外部密钥存储。每个外部密钥存储都必须关联 AWS 之外的外部密钥管理器,以及用于调解 AWS KMS 与外部密钥管理器之间通信的外部密钥存储代理(XKS 代理)。有关详细信息,请参阅选择外部密钥存储代理连接选项。在开始之前,请确认您需要外部密钥存储。大多数客户可以使用由 AWS KMS 密钥材料支持的 KMS 密钥。

提示

一些外部密钥管理器为创建外部密钥存储提供了更简单的方法。有关详细信息,请参阅外部密钥管理器的文档。

在创建外部密钥存储之前,您需要汇编先决条件。在创建过程中,您要指定外部密钥存储的属性。最重要的是,您要指明 AWS KMS 中的外部密钥存储是使用公有端点还是 VPC 端点服务来连接外部密钥存储代理。您还要指定连接详细信息,包括代理的 URI 端点,以及代理端点内的路径(AWS KMS 会在其中向代理发送 API 请求)。

  • 如果您使用公有端点连接,请确保 AWS KMS 可以使用 HTTPS 连接通过互联网与代理通信。这包括在外部密钥存储代理上配置 TLS,并确保 AWS KMS 与代理之间的任何防火墙都允许流量在代理的端口 443 上流入和流出。在创建使用公有端点连接的外部密钥存储时,AWS KMS 通过向外部密钥存储代理发送状态请求来测试连接。此测试会验证端点是否可访问,以及外部密钥存储代理是否会接受使用外部密钥存储代理身份验证凭证签名的请求。如果此测试请求失败,则创建外部密钥存储的操作将失败。

  • 如果使用 VPC 端点服务连接,请确保网络负载均衡器、私有 DNS 名称和 VPC 端点服务配置正确且可运行。如果外部密钥存储代理不在 VPC 中,则需要确保 VPC 端点服务可以与外部密钥存储代理通信。(在将外部密钥存储连接到外部密钥存储代理时,AWS KMS 会测试 VPC 端点服务连接。)

其他注意事项:

  • AWS KMS 会记录 Amazon CloudWatch 指标和维度,尤其是外部密钥存储的指标和维度。基于其中一些指标的监控图表会显示在每个外部密钥存储的 AWS KMS 控制台中。我们强烈建议您使用这些指标创建警报来监控外部密钥存储。这些警报会在发生性能和操作问题之前提醒您注意相关问题的早期迹象。有关说明,请参阅 监控外部密钥存储

  • 外部密钥存储受资源限额的限制。在外部密钥存储中使用 KMS 密钥受请求限额的限制。在设计外部密钥存储实现之前,请查看这些限额。

注意

检查您的配置中是否存在可能使其无法运行的循环依赖关系。

例如,如果您使用 AWS 资源创建外部密钥存储代理,请确保操作代理不需要通过该代理访问的外部密钥存储中有 KMS 密钥。

所有新的外部密钥存储都在断开连接的状态下创建。在外部密钥存储中创建 KMS 密钥之前,您必须将其连接到外部密钥存储代理。要更改外部密钥存储的属性,请编辑外部密钥存储设置

汇编先决条件

在创建外部密钥存储之前,您需要汇编所需的组件,包括用于支持外部密钥存储的外部密钥管理器,以及将 AWS KMS 请求转换为外部密钥管理器可理解格式的外部密钥存储代理

所有外部密钥存储都需要以下组件。除了这些组件,您还需要提供组件来支持自己选择的外部密钥存储代理连接选项

提示

您的外部密钥管理器可能包含其中一些组件,或者可以为您配置这些组件。有关详细信息,请参阅外部密钥管理器的文档。

如果您在 AWS KMS 控制台中创建外部密钥存储,则可以选择上传基于 JSON 的代理配置文件,该文件指定代理 URI 路径代理身份验证凭证。一些外部密钥存储代理会为您生成此文件。有关详细信息,请参阅外部密钥存储代理或外部密钥管理器的文档。

外部密钥管理器

每个外部密钥存储都需要至少一个外部密钥管理器实例。这可以是实体或虚拟硬件安全模块(HSM),也可以是密钥管理软件。

您可以使用单个密钥管理器,但我们建议准备至少两个共享加密密钥的相关密钥管理器实例,以便实现冗余配置。外部密钥存储不需要独占使用外部密钥管理器。不过,外部密钥管理器必须有能力处理 AWS 服务以预期频率发来的加密和解密请求,这些服务使用外部密钥存储中的 KMS 密钥来保护您的资源。您的外部密钥管理器应配置为每秒最多处理 1800 个请求,并在 250 毫秒的超时限制内响应每个请求。我们建议您将外部密钥管理器放置在靠近 AWS 区域 的位置,让网络往返时间(RTT)不超过 35 毫秒。

如果外部密钥存储代理允许,则可以更改与外部密钥存储代理关联的外部密钥管理器,但新的外部密钥管理器必须是具有相同密钥材料的备份或快照。如果与 KMS 密钥关联的外部密钥无法再供外部密钥存储代理使用,AWS KMS 便无法解密使用 KMS 密钥加密的加密文字。

外部密钥存储代理必须可以访问外部密钥管理器。如果来自代理的 GetHealthStatus 响应报告所有外部密钥管理器实例都处于 Unavailable 状态,则所有创建外部密钥存储的尝试都会失败,并显示 XksProxyUriUnreachableException

外部密钥存储代理

您必须指定符合 AWS KMS 外部密钥存储代理 API 规范中设计要求的外部密钥存储代理(XKS 代理)。您可以开发或购买外部密钥存储代理,也可以使用外部密钥管理器提供或内置的外部密钥存储代理。AWS KMS 建议将外部密钥存储代理配置为每秒处理最多 1800 个请求,并在 250 毫秒的超时限制内响应每个请求。我们建议您将外部密钥管理器放置在靠近 AWS 区域 的位置,让网络往返时间(RTT)不超过 35 毫秒。

您可以将外部密钥存储代理用于多个外部密钥存储,但每个外部密钥存储必须在其请求的外部密钥存储代理中具有唯一的 URI 端点和路径。

如果您使用的是 VPC 端点服务连接,则可以在 Amazon VPC 中找到您的外部密钥存储代理,但这不是必需的。您可以将代理放置在 AWS 之外(例如您的私有数据中心内),并且只使用 VPC 端点服务与代理通信。

代理身份验证凭证

要创建外部密钥存储,必须指定外部密钥存储代理身份验证凭证(XksProxyAuthenticationCredential)。

您必须在外部密钥存储代理上为 AWS KMS 建立身份验证凭证XksProxyAuthenticationCredential)。AWS KMS 使用签名版本 4(SigV4)流程和外部密钥存储代理身份验证凭证对代理的请求进行签名,从而对您的代理进行身份验证。您可以在创建外部密钥存储时指定身份验证凭证,并且可以随时对其进行更改。如果代理要轮换凭证,则务必更新外部密钥存储的凭证值。

代理身份验证凭证有两个部分。您必须为外部密钥存储提供这两部分。

  • 访问密钥 ID:标识秘密访问密钥。您能以明文形式提供此 ID。

  • 秘密访问密钥:凭证的秘密部分。AWS KMS 在存储凭证之前对凭证中的秘密访问密钥进行加密。

AWS KMS 用于对外部密钥存储代理的请求进行签名的 SigV4 凭证,与同 AWS 账户中 AWS Identity and Access Management 主体关联的任何 SigV4 凭证无关。不要将任何 IAM SigV4 凭证重复用于外部密钥存储代理。

代理连接

要创建外部密钥存储,您必须指定外部密钥存储代理连接选项(XksProxyConnectivity)。

AWS KMS 可以使用公有端点Amazon Virtual Private Cloud(Amazon VPC)端点服务,与您的外部密钥存储代理通信。公有端点虽然更易于配置和维护,但可能无法满足每次安装的安全要求。如果您选择 Amazon VPC 端点服务连接选项,则必须创建和维护所需的组件,包括在两个不同可用区内至少有两个子网的 Amazon VPC、具有网络负载均衡器和目标组的 VPC 端点服务,以及 VPC 端点服务的私有 DNS 名称。

您可以为外部密钥存储更改代理连接选项。不过,您必须确保外部密钥存储中与 KMS 密钥相关的密钥材料持续可用。否则,AWS KMS 无法解密使用这些 KMS 密钥加密的任何加密文字。

有关确定哪种代理连接选项最适合外部密钥存储的帮助信息,请参阅 选择外部密钥存储代理连接选项。有关创建和配置 VPC 端点服务连接的帮助信息,请参阅 配置 VPC 端点服务连接

代理 URI 端点

要创建外部密钥存储,您必须指定 AWS KMS 用于向外部密钥存储代理发送请求的端点(XksProxyUriEndpoint)。

协议必须是 HTTPS。AWS KMS 在端口 443 上通信。不要在代理 URI 端点值中指定端口。

  • 公有端点连接 – 为外部密钥存储代理指定公开可用的端点。在创建外部密钥存储之前,此端点必须可供访问。

  • VPC 端点服务连接 – 指定 https://,后接 VPC 端点服务的私有 DNS 名称。

在外部密钥存储代理上配置的 TLS 服务器证书必须与外部密钥存储代理 URI 端点中的域名相匹配,并且由支持外部密钥存储的证书颁发机构颁发。有关列表,请参阅 Trusted Certificate Authorities(受信任的证书颁发机构)。在颁发 TLS 证书之前,证书颁发机构会要求您提供域所有权证明。

TLS 证书上的主题通用名称(CN)必须与私有 DNS 名称相匹配。例如,若私有 DNS 名称为 myproxy-private.xks.example.com,则 TLS 证书上的 CN 必须为 myproxy-private.xks.example.com*.xks.example.com

您可以更改代理 URI 端点,但请确保外部密钥存储代理有权访问与外部密钥存储中的 KMS 密钥关联的密钥材料。否则,AWS KMS 无法解密使用这些 KMS 密钥加密的任何加密文字。

唯一性要求

  • 合并的代理 URI 端点(XksProxyUriEndpoint)和代理 URI 路径(XksProxyUriPath)值在 AWS 账户 和区域中必须具备唯一性。

  • 使用公有端点连接的外部密钥存储可以共享相同的代理 URI 端点,前提是这些外部密钥存储具有不同的代理 URI 路径值。

  • 使用公有端点连接的外部密钥存储,不能采用与同一 AWS 区域 中具有 VPC 端点服务连接的任何外部密钥存储相同的代理 URI 端点值,即使密钥存储位于不同 AWS 账户 也是如此。

  • 每个具有 VPC 端点连接的外部密钥存储都必须有自己的私有 DNS 名称。代理 URI 端点(私有 DNS 名称)在 AWS 账户 和区域中必须具备唯一性。

代理 URI 路径

要创建外部密钥存储,您必须在外部密钥存储代理中指定所需代理 API 的基本路径。该值必须以 / 开头且以 /kms/xks/v1 结尾,其中 v1 表示外部密钥存储代理的 AWS KMS API 版本。此路径可以在必要元素之间包含可选前缀,例如 /example-prefix/kms/xks/v1。要找到此值,请参阅外部密钥存储代理的文档。

AWS KMS 将代理请求发送到由代理 URI 端点和代理 URI 路径串联指定的地址。例如,若代理 URI 端点为 https://myproxy.xks.example.com,代理 URI 路径为 /kms/xks/v1,AWS KMS 会将其代理 API 请求发送到 https://myproxy.xks.example.com/kms/xks/v1

您可以更改代理 URI 路径,但要确保外部密钥存储代理有权访问与外部密钥存储中的 KMS 密钥关联的密钥材料。否则,AWS KMS 无法解密使用这些 KMS 密钥加密的任何加密文字。

唯一性要求

  • 合并的代理 URI 端点(XksProxyUriEndpoint)和代理 URI 路径(XksProxyUriPath)值在 AWS 账户 和区域中必须具备唯一性。

VPC 终端节点服务

指定用于与外部密钥存储代理通信的 Amazon VPC 端点服务的名称。只有使用 VPC 端点服务连接的外部密钥存储才需要此组件。有关为外部密钥存储设置和配置 VPC 端点服务的帮助信息,请参阅 配置 VPC 端点服务连接

VPC 端点服务必须具有以下属性:

  • 该 VPC 端点服务必须与外部密钥存储位于相同的 AWS 账户 和区域中。

  • 其必须有至少连接到两个子网的网络负载均衡器(NLB),每个子网位于不同的可用区中。

  • VPC 端点服务的允许主体列表必须包括区域 cks.kms.<region>.amazonaws.com 的 AWS KMS 服务主体,例如 cks.kms.us-east-1.amazonaws.com

  • 其不得要求接受连接请求。

  • 其必须在更高级别的公有域内具有私有 DNS 名称。例如,在 xks.example.com 公有域中,私有 DNS 名称可能为 myproxy-private.xks.example.com。

    使用 VPC 端点服务连接的外部密钥存储的私有 DNS 名称,在其 AWS 区域 中必须具备唯一性。

  • 私有 DNS 名称域的域验证状态必须为 verified

  • 在外部密钥存储代理上配置的 TLS 服务器证书,必须指定可访问端点的私有 DNS 主机名。

唯一性要求

  • 具有 VPC 端点连接的外部密钥存储可以共享 Amazon VPC,但每个外部密钥存储必须有自己的 VPC 端点服务和私有 DNS 名称。

代理配置文件

代理配置文件是基于 JSON 的可选文件,其中包含外部密钥存储的代理 URI 路径代理身份验证凭证属性的值。在 AWS KMS 控制台中创建或编辑外部密钥存储时,您可以上传代理配置文件来为外部密钥存储提供配置值。使用此文件可以避免键入和粘贴错误,并确保外部密钥存储中的值与外部密钥存储代理中的值相匹配。

代理配置文件由外部密钥存储代理生成。要了解外部密钥存储代理是否提供代理配置文件,请参阅您的外部密钥存储代理文档。

下面是具有虚拟值的格式正确的代理配置文件示例。

{ "XksProxyUriPath": "/example-prefix/kms/xks/v1", "XksProxyAuthenticationCredential": { "AccessKeyId": "ABCDE12345670EXAMPLE", "RawSecretAccessKey": "0000EXAMPLEFA5FT0mCc3DrGUe2sti527BitkQ0Zr9MO9+vE=" } }

只有在 AWS KMS 控制台中创建或编辑外部密钥存储时,才能上传代理配置文件。您不能将其与 CreateCustomKeyStoreUpdateCustomKeyStore 操作一起使用,但可以使用代理配置文件中的值来确保参数值正确无误。

创建新的外部密钥存储

汇编完必要先决条件后,您可以在 AWS KMS 控制台中或使用 CreateCustomKeyStore 操作创建新的外部密钥存储。

在创建外部密钥存储之前,请选择代理连接类型,并确保已创建和配置了所有必需组件。如果需要查找任何所需值的帮助信息,请查阅外部密钥存储代理或密钥管理软件的文档。

注意

在 AWS Management Console 中创建外部密钥存储时,您可以上传基于 JSON 的代理配置文件,其中包含代理 URI 路径代理身份验证凭证的值。一些代理会为您生成此文件,但其并非必要项目。

  1. 登录到 AWS Management Console,然后通过以下网址打开 AWS Key Management Service(AWS KMS)控制台:https://console.aws.amazon.com/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 在导航窗格中,选择 Custom key stores(自定义密钥存储)、External key stores(外部密钥存储)。

  4. 选择 Create external key store(创建外部密钥存储)。

  5. 为外部密钥存储输入易记名称。该名称在您账户的所有外部密钥存储中必须具备唯一性。

    重要

    不要在此字段中包含机密或敏感信息。此字段可能会以纯文本形式显示在 CloudTrail 日志和其他输出中。

  6. 选择代理连接类型。

    您的代理连接选择决定了外部密钥存储代理所需的组件。有关做出此选择的帮助信息,请参阅 选择外部密钥存储代理连接选项

  7. 选择或输入此外部密钥存储的 VPC 端点服务的名称。此步骤仅在外部密钥存储代理连接类型为 VPC 端点服务时出现。

    VPC 端点服务及其 VPC 必须满足外部密钥存储的要求。有关详细信息,请参阅汇编先决条件

  8. 输入代理 URI 端点。协议必须是 HTTPS。AWS KMS 在端口 443 上通信。不要在代理 URI 端点值中指定端口。

    如果 AWS KMS 识别出您在上一步中指定的 VPC 端点服务,则会为您填写此字段。

    若使用公有端点连接,请输入公开可用的端点 URI。若使用 VPC 端点连接,输入 https://,后接 VPC 端点服务的私有 DNS 名称。

  9. 要输入代理 URI 路径前缀和代理身份验证凭证的值,请上传代理配置文件或手动输入值。

    • 如果您有包含代理 URI 路径代理身份验证凭证值的可选代理配置文件,请选择 Upload configuration file(上传配置文件)。然后按照步骤上传该文件。

      上传文件后,控制台会在可编辑字段中显示文件中的值。您可以立即更改值,也可以在创建外部密钥存储后编辑这些值

      要显示秘密访问密钥的值,请选择 Show secret access key(显示私有访问密钥)。

    • 如果您没有代理配置文件,则可以手动输入代理 URI 路径和代理身份验证凭证值。

      1. 如果没有代理配置文件,您可以手动输入代理 URI。控制台提供所需的 /kms/xks/v1 值。

        如果代理 URI 路径包含可选前缀,例如 /example-prefix/kms/xks/v1 中的 example-prefix,请在 Proxy URI path prefix(代理 URI 路径前缀)字段中输入该前缀。如若没有,则将字段留空。

      2. 如果没有代理配置文件,您可以手动输入代理身份验证凭证。访问密钥 ID 和秘密访问密钥均为必填项。

        • Proxy credential: Access key ID(代理凭证:访问密钥 ID)中,输入代理身份验证凭证的访问密钥 ID。访问密钥 ID 标识秘密访问密钥。

        • Proxy credential: Secret access key(代理凭证:秘密访问密钥)中,输入代理身份验证凭证的秘密访问密钥。

        要显示秘密访问密钥的值,请选择 Show secret access key(显示私有访问密钥)。

        此过程不会设置或更改您在外部密钥存储代理上建立的身份验证凭证。其只是将这些值关联到外部密钥存储。有关设置、更改和轮换代理身份验证凭证的信息,请参阅外部密钥存储代理或密钥管理软件的文档。

        如果您的代理身份验证凭证发生变化,请编辑外部密钥存储的凭证设置

  10. 选择 Create external key store(创建外部密钥存储)。

当该过程成功时,新的外部密钥存储将显示在账户和区域的外部密钥存储列表中。如果该过程失败,则会显示一条错误消息,描述问题并提供有关如何解决该问题的帮助。如果您需要更多帮助,请参阅外部密钥的 CreateKey 错误

下一步:不会自动连接新的外部密钥存储。在外部密钥存储中创建 AWS KMS keys 之前,您必须将外部密钥存储连接到其外部密钥存储代理。

您可以使用 CreateCustomKeyStore 操作来创建新的外部密钥存储。如果需要查找所需参数值的帮助信息,请参阅外部密钥存储代理或密钥管理软件的文档。

提示

使用 CreateCustomKeyStore 操作时,您无法上传代理配置文件。不过,您可以使用代理配置文件中的值来确保参数值正确无误。

要创建外部密钥存储,CreateCustomKeyStore 操作需要以下参数值。

  • CustomKeyStoreName - 外部密钥存储的易记名称,该名称在账户中具备唯一性。

    重要

    不要在此字段中包含机密或敏感信息。此字段可能会以纯文本形式显示在 CloudTrail 日志和其他输出中。

  • CustomKeyStoreType – 指定 EXTERNAL_KEY_STORE

  • XksProxyConnectivity – 指定 PUBLIC_ENDPOINTVPC_ENDPOINT_SERVICE

  • XksProxyAuthenticationCredential – 指定访问密钥 ID 和秘密访问密钥。

  • XksProxyUriEndpoint – AWS KMS 用于与外部密钥存储代理通信的端点。

  • XksProxyUriPath – 代理 API 在代理内的路径。

  • XksProxyVpcEndpointServiceName – 仅当 XksProxyConnectivity 值为 VPC_ENDPOINT_SERVICE 时才需要。

注意

如果您使用 AWS CLI 版本 1.0,请在指定具有 HTTP 或 HTTPS 值的参数(例如 XksProxyUriEndpoint 参数)之前运行以下命令。

aws configure set cli_follow_urlparam false

否则,AWS CLI 版本 1.0 会将参数值替换为在该 URI 地址找到的内容,从而导致以下错误:

Error parsing parameter '--xks-proxy-uri-endpoint': Unable to retrieve https:// : received non 200 status code of 404

以下示例使用虚拟值。在运行命令之前,将虚拟值替换为外部密钥存储的有效值。

创建使用公有端点连接的外部密钥存储。

$ aws kms create-custom-key-store --custom-key-store-name ExampleExternalKeyStorePublic \ --custom-key-store-type EXTERNAL_KEY_STORE \ --xks-proxy-connectivity PUBLIC_ENDPOINT \ --xks-proxy-uri-endpoint https://myproxy.xks.example.com \ --xks-proxy-uri-path /kms/xks/v1 \ --xks-proxy-authentication-credential AccessKeyId=<value>,RawSecretAccessKey=<value>

创建使用 VPC 端点服务连接的外部密钥存储。

$ aws kms create-custom-key-store --custom-key-store-name ExampleExternalKeyStoreVPC \ --custom-key-store-type EXTERNAL_KEY_STORE \ --xks-proxy-connectivity VPC_ENDPOINT_SERVICE \ --xks-proxy-vpc-endpoint-service-name com.amazonaws.vpce.us-east-1.vpce-svc-example \ --xks-proxy-uri-endpoint https://myproxy-private.xks.example.com \ --xks-proxy-uri-path /kms/xks/v1 \ --xks-proxy-authentication-credential AccessKeyId=<value>,RawSecretAccessKey=<value>

当此操作成功时,CreateCustomKeyStore 将返回自定义密钥存储 ID,如以下示例响应中所示。

{ "CustomKeyStoreId": cks-1234567890abcdef0 }

如果操作失败,请更正异常指示的错误,然后重试。有关其他帮助,请参阅排查外部密钥存储的问题

下一步:要使用外部密钥存储,请将其连接到外部密钥存储代理