AWS Key Management Service 常见问题
以下常见问题不适用于 AWS 中国(北京)区域(由光环新网运营)和 AWS 中国(宁夏)区域(由西云数据运营)中的 AWS Key Management Service(KMS)。请访问此常见问题链接,了解与这两处中国区域相关的内容。
一般性问题
什么是 AWS KMS?
AWS KMS 是一项托管式服务,可帮助您更轻松地创建和控制用于加密操作的密钥。该服务为您提供可用性高的密钥生成、存储、管理和审计解决方案,让您可以在自己的应用程序内加密您的数据或以数字方式对数据签名,并在 AWS 服务之间对数据的加密进行控制。
为什么应该使用 AWS KMS?
如果您负责保护 AWS 服务之间的数据安全,应使用它来集中管理加密密钥以控制对数据的访问。如果您是一名需要加密应用程序中的数据的开发人员,您应该结合使用 AWS Encryption SDK 和 AWS KMS,以更轻松地在代码中生成、使用和保护对称加密密钥。如果您是一名需要以数字方式对数据签名或使用非对称密钥验证数据的开发人员,应使用该服务创建和管理您将需要的私有密钥。如果您想找到一个可扩展的密钥管理基础设施来支持您的开发人员以及越来越多的应用程序,您应该使用该服务降低您的许可成本和运营负担。如果您负责证明数据安全以满足监管或合规目的,应当使用这项服务,因为它能够帮助证明数据持续受到保护。它还满足广泛的行业和区域性合规制度。
如何开始使用 AWS KMS?
开始使用 AWS KMS 的最简单方式就是选择在受支持的 AWS 服务中使用每项服务自动创建的 AWS 拥有的根密钥来加密您的数据。 如果您希望对密钥管理进行全面控制,包括能够在账户或服务之间分享密钥访问权限,您可以在 AWS KMS 中创建自己的 AWS KMS 客户托管密钥。您也可以直接在自己的应用程序中使用自己创建的 KMS 密钥。可以从 AWS KMS 控制台的 AWS 服务主页上的“安全、身份与合规性”下的 KMS 控制台访问 AWS KMS。也可以直接通过 AWS KMS 命令行界面 (CLI) 或用于编程访问的 AWS SDK 访问 AWS KMS API。利用 AWS Encryption SDK,AWS KMS API 还可间接用于加密您自己应用程序中的数据。有关更多信息,请访问入门页面。
哪些 AWS 区域可以使用 AWS KMS?
可用性如我们的全球按区域列出的产品和服务页面所列。
AWS KMS 提供有哪些密钥管理功能?
您可以执行以下密钥管理功能:
- 创建对称、非对称和 HMAC 密钥,并且密钥材料只能在该服务内部使用
- 创建对称密钥,其中密钥材料在您控制的自定义密钥存储中生成和使用,并由 AWS CloudHSM 或 AWS 外部您自己的外部密钥管理器提供支持
- 导入您自己的对称、非对称和 HMAC 密钥材料,以便在支持的 AWS 服务和您自己的应用程序中使用
- 定义哪些 AWS Identity and Access Management (IAM) 用户和角色可以管理密钥
- 定义哪些 IAM 用户和角色可以使用密钥加密和解密数据
- 选择自动轮换由该服务生成的密钥
- 临时禁用密钥,使其不能被任何人使用
- 重新启用已禁用的密钥
- 计划删除不再使用的密钥
- 通过检查 AWS CloudTrail 中的日志审计密钥的使用
AWS KMS 是如何运行的?
首先可以通过请求创建 AWS KMS 密钥来使用该服务。由您控制任何客户管理的 KMS 密钥的生命周期以及哪些人员可以使用或管理 KMS 密钥。您创建了 KMS 密钥之后,即可立即将数据直接提交到 AWS KMS 服务,以便使用此 KMS 密钥进行加密、解密、签名,或生成或验证 HMAC。您可以对这些密钥设置使用策略,以决定哪些用户能够在何种情况下执行哪些操作。
集成了 AWS KMS 的 AWS 服务和客户端工具包,使用名为信封加密的方法来保护您的数据。在这种方法下,AWS KMS 生成用来在 AWS 服务或应用程序本地对数据加密的数据密钥。这些数据密钥本身使用您定义的 AWS KMS 密钥进行了加密。AWS KMS 不会保留或管理数据密钥。AWS 服务会对您的数据进行加密,并将加密的数据密钥副本与加密的数据一同保存。如果某项服务需要对您的数据进行解密,则会请求 AWS KMS 使用您的 KMS 密钥对数据密钥进行解密。如果从 AWS 服务请求数据的用户获得了使用您的 KMS 密钥进行解密的授权,该 AWS 服务将收到来自 AWS KMS 的已解密数据密钥。然后,该 AWS 服务会对您的数据进行解密,并以纯文本形式返回。所有 KMS 密钥使用请求都会记录在 CloudTrail 中,因此您可以了解谁在什么情况下以及在何时使用了哪个密钥。
如果我使用了 AWS KMS,我的数据在何处加密?
对于如何使用 AWS KMS 加密数据,通常有三种情况。第一种情况,您可以利用存储在该服务中的 KMS 密钥,直接通过 AWS KMS API 加密和解密数据。第二种情况,您可以选择使用存储在该服务中的 KMS 密钥通过 AWS 服务加密您的数据。在这种情况中,数据通过由 KMS 密钥保护的数据密钥进行加密。第三种情况,您可以使用集成到 AWS KMS 的 AWS Encryption SDK 在您自己的应用程序中执行加密,与您的应用程序是否在 AWS 中运行无关。
哪些 AWS 云服务可与 AWS KMS 集成?
AWS KMS 可与大部分其他 AWS 服务无缝集成,因此在这些服务中加密数据更加简单。在某些情况中,默认使用存储在 AWS KMS 中但由相关 AWS 服务拥有和管理的密钥加密数据。在许多情况下,AWS KMS 密钥归您所有,并在您的账户中进行管理。您可以选择某些服务,由自己来管理密钥,或允许该服务为您管理密钥。请参阅当前已集成到 AWS KMS 的 AWS 服务列表。有关集成服务如何使用 AWS KMS 的更多信息,请参阅 AWS KMS 开发人员指南。
为什么使用信封加密? 为什么不只是将数据发送到 AWS KMS 中直接加密?
尽管 AWS KMS 支持发送最大 4KB 的数据进行直接加密,但信封加密可提供巨大的性能优势。当您使用 AWS KMS 直接加密数据时,数据必须通过网络进行传输。信封加密降低了网络负载,因为通过网络发送的只有请求,同时传输的数据密钥也更小。数据密钥只在您的应用程序内使用,或用于加密 AWS 服务,避免向 AWS KMS 发送整个数据块并遭遇网络延迟。
我创建的 KMS 密钥和其他 AWS 服务自动为我创建的 KMS 密钥之间有什么差别?
当您希望 AWS 服务为您加密数据时,可以选择使用特定的 KMS 密钥。这些就是客户管理的 KMS 密钥,您对其拥有完全控制权。您可以定义每个密钥的访问控制和使用策略,您也可以向其他账户和服务授予使用权限。除了客户管理的密钥,AWS KMS 还提供两种由 AWS 管理的密钥:(1) AWS 管理的 KMS 密钥,在您的账户中创建但由 AWS 管理,以及 (2) AWS 拥有的密钥,完全由 AWS 账户拥有和操作。您可以在自己的账户中追踪 AWS 托管式密钥,所有使用情况都会记录到 CloudTrail,但您不能直接控制这些密钥。AWS 拥有的密钥自动化程度最高,并且在 AWS 内为您的数据提供加密,但不提供有关其密钥活动的策略控制或 CloudTrail 日志。
为什么应当创建自己的 AWS KMS 密钥?
创建您自己的 KMS 密钥会让您拥有的控制权高于 AWS 管理的 KMS 密钥。在您创建对称的客户托管 KMS 密钥时,可以选择使用由 AWS KMS 生成的密钥材料、在 AWS CloudHSM 集群或外部密钥管理器(通过自定义密钥存储)内生成的密钥材料或导入您自己的密钥材料。如果密钥是由 AWS KMS 生成的,则您可以为该密钥规定一个别名和描述,并选择让该密钥自动轮换。您还可以规定该密钥的所有权限,以对谁能使用或管理该密钥予以控制。对于非对称客户托管 KMS 密钥,有一些管理方面的警告:密钥材料只能在 AWS KMS HSM 内部生成,并且没有自动密钥轮换的选项。
我能否轮换密钥?
符合。您可以选择让 AWS KMS 在可配置的天数范围内[从 90 天到 2560 天(7 年)]自动轮换 KMS 密钥,或使用 RotateKeyOnDemand API 调用立即密钥轮换(每个密钥的生命周期限制为 10 次按需轮换)。导入的密钥、非对称密钥、HMAC 密钥或在 AWS CloudHSM 集群中使用 AWS KMS 自定义密钥存储功能生成的密钥不支持自动密钥轮换。您可以轮换存储在外部密钥存储(XKS)中的密钥,并在密钥管理器中管理外部密钥的所有密钥生命周期事件。
当密钥在 AWS KMS 中轮换之后,我是否必须重新加密数据?
如果您选择让 AWS KMS 自动轮换密钥,则无需重新加密数据。AWS KMS 会自动保留旧版密钥,以用于根据旧版密钥解密已加密的数据。如果您手动轮换导入的密钥或自定义密钥存储密钥,则可能需要重新加密数据,具体取决于您是否决定保留旧版本的密钥可用。
如果您手动轮换导入的密钥或自定义密钥存储密钥,根据您是否要保留旧版密钥,可能需要重新对数据进行加密。
我能否从 AWS KMS 中删除密钥?
符合。您可以设定计划以删除在 AWS KMS 中创建的 AWS KMS 密钥和相关元数据,可配置的等待期为 7 到 30 天。该等待期可帮助您验证删除密钥会对依赖它的应用程序和用户产生何种影响。默认的等待期为 30 天。在等待期内,您可以取消密钥删除操作。计划删除的密钥将无法使用,直到您在等待期内取消删除操作。如果您不取消删除操作,在可配置的等待期结束时,密钥会被删除。一旦密钥被删除,您就无法再使用它。使用被删除的根密钥保护的所有数据将无法访问。
对于使用导入密钥材料的客户 AWS KMS 密钥,您可以通过两种方式删除密钥材料,而无需删除 AWS KMS 密钥 ID 或元数据。第一,您可以按需删除无等待期的导入密钥材料。第二,在将密钥材料导入 AWS KMS 密钥中时,您可以规定一个到期时间,设定 AWS 在删除您导入的密钥材料前可以使用其多久。如果您需要再次使用,则可以将密钥材料重新导入 AWS KMS 密钥。
我能否使用 AWS KMS 帮助加密 AWS 云服务之外的数据?
符合。AWS KMS 在 AWS SDK、AWS Encryption SDK、Amazon DynamoDB 客户端加密和 Amazon Simple Storage Service(S3)加密客户端中均受支持,可促进您自己的应用程序(无论其在何处运行)内的数据加密。访问 AWS Crypto Tools 和 AWS 上的开发网站了解更多信息。
我在 AWS KMS 中创建的密钥数量是否有限制?
您最多可以在每个区域的每个账户下创建 100000 个 KMS 密钥。启用和禁用的 KMS 密钥都会被计入该限制,因此,我们建议您删除不再使用的禁用密钥。代您创建的用于受支持的 AWS 服务的 AWS 托管 KMS 密钥不在此限值之列。对于可使用 KMS 密钥传送并用于您的应用程序中或被 AWS 服务用于代您加密数据的数据密钥,其数量没有限制。您可以访问 AWS Support Center请求增加 KMS 密钥限额。
是否可以纯文本形式从该服务导出任何 KMS 密钥?
不能。所有 KMS 密钥或非对称 KMS 密钥的私有部分不能以纯文本形式从 HSM 中导出。只有非对称 KMS 密钥的公共部分可以从控制台导出,或者通过调用 GetPublicKey API 导出。
可以纯文本形式从 HSM 导出数据密钥和数据密钥对吗?
符合。对称数据密钥可以使用 GenerateDataKey API 或 GenerateDataKeyWithoutPlaintext API 导出。此外,非对称数据密钥对的私有和公共部分可以使用 GenerateDataKeyPair API 或 GenerateDataKeypairWithoutPlaintext API 从 AWS KMS 导出。
数据密钥和数据密钥对是如何进行保护以便在该服务外部存储的?
在您请求 AWS KMS 生成数据密钥时,对称数据密钥或非对称数据密钥的私有部分使用您定义的对称 KMS 密钥加密。
在哪些场景下应该使用 AWS Private Certificate Authority(CA),而不是 AWS KMS?
使用 AWS Private CA 服务的主要原因是提供公共密钥基础设施(PKI),以用于标识实体和保护网络连接。PKI 提供一些流程和机制(主要使用 X.509 证书)围绕着公共密钥加密运算设置结构。证书提供身份和公共密钥之间的关联。证书颁发机构发放证书的认证流程让受信任的证书颁发机构通过对证书签名来声明其他实体的身份。PKI 提供身份、分布式信任、密钥生命周期管理以及通过撤销发布的证书状态。这些功能为 AWS KMS 提供的底层非对称加密密钥和算法增加了重要的流程和基础设施。
AWS Private CA 可帮助您颁发证书以标识 Web 和应用服务器、服务网格、VPN 用户、内部 API 端点和 AWS IoT Core 设备。证书可帮助您确定这些资源的身份,并创建加密的 TLS/SSL 通信通道。如果您考虑使用非对称密钥来终止 Web 或应用服务器、Elastic Load Balancer、API Gateway 端点、Amazon Elastic Compute Cloud (EC2) 实例或容器上的 TLS,应考虑使用 AWS Private CA 颁发证书和提供 PKI 基础设施。
相比之下,AWS KMS 可以帮助您生成、管理和使用非对称密钥进行不需要证书的数字签名和加密操作。虽然证书支持在不受信任参与方之间验证发送者和接收者的身份,但 AWS KMS 提供的原始非对称操作类型通常适用于您有其他机制来提供身份,或者不需要证明身份即可获得所需安全益处的情况。
我可以将 OpenSSL、JCE、Bouncy Castle 或 CNG 等应用加密 API 提供程序与 AWS KMS 一起使用吗?
AWS KMS 没有针对任何其他加密 API 提供程序提供原生集成。您必须直接使用 AWS KMS API,或者通过 AWS SDK 使用,以将签名和加密功能集成到您的应用中。
AWS KMS 是否提供服务等级协议 (SLA)?
符合。如果您的月度正常运行时间百分比在任何账单周期内低于我们的服务承诺,则 AWS KMS SLA 将提供服务抵扣金。
安全性
谁可以在 AWS KMS 中使用并管理我的密钥?
AWS KMS 执行您规定的使用和管理策略。您可以选择允许您账户或其他账户中的 IAM 用户和角色使用并管理您的密钥。
AWS 如何保护我创建的 KMS 密钥?
AWS KMS 旨在确保包括 AWS 员工在内的任何人都无法从该服务中检索您的纯文本 KMS 密钥。AWS KMS 使用已经通过 FIPS 140-2 验证或正在进行验证的硬件安全模块 (HSM) 来保护密钥的机密性和完整性。您的纯文本 KMS 密钥永远不会离开 HSM,也永远不会被写入磁盘中,只会在执行您请求的加密操作期间在 HSM 的易失性内存中使用它。对服务主机上的软件以及 AWS KMS HSM 固件的更新由 Amazon 的内部独立小组以及符合 FIPS 140-2 规定的 NIST 认证的实验审计和审核的多方访问控件控制。
有关安全控件的更多详细信息,请查看 AWS KMS 加密详情技术文件。您还可以查看适用于 AWS KMS HSM 的 FIPS 140-2 证书以及关联的安全策略,以详细了解 AWS KMS HSM 对 FIPS 140-2 的安全要求的满足情况。此外,您还可以请求下载一份由 AWS Artifact 提供的系统和组织控件(SOC)报告,以详细了解该服务用于保护您的 KMS 密钥的安全控件。
如何迁移现有的 AWS KMS 密钥以使用经 FIPS 140-2 安全等级 3 验证的 HSM?
您不需要执行任何操作。所有 AWS KMS 密钥(无论创建日期或来源如何)都会使用已经获得 FIPS 140-2 Security Level 3 验证的 HSM 进行自动保护。
哪些 AWS 区域有经 FIPS 140-2 Security Level 3 验证的 HSM?
经过 FIPS 140-2 Security Level 3 验证的 HSM 部署在所有提供 AWS KMS 的 AWS 区域。
注意:根据法规,中国区域的 AWS KMS 不能使用 NIST FIPS HSM,而是使用中国国家商用密码管理局(OSCCA)认证的 HSM。
经 FIPS 140-2 验证的终端和 AWS KMS 中经 FIPS 140-2 验证的 HSM 有何区别?
AWS KMS 是两层式服务。API 终端仅使用支持完全正向保密的 TLS 密码套件通过 HTTPS 连接接受客户端请求。这些 API 端点会先验证并授权请求,然后将加密操作请求传递至 AWS KMS HSM,如果您使用的是 KMS 自定义密钥存储功能,则会传递至 AWS CloudHSM 集群。
如何使用经 FIPS 140-2 验证的终端向 AWS KMS 发出 API 请求?
应将您的应用程序配置为连接到独特区域的经 FIPS 140-2 验证的 HTTPS 端点。AWS KMS 的经 FIPS 140-2 验证的 HTTPS 端点由 OpenSSL FIPS 对象模块提供技术支持。您可以在此处查看 OpenSSL 模块的安全策略。经 FIPS 140-2 验证的 API 端点在所有提供 AWS KMS 的商业区域均可用。
使用 AWS KMS 就能符合支付卡行业数据安全标准(PCI DSS 3.2.1)中的加密和密钥管理要求吗?
符合。经过验证,AWS KMS 拥有功能和安全控件,可帮助您满足加密和密钥管理要求(主要涉及 PCI DSS 3.2.1 的第 3.5 和 3.6 节)。
如需详细了解 AWS 中符合 PCI DSS 规定的服务,请参阅 PCI DSS 常见问题。
AWS KMS 如何保护我在应用程序中导出和使用的数据密钥?
您可以请求 AWS KMS 生成数据密钥,并返回这些密钥以用于您自己的应用程序。数据密钥按照您在 AWS KMS 中定义的根密钥加密,从而使您可以安全地存储加密的数据密钥与您的加密数据。您的加密数据密钥(以及您的源数据)只能由有权使用原根密钥的用户来为您的加密数据密钥解密。
我能否导出 AWS KMS 密钥并将其用于我自己的应用程序中?
不可以。为帮助验证 AWS KMS 密钥的安全,使您的策略执行能得到一致性实施并提供集中化的 CMK 使用日志,只能在该服务中创建和使用主密钥。
我的密钥存储在何地理区域?
AWS KMS 生成的单区域 KMS 密钥存储在其创建时所在的区域中且仅用于该区域。通过 AWS KMS 多区域密钥,您可以选择将多区域主密钥复制到相同 AWS 分区内的多个区域中。
我怎么知道谁在 AWS KMS 中使用或更改了我的密钥的配置?
AWS CloudTrail 中的日志将告诉您所有 AWS KMS API 请求,包括管理请求(如创建、轮换、禁用和策略编辑)和加密请求(如加密/解密)。在您的账户中启用 CloudTrail 以查看这些日志。
AWS KMS 与 CloudHSM 相比如何?
CloudHSM 在 Amazon Virtual Private Cloud(VPC)中提供了一个经过验证的单租户 HSM 集群,以存储和使用您的密钥。您对如何通过独立于 AWS 的身份验证机制使用您的密钥拥有独家控制权。您与 CloudHSM 集群中密钥的交互方式与您与 Amazon EC2 中运行的应用程序的交互方式相似。您可以通过 PKCS#11、Java JCE 或 Microsoft CNG 界面使用 CloudHSM 支持各种使用案例,如数字权限管理 (DRM)、公有密钥基础设施 (PKI)、文档签名和加密函数。
AWS KMS 可帮助您控制您的应用程序和受支持 AWS 产品通过单个控制台在全世界多个区域使用的加密密钥。该服务使用已经或正在申请获得 FIPS 140-2 验证的 FIPS HSM 来保护您的密钥的安全性。在 AWS KMS 中对您所有的密钥进行集中化管理有助于您实施关于谁能在何种条件下使用您的密钥、它们何时轮换以及谁能管理它们的策略。AWS KMS 与 CloudTrail 的集成,使您能够审计您的密钥使用情况,以支持法规和合规性活动。如果您要通过与 AWS KMS 集成的其他 AWS 服务直接调用服务 API,请使用 AWS 开发工具包通过您的应用程序与 AWS KMS 交互,如果您要执行客户端加密,请使用 AWS Encryption SDK 通过您的应用程序与 AWS KMS 交互。
计费
使用 AWS KMS 时如何收费和计费?
使用 AWS KMS,您仅需按用量付费;而且没有最低费用。开始使用服务时,没有安装费,用户无需对服务的使用签订任何长期使用期限合约。每个月底将自动向您的信用卡收取当月使用费。
您要为您创建的所有 KMS 密钥和每月超出免费套餐的提交给服务的 API 请求支付费用。
要了解当前定价信息,请访问 AWS KMS 定价页面。
有免费套餐吗?
符合。使用 AWS Free Tier,您可以在所有区域免费*开始使用 AWS KMS。AWS 服务为您创建的 AWS 托管的 AWS KMS 密钥可以免费存储在您的账户中。还有每月提供至该服务的免费请求数量的免费使用套餐。要了解当前定价信息,包括免费套餐,请访问 AWS KMS 定价页面。
* 免费套餐不包括涉及非对称 KMS 密钥的 API 请求以及针对 GenerateDataKeyPair 和 GenerateDataKeyPairWithoutPlaintext API 的 API 请求。
定价中包含税费了吗?
除非另行说明,否则我们的价格不包含适用的税费和关税(包括增值税和适用销售税)。使用日本账单地址的客户若要使用 AWS,则需缴纳日本消费税。您可以在此处了解更多信息。
导入
我可以将自己的密钥导入到 AWS KMS 吗?
符合。您可以从自己的密钥管理基础设施向 AWS KMS 导入密钥副本,并通过任意集成的 AWS 产品或在自己的应用程序中对其加以使用。
我什么时候可以使用导入的密钥?
您可以使用导入的密钥更好地控制 AWS KMS 中密钥的创建、生命周期管理和持久性。导入的密钥用于帮助您满足合规性要求,其中可能包括能够在您的基础设施中生成或保留安全的密钥副本,以及能够从 AWS 基础设施中立即删除导入的密钥副本。
我可以导入什么类型的密钥?
您可以导入对称密钥、非对称密钥(RSA 和椭圆曲线)和 HMAC 密钥。
如何在传输中保护导入 AWS KMS 中的密钥?
在导入过程中,必须使用支持的包装算法通过 AWS KMS 提供的公钥封装您的密钥。这验证了您的加密密钥仅能被 AWS KMS 解密。
我导入的密钥和我在 AWS KMS 中生成的密钥有什么区别?
有两个主要区别:
- 您有责任在您的密钥管理基础设施中保留一份导入密钥的副本,以便随时重新导入这些密钥。但是,在您计划删除密钥之前,AWS 可一直验证 AWS KMS 代表您生成的密钥的可用性、安全性和持久性。
- 您可以为导入的密钥设置有效期。AWS KMS 将在有效期后自动删除密钥。您也可以按需删除导入的密钥材料。在这两种情况下,密钥材料本身会被删除,但 AWS KMS 中的 KMS 密钥参考以及相关的元数据仍会保留,因此,密钥材料可在今后重新导入。AWS KMS 生成的密钥不会失效,也无法立即删除;有 7 到 30 天的强制等待期。所有客户托管的 KMS 密钥,无论密钥材料是否是导入的,均可手动禁用或计划删除。在此情况中,KMS 密钥本身会被删除,而不仅仅是底层密钥材料。
如果我导入的密钥材料到期,或者被我意外删除,应该怎么办?
您可以在原 AWS KMS 密钥下将设有有效到期时间的密钥材料副本重新导入 AWS KMS,以便使用。
系统会提醒我需要重新导入密钥吗?
符合。将密钥导入 AWS KMS 密钥之后,您每隔几分钟便会收到一项 CloudWatch 指标,显示导入密钥的到期时间倒计时。如果 AWS KMS 密钥下的导入密钥到期,您还会收到一个 CloudWatch 事件。您可以构建逻辑来响应这些指标或事件,自动重新导入使用新到期时间的密钥,以免出现可用性风险。
密钥类型和算法
支持哪些对称加密密钥类型和算法?
在创建用于加密和解密的 KMS 密钥时,AWS KMS 支持 256 位密钥。返回给调用方的生成的数据密钥可以是 256 位、128 位或不超过 1024 位的任意值。AWS KMS 代表您使用 256 位 KMS 密钥进行加密或解密时,将使用 Galois Counter Mode(AES-GCM)下的 AES 算法。
支持哪些类型的对称加密密钥类型和算法?
AWS KMS 支持以下非对称密钥类型:RSA 2048、RSA 3072、RSA 4096、ECC NIST P-256、ECC NIST P-384、ECC NIST-521 和 ECC SECG P-256k1。 AWS KMS 支持 RSAES_OAEP_SHA_1 和 RSAES_OAEP_SHA_256 加密算法和 RSA 2048、RSA 3072 和 RSA 4096 密钥类型。加密算法不能与椭圆曲线密钥类型(ECC NIST P-256、ECC NIST P-384、ECC NIST-521 和 ECC SECG P-256k1)一起使用。
支持哪些类型的密钥协议算法?
使用椭圆曲线密钥类型时,AWS KMS 支持 ECDH 密钥协商算法。
支持哪些类型的非对称签名算法?
使用 RSA 密钥类型时,AWS KMS 支持 RSASSA_PSS_SHA_256、RSASSA_PSS_SHA_384、RSASSA_PSS_SHA_512、RSASSA_PKCS1_V1_5_SHA_256、RSASSA_PKCS1_V1_5_SHA_384 和 RSASSA_PKCS1_V1_5_SHA_512 签名算法。在使用椭圆曲线密钥类型时,AWS KMS 支持 ECDSA_SHA_256、ECDSA_SHA_384 和 ECDSA_SHA_512 签名算法。
如何使用非对称 KMS 密钥的公共部分?
非对称密钥材料的公共部分是在 AWS KMS 中生成的,可以通过调用“Verify”API 用于数字签名验证,或通过调用“Encrypt”API 用于公共密钥加密。公共密钥也可以在 AWS KMS 外部用于验证或加密。您可以调用 GetPublicKey API 检索非对称 KMS 密钥的公共部分。
发送到 AWS KMS 以用于非对称运算的数据大小限制是多少?
该大小限制为 4 KB。如果您想要对超过 4 KB 的数据进行数字签名,您可以选择创建数据的信息摘要,并将它发送到 AWS KMS。数字签名是基于数据摘要创建的,然后返回。您可以在 Sign API 请求中作为参数指定是要发送完整信息或信息摘要。对于要求使用非对称运算的 Encrypt、Decrypt 或 Re-Encrypt API,任何提交到这些 API 的数据也不得超过 4 KB。
如何区分我创建的非对称或对称 KMS 密钥?
在控制台中,每个密钥都有一个新字段,称作密钥类型。该字段将使用值非对称密钥或对称密钥指示密钥类型。DescribeKey API 将返回一个 KeyUsage 字段,用于指定是否可以使用密钥签名、生成 HMAC 或加密。
是否支持自动轮换非对称或 HMAC KMS 密钥?
不支持。非对称或 HMAC KMS 密钥不支持自动密钥轮换。一般来说,非对称密钥或 HMAC 密钥的轮换可能会对您现有的工作负载造成严重干扰,因为您需要停用并替换过去与其他方共享的所有密钥实例。如有必要,您可以通过创建新 KMS 密钥,并将现有密钥别名从旧 KMS 密钥映射到新 KMS 密钥来手动轮换密钥。
一个非对称 KMS 密钥是否可以同时用于加密和签名?
不可以。在创建 KMS 密钥时,必须指定密钥是可以用于解密还是签名操作。RSA 密钥类型可以用于签名或加密操作,但不能同时用于这两个操作。椭圆曲线密钥类型只能用于签名操作。
非对称密钥是否有相关的服务限制?
符合。不同密钥类型和算法有不同的每秒请求速率限制。有关详细信息,请参考 AWS KMS 限制页面。
非对称密钥可以配合 AWS KMS 自定义密钥存储功能一起使用吗?
不可以。不能将自定义密钥存储功能用于非对称密钥一起使用。
我可以将非对称 KMS 密钥用于需要数字证书的数字签名应用程序吗?
不能直接这样使用。AWS KMS 不会存储数字证书或将数字证书与它创建的 KMS 密钥关联起来。您可以选择让 AWS Private Certificate Authority 等证书颁布机构为非对称 KMS 密钥的公共部分发布证书。这将允许使用公共密钥的实体验证公共密钥确实属于您。
CloudHSM 支持的密钥存储
如何将 AWS KMS 连接到 CloudHSM?
AWS KMS 自定义密钥存储功能既有 CloudHSM 的控制能力,又有 AWS KMS 的集成性和易用性。您可以配置自己的 CloudHSM 集群,并授权 AWS KMS 将其用作您的密钥的专用密钥存储,而不是默认 AWS KMS 密钥存储。当您在 AWS KMS 中创建密钥时,可以选择在您的 CloudHSM 集群中生成密钥材料。在自定义密钥存储中生成的 KMS 密钥绝对不会以纯文本形式离开 CloudHSM 集群中的 HSM,所有使用这些密钥的 AWS KMS 操作都仅在 HSM 中执行。在所有其他方面,存储在您的自定义密钥存储中的 KMS 密钥都与其他 AWS KMS 密钥一致。
确定自定义密钥存储是否适用于您的其他指南可以在此博客中找到。
我为什么需要使用 CloudHSM?
由于您控制自己的 CloudHSM 集群,因此您可以选择独立于 AWS KMS 来管理 KMS 密钥的生命周期。您会发现自定义密钥存储之所以有用,主要有三个原因。第一,您可能在单租户 HSM 中或在您可以直接进行控制的 HSM 中有明确需要得到保护的密钥。第二,您可能需要能够立即从 AWS KMS 删除密钥材料,以证明您已经通过独立方法完成了这一操作。第三,您可能需要能够独立于 AWS KMS 或 CloudTrail 审计所有密钥的使用情况。
CloudHSM 如何改变 KMS 密钥的管理方式?
与在默认 AWS KMS 密钥存储中管理密钥相比,在由 CloudHSM 支持的自定义密钥存储中管理密钥有两个不同之处。您无法将密钥材料导入自定义密钥存储,并且您无法让 AWS KMS 自动轮换密钥。在其他所有方面,包括可以生成的密钥类型、密钥使用以及策略定义方式,存储在自定义密钥存储中的密钥与所有其他 AWS KMS 客户托管的 KMS 密钥的管理方式相同。
我能否使用 CloudHSM 来存储 AWS 托管的 KMS 密钥?
不可以,只有客户托管的 KMS 密钥可以存储在由 CloudHSM 支持的 AWS KMS 自定义密钥存储中,并能够在其中进行管理。其他 AWS 服务为您创建的用于加密数据的 AWS 托管的 KMS 密钥通常由 AWS KMS 默认密钥存储生成并存储在其中。
与 CloudHSM 的集成是否会影响加密 API 在 KMS 中的功能?
不会,API 会向 AWS KMS 发出请求,要求以同样的方式使用 KMS 密钥处理数据加密或解密。身份验证和授权运行过程与密钥的存储位置无关。所有使用 CloudHSM 支持的自定义密钥存储中的密钥的活动也会以同样的方式记录到 CloudTrail。但是,实际的加密操作只能在自定义存储或默认 AWS KMS 密钥存储中进行。
我如何在自定义密钥存储中审计密钥的使用情况?
除了被 AWS KMS 记录到 CloudTrail 的活动,自定义密钥存储的使用情况还会提供三种深入审计机制。第一种,CloudHSM 还会将所有 API 活动记录到 CloudTrail,例如创建集群和添加或删除 HSM。第二种,每个集群也会获取自己的本地日志,以记录用户和密钥管理活动。第三种,每个 CloudHSM 实例都会将本地用户和密钥管理活动日志复制到 AWS CloudWatch。
使用 CloudHSM 会对密钥的可用性产生什么影响?
通过使用 AWS KMS 自定义密钥存储,可以帮助您验证您的密钥能够用于 AWS KMS。配置 CloudHSM 时出现的错误以及在 CloudHSM 集群中意外删除密钥材料都会影响可用性。使用的 HSM 数量以及您选择的可用区(AZ)也会影响集群的恢复能力。和其他所有密钥管理系统一样,了解密钥可用性对恢复您的加密数据所产生的影响非常重要。
与 CloudHSM 相关的性能限制是什么?
存储在由 CloudHSM 支持的 AWS KMS 自定义密钥存储中的密钥可通过 AWS KMS API 调用来使用的比例低于存储在默认 AWS KMS 密钥存储中的密钥的比例。请参阅 AWS KMS 开发指南了解当前的性能限制。
使用由 CloudHSM 支持的自定义密钥存储相关的成本是多少?
使用自定义密钥存储不会对 AWS KMS 定价产生影响。但是,每个自定义密钥存储确实需要您的 AWS CloudHSM 集群包含至少两个 HSM。将根据标准 AWS CloudHSM 定价收取 HSM 的费用。使用自定义密钥存储不会产生额外的费用。
配置 CloudHSM 还需要哪些技能和资源?
想要使用自定义密钥存储的 AWS KMS 用户将需要设置 AWS CloudHSM 集群、添加 HSM、管理 HSM 用户以及可能从备份进行 HSM 恢复。这些都是安全敏感型任务,您可以验证是否拥有合适的资源和适当的组织控制。
我能否将密钥导入自定义密钥存储?
不能,不支持将您的密钥材料导入 AWS KMS 自定义密钥存储。存储在自定义密钥存储中的密钥只能在构成您的 CloudHSM 集群的 HSM 中生成。
我能否在默认 AWS KMS 密钥存储和自定义密钥存储间迁移密钥?
不可以,目前不支持在不同类型的 AWS KMS 密钥存储之间迁移密钥。所有密钥都必须在其使用的密钥存储中创建,您将自己的密钥材料导入默认 AWS KMS 密钥存储的情况除外。
我能否轮换存储在自定义密钥存储中的密钥?
不支持自动轮换 AWS KMS 自定义密钥存储中的密钥材料。密钥轮换必须手动执行,方法是创建新密钥并重新映射您的应用程序代码所使用的 AWS KMS 密钥别名,以便在今后的加密操作中使用新密钥。
我能否将我的 CloudHSM 集群用于其他应用程序?
可以,AWS KMS 不需要获得访问 CloudHSM 集群的权限。如果您已有集群,则您可以将其用作客户密钥存储,并继续将其用于您的其他应用程序。但是,如果您的集群支技非 AWS KMS 高工作负载,您可能会在您的自定义密钥存储中使用 KMS 密钥的操作时遇到吞吐量降低的情况。同样,对自定义密钥存储的高 AWS KMS 请求速率可能会对您的其他应用程序产生影响。
我如何了解有关 AWS CloudHSM 的更多信息?
访问 AWS CloudHSM 网站了解服务概览,更多有关配置和使用服务的详细信息,请参考 AWS CloudHSM 用户指南。
外部密钥存储
什么是外部密钥存储(XKS)?
外部密钥存储是一种自定义密钥存储,由您在 AWS 之外拥有和管理的外部密钥管理基础设施提供支持。所有在外部密钥存储中使用 KMS 密钥的加密或解密操作都需要在密钥管理器中使用加密密钥和操作来执行,这些密钥和操作都在您的控制下,AWS 在物理上无法访问。
为什么要使用外部密钥存储?
有些规则或法规要求存储和使用 AWS 之外由您控制的加密密钥,XKS 可以帮助您遵守这些规则或法规。
AWS KMS 如何连接到我的外部密钥管理器?
代表您的集成 AWS 服务或您自己的应用程序向 AWS KMS 发出的请求将转发到网络中的一个名为 XKS 代理的组件中。XKS 代理是一种开源 API 规范,可以帮助您和密钥管理供应商构建一个服务,接受这些请求并将其转发到密钥管理基础设施,以使用其密钥进行加密和解密。
哪些外部供应商支持 XKS 代理规范?
Thales、Entrust、Atos、Fortanix、DuoKey、Securonix、Utimaco、Salesforce、T-Systems 和 HashiCorp 提供与 XKS 代理规范集成的解决方案。有关可用性、定价以及如何使用这些供应商的解决方案的信息,请参阅其各自的文档。我们鼓励您和您的密钥管理基础设施合作伙伴利用开源 XKS 代理规范来构建满足您需求的解决方案。XKS 代理的 API 规范在此处发布。
AWS KMS 的哪些功能支持外部密钥?
外部密钥支持以下对称加密操作:Encrypt、ReEncrypt、Decrypt 和 GenerateDataKey。
XKS 如何与集成 AWS KMS 用于数据加密的 AWS 服务协同工作?
您可以使用 XKS 密钥来加密任何使用客户管理的密钥与 AWS KMS 集成的 AWS 服务中的数据。支持的服务列表请参阅此处。AWS 服务会调用 AWS KMS GenerateDataKey API 以请求唯一的纯文本数据密钥来加密数据。纯文本数据密钥会与要与加密数据一起存储的数据密钥的加密副本一起返回给服务。为了生成数据密钥的加密副本,纯文本数据密钥首先会由 AWS KMS 中存储的密钥进行加密,该密钥是 AWS 账户唯一的。然后,此加密数据密钥将转发到连接到外部密钥管理器的 XKS 代理实现,以便使用您在外部密钥管理器中定义的密钥进行第二次加密。生成的双重加密数据密钥会在对 GenerateDataKey API 请求的响应中返回。
什么是双重加密?它是如何工作的?
AWS KMS、XKS 代理实现和外部密钥管理器之间的网络连接应使用点对点加密协议(如 TLS)进行保护。然而,为了保护您从 AWS KMS 离开的数据,直到其到达您的外部密钥管理器,AWS KMS 首先会使用您的账户中的内部管理的 KMS 密钥对其进行加密,该密钥对应于外部密钥存储中定义的每个 KMS 密钥。生成的加密文字将被转发到外部密钥管理器,该管理器会使用外部密钥管理器中的密钥对其进行加密。双重加密提供的安全控制使得,如果不使用外部密钥管理器中的密钥材料,任何加密文字都无法解密。双重加密还提供了使用 FIPS 140 认证的 AWS KMS HSM 对从 AWS 网络离开的加密文字进行加密的安全控制。因为必须使用您的外部密钥管理器来解密数据,所以如果您撤消对 AWS KMS 的访问,则您的底层加密数据将无法访问。
我可以在自己的应用程序中使用 XKS 密钥来实现客户端加密吗?
符合。当使用以 AWS KMS 作为密钥提供程序的客户端对称加密解决方案时,XKS 密钥也可以在您自己的应用程序中使用。AWS 开源客户端加密解决方案(如 AWS Encryption SDK、S3 加密客户端和 DynamoDB 加密客户端)都支持 XKS 密钥。
我已经将 AWS KMS 与标准 KMS 密钥、导入的 KMS 密钥或存储在 CloudHSM 集群中的密钥一起使用。我可以将这些 KMS 密钥迁移到 XKS 或重新加密 XKS 密钥下的现有加密密钥吗?
所有 XKS 密钥都必须在 KMS 中作为新密钥创建。不能将现有的 KMS 密钥迁移到外部密钥管理器中托管的 XKS 密钥中。
假设 AWS 服务或您自己的应用程序支持该操作,您可以在新生成的 XKS 密钥下重新加密现有数据。许多 AWS 服务都可以帮助您复制加密的资源,并指定一个新的 KMS 密钥来加密副本。您可以在 AWS 服务提供的 COPY 命令中配置 XKS 密钥。通过调用 KMS ReEncrypt API 并配置 XKS 密钥,您可以在自己的应用程序中重新加密客户端加密数据。
XKS 在 KMS 中如何计价?
与所有客户管理的密钥一样,XKS 密钥的价格为每个密钥每月 1 USD,直到删除为止。XKS 密钥下的请求按与任何其他 AWS KMS 对称密钥相同的费率收费。在 AWS KMS 定价页面了解有关定价的更多信息。
XKS 密钥是否可以自动轮换密钥?
符合。XKS 规范支持自动密钥轮换,大多数支持 XKS 的供应商均提供此功能。XKS 密钥的自动轮换完全在外部密钥管理器中进行,其工作方式类似于在 KMS 中创建和管理的 AWS KMS 密钥的自动密钥轮换。当您使用轮换的 KMS XKS 密钥加密数据时,您的外部密钥管理器将使用当前的密钥材料。当您使用轮换的 XKS 密钥解密加密文字时,您的外部密钥管理器将使用加密时使用的密钥材料的版本。只要以前用于创建早期加密文字的 XKS 密钥仍然处于启用状态,并且在您的外部密钥管理器中可用,您就可以在这些 XKS 密钥版本下成功发出 Decrypt API 请求。
如果我禁用、阻止或删除外部密钥存储中的密钥,我的数据在云中的何处仍可访问?
对于不缓存密钥的服务,使用此 XKS KMS 密钥的下一个 API 调用将失败。一些服务会实现数据密钥缓存或其他密钥导出方案,以实现性能、延迟或 KMS 成本管理。这些密钥的缓存时间从 5 分钟到 24 小时不等。拒绝访问密钥后,当前正在使用的任何受保护资源(如 RDS 数据库或 EC2 实例)都会有不同的响应。有关详细信息,请参阅相关 AWS 服务文档。
如何对从 AWS KMS 发向外部密钥管理器 XKS 代理请求进行身份验证?
为了向您的外部密钥存储代理进行身份验证,AWS KMS 会使用您在代理上配置并提供给 KMS 的 AWS SigV4 凭证对所有发向代理的请求进行签名。AWS KMS 会使用服务器端 TLS 证书对外部密钥存储代理进行身份验证。或者,您的代理可以启用双向 TLS,以进一步保证其只接受 AWS KMS 的请求。
我可以为 XKS 密钥构建哪些类型的授权策略?
用于其他 KMS 密钥的所有常见 AWS KMS 授权机制(IAM 策略、AWS KMS 密钥策略、授权)均可以相同的工作方式用于外部密钥存储中的 KMS 密钥。
此外,您和/或您的外部密钥管理器合作伙伴能够基于从 AWS KMS 发送到 XKS 代理的每个请求中包含的请求元数据来实施第二层授权控制。这些元数据包括调用 AWS 用户/角色、KMS 密钥 ARN 和请求的特定 KMS API。这使得您可以在外部密钥管理器中对密钥的使用应用细粒度授权策略,而不仅仅是信任来自 AWS KMS 的任何请求。使用这些请求属性的策略执行选择由您的单个 XKS 代理实现决定。
XKS 如何进行日志记录和审计?
发向涉及 XKS 密钥的 AWS KMS 每个请求生成的唯一 ID 也会转发给 XKS 代理。您可以使用 XKS 代理或外部密钥管理器的日志数据(如果可用)来协调向 AWS KMS 发出的请求与向外部密钥管理器发出的请求。此功能允许您验证外部密钥管理器中使用密钥的所有请求是否源自您直接或通过集成 AWS 服务向 AWS KMS 发起的调用。
如果我选择 XKS 而不是使用 AWS KMS 中生成和存储的标准 KMS 密钥,我需要承担哪些风险?
可用性风险:您负责 XKS 代理和外部密钥材料的可用性。该系统必须具有高可用性,以验证无论何时您需要 XKS 密钥来解密加密资源或加密新数据,AWS KMS 都可以成功连接到 XKS 代理,而 XKS 代理本身可以连接到您的外部密钥管理器,以使用密钥完成必要的加密操作。例如,假设您使用 XKS 密钥加密了 EBS 卷,现在您想启动 EC2 实例并附加该加密卷。EC2 服务将向 AWS KMS 传递该卷的唯一加密数据密钥,以对其进行解密,以便在 Nitro 卡的易失性存储器中提供该密钥,以便对该卷的读/写操作进行解密和加密。如果 XKS 代理或外部密钥管理器无法用于解密卷密钥,则 EC2 实例将无法启动。在这些类型的故障中,AWS KMS 会返回 KMSInvalidStateException,指出 XKS 代理不可用。现在,您可以根据 KMS 提供的错误消息来确定 XKS 代理和密钥管理器不可用的原因。
耐久性风险:因为在 AWS 以外的系统中,密钥由您控制,因此您对创建的所有外部密钥的耐久性全权负责。如果 XKS 密钥的外部密钥永久丢失或删除,则在 XKS 密钥下加密的所有加密文字都不可恢复。
性能风险:您负责验证 XKS 代理和外部密钥存储基础设施的设计是否具有足够的性能特征,以满足您的需求。由于使用 XKS 密钥的每个请求都需要连接到外部密钥存储,因此如果 AWS KMS 的请求速率超过 XKS 代理或外部密钥管理器可以支持的请求速率,XKS 代理可能会成为瓶颈。此外,如果从 AWS KMS 到 XKS 代理的单个请求(包括一次重试)所用的时间超过 500ms*,AWS KMS 将向其调用客户端返回 400 错误,从而有效地通知您的 XKS 密钥不可用,调用客户端不应重试。此行为旨在最大限度地降低上游 AWS 服务或您自己的应用程序对基础设施连接问题导致的偶发过度延迟做出反应的风险。
*AWS KMS 将尝试对任何需要 250ms 的请求进行一次重试。如果重试请求的时间也超过 250ms,则将向调用客户端返回 400 错误。
使用外部密钥存储对服务等级可用性(SLA)有何影响?
由于 AWS 无法控制 AWS KMS 和您的外部密钥存储基础设施之间连接的端到端可用性,因此我们在我们的公共 KMS 可用性 SLA 中明确排除了 XKS 的使用。此外,在任何 AWS 服务的可用性 SLA 中,如果您将 XKS 密钥配置为加密服务中的数据,则该 SLA 中也排除了 XKS 密钥。