什么是 AWS Secrets Manager? - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

什么是 AWS Secrets Manager?

AWS 提供了服务 AWS Secrets Manager 以简化密钥的管理。密钥可以是数据库凭证、密码、第三方 API 密钥,甚至是任意文本。您可以通过使用 Secrets Manager 控制台、Secrets Manager 命令行界面 (CLI) 或 Secrets Manager API 和开发工具包来集中存储这些密钥并控制对其的访问。

过去,在创建自定义应用程序以从数据库中检索信息时,您通常会嵌入凭证(密钥)以直接在应用程序中访问数据库。在需要轮换凭证时,除了创建新的凭证以外,您还必须执行一些其他操作。您必须花一些时间更新应用程序以使用新凭证。然后,您分发更新的应用程序。如果您有多个应用程序具有共享凭证,而您错过更新其中一个,则该应用程序会失败。由于存在这种风险,很多客户选择不定期轮换凭证,这实际上带来了新的风险。

Secrets Manager 允许您将代码中的硬编码凭证(包括密码)替换为对 Secrets Manager 的 API 调用,以便以编程方式检索密钥。这有助于确保密钥不会被检查代码的人员泄露,因为密钥不再位于代码中。此外,您还可以配置 Secrets Manager 以根据指定的计划自动轮换密钥。这样,您就可以将长期密钥替换为短期密钥,从而显著降低泄露风险。

Secrets Manager 入门

有关充分利用 Secrets Manager 所需了解的术语和概念的列表,请参阅 AWS Secrets Manager 的主要术语和概念

典型的 Secrets Manager 用户可能具有以下一个或多个角色:

  • Secrets Manager 管理员 – 管理 Secrets Manager 服务。向个人授予权限,然后这些人可以执行此处列出的其他角色。

  • 数据库或服务管理员 – 使用存储在 Secrets Manager 中的密钥管理数据库或服务。确定并配置其密钥的轮换和过期设置。

  • 应用程序开发人员 – 创建应用程序,然后将应用程序配置为从 Secrets Manager 请求适当的凭证。

基本 Secrets Manager 场景

下图阐明了最基本的场景。该图显示您可以在 Secrets Manager 中存储数据库的凭证,然后在应用程序中使用这些凭证以访问数据库。

  1. 数据库管理员在 Personnel 数据库上创建一组凭证,以供名为 MyCustomApp 的应用程序使用。管理员还使用应用程序访问 Personnel 数据库时所需的权限来配置这些凭证。

  2. 数据库管理员将凭证作为名为 MyCustomAppCreds 的密钥存储在 Secrets Manager 中。然后,Secrets Manager 对凭证进行加密并将凭证作为受保护的密钥文本存储在密钥中。

  3. 在 MyCustomApp 访问数据库时,该应用程序在 Secrets Manager 中查询名为 MyCustomAppCreds的密钥。

  4. Secrets Manager 检索密钥,解密受保护密钥文本,然后通过受保护通道(具有 TLS 的 HTTPS)将密钥返回给客户端应用程序。

  5. 客户端应用程序解析响应中的凭证、连接字符串以及所需的任何其他信息,然后使用这些信息访问数据库服务器。

注意

Secrets Manager 支持很多类型的密钥。不过,Secrets Manager 可以内在轮换支持的 AWS 数据库的凭证,而无需进行任何其他编程。不过,要为其他数据库或服务轮换密钥,需要创建自定义 Lambda 函数以定义 Secrets Manager 如何与数据库或服务进行交互。您需要具有一些编程技巧才能创建该函数。有关更多信息,请参阅轮换您的 AWS Secrets Manager 密钥

Secrets Manager 的功能

在运行时以编程方式检索加密的密钥值

Secrets Manager 从应用程序源代码中删除硬编码的凭证,且不在应用程序中存储凭证,从而帮助您改善安全状况。如果在应用程序中存储凭证或与其存储在一起,检查您的应用程序或组件的任何人都可能会泄露这些凭证。由于您必须更新应用程序并将更改部署到每个客户端,然后才能弃用旧凭证,因此,该过程使凭证轮换变得非常困难。

Secrets Manager 允许您将存储的凭证替换为对 Secrets Manager Web 服务的运行时调用,因此您可以在需要时动态检索凭证。

在大多数情况下,您的客户端需要访问最新版本的加密密钥值。在查询加密的密钥值时,您可以选择仅提供密钥名称或 Amazon 资源名称 (ARN),而根本不指定任何版本信息。如果这样做,Secrets Manager 会自动返回最新版本的密钥值。

不过,可能会同时存在其他版本。大多数系统支持比简单密码更复杂的密钥,例如,一整套包含连接详细信息、用户 ID 和密码的凭证。Secrets Manager 允许您同时存储多组此类凭证。Secrets Manager 将每组凭证存储在不同的密钥版本中。在密钥轮换过程中,Secrets Manager 跟踪旧凭证以及要开始使用的新凭证,直到轮换完成为止。它使用暂存标签 跟踪这些不同的版本。

存储不同类型的密钥

借助 Secrets Manager,您可以存储密钥的加密密钥数据部分的文本。这通常包括数据库或服务的连接详细信息。这些详细信息可以包括服务器名称、IP 地址和端口号,以及用于登录服务的用户名和密码。有关密钥的详细信息,请参阅最大值和最小值。受保护的文本不包含:

  • 密钥名称和描述

  • 轮换或过期设置

  • 与密钥关联的 AWS KMS 客户主密钥 (CMK) 的 ARN

  • 任何附加的 AWS 标签

对密钥数据进行加密

通过使用 AWS Key Management Service (AWS KMS),Secrets Manager 可以加密密钥的受保护文本。许多 AWS 服务都将 AWS KMS 用于密钥存储和加密。AWS KMS 确保安全地对密钥静态加密。Secrets Manager 将每个密钥与 AWS KMS CMK 相关联。它可以是账户用于 Secrets Manager 的默认 CMK,也可以是客户创建的 CMK。

每次 Secrets Manager 加密受保护密钥数据的新版本时,Secrets Manager 请求 AWS KMS 从指定的 CMK 中生成新的数据密钥。Secrets Manager 使用该数据密钥进行信封加密。Secrets Manager 将加密的数据密钥与受保护密钥数据一起存储。每当密钥需要解密时,Secrets Manager 都会请求 AWS KMS 解密数据密钥,Secrets Manager 然后使用该数据密钥来解密受保护的密钥数据。Secrets Manager 从不以未加密的形式存储数据密钥,并且总是在使用后立即处理数据密钥。

此外,默认情况下,Secrets Manager 仅接受来自使用开放标准传输层安全性 (TLS)完美前向保密的主机的请求。Secrets Manager 确保在 AWS 和用于检索密钥的计算机之间传输密钥时对其进行加密。

自动轮换您的密钥

您可以将 Secrets Manager 配置为自动轮换密钥,而无需进行用户干预和按照指定的计划进行轮换。

您可以使用 AWS Lambda 函数定义和实施轮换。该函数定义 Secrets Manager 如何执行以下任务:

  • 创建密钥的新版本。

  • 将密钥存储在 Secrets Manager 中。

  • 将受保护服务配置为使用新版本。

  • 验证新版本。

  • 将新版本标记为生产就绪。

暂存标签可以帮助您跟踪不同版本的密钥。每个版本可以附加多个暂存标签,但每个暂存标签只能附加到一个版本。例如,Secrets Manager 使用 AWSCURRENT 标记当前处于活动状态的正在使用的密钥版本。您应该将应用程序配置为始终查询密钥的最新版本。在轮换过程创建密钥的新版本时,Secrets Manager 自动将 AWSPENDING 暂存标签添加到新版本中,直到测试和验证完成为止。仅在此后,Secrets Manager 才会将 AWSCURRENT 暂存标签添加到该新版本中。您的应用程序在下次查询标记有 AWSCURRENT 的版本时,会立即开始使用新密钥。

支持完全配置且直接可用的轮换的数据库

在选择启用轮换时,Secrets Manager 使用 AWS 编写和测试的 Lambda 轮换函数模板支持以下 Amazon Relational Database Service (Amazon RDS) 数据库,并且可以完全配置轮换过程:

  • Amazon RDS 上的 Amazon Aurora

  • Amazon RDS 上的 MySQL

  • Amazon RDS 上的 PostgreSQL

  • Amazon RDS 上的 Oracle

  • Amazon RDS 上的 MariaDB

  • Amazon RDS 上的 Microsoft SQL Server

支持完全配置且直接可用的轮换的其他服务

您还可以选择在以下服务(使用 AWS 编写和测试的 Lambda 轮换函数模板提供完全支持)上启用轮换,并且可以完全配置轮换过程:

  • Amazon DocumentDB

  • Amazon Redshift

您也可以存储几乎任何其他类型的数据库或服务的密钥。不过,要自动轮换密钥,您需要创建和配置自定义 Lambda 轮换函数。有关为数据库或服务编写自定义 Lambda 函数的更多信息,请参阅 Lambda 轮换函数概述

控制对密钥的访问

您可以将 AWS Identity and Access Management (IAM) 权限策略附加到用户、组和角色,以授予或拒绝访问特定密钥的权限,以及限制对这些密钥进行管理。例如,您可能将一个策略附加到其成员需要能够完全管理和配置您的密钥的组。另一个附加到应用程序所使用角色的策略可能仅授予对应用程序运行所需的一个密钥的读取权限。

或者,您也可以将基于资源的策略直接附加到密钥,以便授予权限以指定可以读取或修改密钥和版本的用户。与自动应用于用户、组或角色的基于身份的策略不同,附加到密钥的基于资源的策略使用 Principal 元素指定策略的目标。Principal 元素可以包含同一账户中的用户和角色作为密钥,或者包含其他账户中的委托人。

访问 Secrets Manager

您可以通过以下任何方式使用 Secrets Manager:

AWS 管理控制台

您可以使用基于浏览器的 Secrets Manager 控制台管理密钥,并使用控制台执行与密钥相关的几乎所有任务。

目前,您无法在控制台中执行以下任务:

  • 在密钥中存储二进制数据。 控制台当前仅在密钥的 SecretString 字段中存储数据,而不使用 SecureBinary 字段。要存储二进制数据,您当前必须使用 AWS CLI 或某个 AWS 开发工具包。

AWS 命令行工具

使用 AWS 命令行工具,您可以在系统命令行中发出命令以执行 Secrets Manager 及其他 AWS 任务。与使用控制台相比,此方法更快、更方便。如果要构建执行 AWS 任务的脚本,命令行工具会十分有用。

AWS 提供两组命令行工具:AWS Command Line Interface (AWS CLI) 和 适用于 Windows PowerShell 的 AWS 工具。有关安装和使用 AWS CLI 的更多信息,请参阅 AWS Command Line Interface 用户指南。有关安装和使用Windows PowerShell 工具的更多信息,请参阅适用于 Windows PowerShell 的 AWS 工具 用户指南

AWS 开发工具包

AWS 开发工具包包含各种编程语言和平台的库和示例代码,例如,JavaPythonRuby.NETiOS 和 Android 以及其他编程语言和平台。开发工具包包括多个任务,例如以加密方式对请求进行签名、管理错误以及自动重试请求。有关 AWS 开发工具包的更多信息(包括如何下载和安装这些工具包),请参阅适用于 Amazon Web Services 的工具

Secrets Manager HTTPS 查询 API

Secrets Manager HTTPS 查询 API 使您能够以编程方式访问 Secrets Manager 和 AWS。HTTPS 查询 API 允许您直接向服务发出 HTTPS 请求。使用 HTTPS API 时,必须添加代码,才能使用您的凭证对请求进行数字化签名。有关更多信息,请参阅通过提出 HTTP 查询请求来调用 APIAWS Secrets Manager API 参考

注意

我们建议使用所需的编程语言特定的开发工具包,而不是使用 HTTPS 查询 API。开发工具包执行很多您手动执行的有用任务。开发工具包自动对请求进行签名,并将响应转换为在语法上适合您的语言的结构。只有在软件开发工具包不可用时,才应使用 HTTPS 查询 API。

Secrets Manager 定价

在使用 Secrets Manager 时,仅按实际使用量收费,无最低费用或设置费用。有关当前完整定价列表,请参阅 AWS Secrets Manager 定价

AWS KMS – 自定义加密密钥

如果您使用 AWS KMS 对密钥进行加密以创建自己的客户主密钥,AWS 将按当前 AWS KMS 费率对您收费。不过,您可以免费使用 AWS Secrets Manager 为您的账户创建的“默认”密钥。有关客户创建的 AWS KMS 密钥的费用的更多信息,请参阅 AWS Key Management Service 定价

AWS CloudTrail 日志记录 – 存储和通知

如果在您的账户上启用 AWS CloudTrail,您可以获取 AWS Secrets Manager 发出的 API 调用的日志。Secrets Manager 将所有事件作为管理事件进行记录。没有数据事件。捕获 AWS CloudTrail 中的单个跟踪以捕获管理事件时,无需额外费用。AWS CloudTrail 免费存储所有管理事件的第一个副本。不过,用于日志存储的 Amazon S3 和启用通知后的 Amazon SNS 会产生费用。此外,如果您设置了其他跟踪,管理事件的其他副本可能会产生费用。有关更多信息,请参阅 AWS CloudTrail 定价页。