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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

AWS Secrets Manager 最佳实践

以下建议可以帮助您更安全地使用 AWS Secrets Manager:

保护其他敏感信息

除了用户名和密码以外,密钥通常还包含一些其他信息。根据数据库、服务或网站,您可以选择包括额外的敏感数据。该数据可能包括密码提示,或者可用于恢复密码的问题答案组合。

确保安全地保护可用于访问密钥中的凭证的任何信息,就像凭证本身一样安全。不要在 Description 或密钥的任何其他未加密部分中存储此类信息,

而应将所有此类敏感信息存储为加密的密钥值的一部分(在 SecretStringSecretBinary 字段中)。您可以在密钥中存储最多 65536 个字节。在 SecretString 字段中,文本通常采用 JSON 键值字符串对格式,如以下示例所示:

{ "engine": "mysql", "username": "user1", "password": "i29wwX!%9wFV", "host": "my-database-endpoint.us-east-1.rds.amazonaws.com", "dbname": "myDatabase", "port": "3306" }

使用 AWS 提供的客户端缓存组件以提高性能

要最有效地使用密钥,不应仅在每次需要使用凭证时从 Secrets Manager 中检索密钥值,而是使用支持的 Secrets Manager 客户端组件缓存密钥,并仅在需要时更新密钥(由于轮换)。AWS 已为您创建此类客户端组件,并将其作为开源组件提供。有关更多信息,请参阅使用 AWS 开发的开源客户端缓存组件

将重试次数添加到应用程序

您的AW客户端可能会看到呼叫 Secrets Manager 由于客户方面的意外问题而失败。或者,由于费率限制, Secrets Manager 您尝试调用的资源。当您超过一个API请求配额时,密钥管理器会限制请求,即它拒绝一个其他有效请求并返回 ThrottlingException 错误。要做出回应,请使用 后退和重试策略在这两种情况下,此类故障通常不需要特殊处理,应再次进行呼叫,通常在短暂的等待期后进行。当您遇到这些错误或异常时,ASM提供了许多功能来帮助重新尝试调用ASM服务。

如果您遇到以下错误,则可能需要添加 retries 到您的申请代码:

暂时性错误和异常

  • RequestTimeout

  • RequestTimeoutException

  • PriorRequestNotComplete

  • ConnectionError

  • HTTPClientError

服务端限制和限制错误和例外情况

  • Throttling

  • ThrottlingException

  • ThrottledException

  • RequestThrottledException

  • TooManyRequestsException

  • ProvisionedThroughputExceededException

  • TransactionInProgressException

  • RequestLimitExceeded

  • BandwidthLimitExceeded

  • LimitExceededException

  • RequestThrottled

  • SlowDown

有关重试、指数回溯和振动的更多信息以及示例代码,请参阅以下资源:

降低记录和调试 Lambda 函数的风险

在创建一个自定义 Lambda 轮换函数来支持 Secrets Manager 密钥时,请慎重地在函数中包括调试或日志记录语句。这些语句可导致函数中的信息写入 CloudWatch 中。确保将信息记录到 CloudWatch 的操作不包括在加密的密钥值中存储的任何敏感数据。此外,如果您在开发期间选择在代码中包含任何此类语句以进行测试和调试,请确保在生产中使用代码之前从代码中删除这些行。此外,切记在不再需要时删除所有日志,包括在开发期间收集的敏感信息。

由 AWS 和支持的数据库提供的 Lambda 函数不包括日志记录和调试语句。

降低使用 AWS CLI 存储密钥的风险

使用 AWS Command Line Interface (AWS CLI) 调用 AWS 操作时,您会在命令 Shell 中输入这些命令。例如,您可以使用 Windows 命令提示符或 Windows PowerShell,或者 Bash 或 Z Shell,或者其他类型。其中的很多命令 Shell 包含旨在提高工作效率的功能。但其他人可能会使用该功能窃取您的密钥。例如,在大多数 Shell 中,您可以使用上箭头键查看最后输入的命令。访问不受保护的会话的任何人可能会利用命令历史记录功能。另外,在后台工作的其他实用程序可能有权访问您的命令参数,这些参数旨在帮助您更高效地执行任务。为了减轻此类风险,请确保执行以下步骤:

  • 在离开计算机前始终记得锁定计算机。

  • 卸载或禁用不需要或不再使用的控制台实用程序。

  • 确保 Shell 或远程访问程序(如果您在使用其中之一)不会记录键入的命令。

  • 使用一些方法传递 Shell 命令历史记录未捕获的参数。以下示例说明了如何在文本文件中键入密钥文本,然后将该文件传递给 AWS Secrets Manager 命令并立即销毁文件。这意味着典型的shell历史记录不会捕获机密文本。

    以下示例显示典型的 Linux 命令(但您的 shell 可能需要稍有不同的命令):

    $ touch secret.txt # Creates an empty text file $ chmod go-rx secret.txt # Restricts access to the file to only the user $ cat > secret.txt # Redirects standard input (STDIN) to the text file ThisIsMyTopSecretPassword^Z # Everything the user types from this point up to the CTRL-D (^D) is saved in the file $ aws secretsmanager create-secret --name TestSecret --secret-string file://secret.txt # The Secrets Manager command takes the --secret-string parameter from the contents of the file $ shred -u secret.txt # The file is destroyed so it can no longer be accessed.

运行这些命令后,在使用向上和向下箭头滚动命令历史记录时就不会在任何一行中看到密钥文本。

重要

默认情况下,不能在 Windows 中使用这类技术,除非您先将命令历史记录的缓冲区大小减小为 1

将 Windows 命令提示符配置为 1 条命令只有 1 条命令的历史记录缓冲区

  1. 以管理员身份打开命令提示符(以管理员身份运行)。

  2. 选择左上角的图标,然后选择属性

  3. 选项选项卡上,将缓冲区大小缓冲区数均设置为 1,然后选择确定

  4. 每次您必须键入不希望保留在历史记录中的命令时,请在紧靠该命令后面键入另一条命令,例如:

    echo.

    这可以确保您刷新敏感命令。

对于 Windows 命令提示符 Shell,您可以下载 SysInternals SDelete 工具,然后使用类似下面的命令:

C:\> echo. 2> secret.txt # Creates an empty file C:\> icacls secret.txt /remove "BUILTIN\Administrators" "NT AUTHORITY/SYSTEM" /inheritance:r # Restricts access to the file to only the owner C:\> copy con secret.txt /y # Redirects the keyboard to text file, suppressing prompt to overwrite THIS IS MY TOP SECRET PASSWORD^Z # Everything the user types from this point up to the CTRL-Z (^Z) is saved in the file C:\> aws secretsmanager create-secret --name TestSecret --secret-string file://secret.txt # The Secrets Manager command takes the --secret-string parameter from the contents of the file C:\> sdelete secret.txt # The file is destroyed so it can no longer be accessed.

跨账户访问 – 我应该指定用户/角色还是账户?

如果您希望使用附加到密钥的基于资源的策略,以便为不同 AWS 账户中的 IAM 委托人提供访问权限,您可以选择两种方法:

  • 仅指定另一个账户的 ID – 在语句的 Principal 元素中,您指定“外部”账户根用户的 Amazon 资源名称 (ARN)。这使得该外部账户的管理员可以委派对该外部账户中角色的访问权。然后,管理员必须将 IAM 权限策略分配给一个或多个需要访问密钥的角色。

    "Principal": {"AWS": arn:aws-cn:iam::AccountId:root}
  • 指定其他账户中的确切用户或角色 – 指定一个确切用户或角色 ARN 作为基于密钥的策略的 Principal。您从其他账户的管理员获得 ARN。仅账户中的特定单个用户或角色可以访问资源。

    "Principal": [ {"AWS": "arn:aws-cn:iam::AccountId:role/MyCrossAccountRole"}, {"AWS": "arn:aws-cn:iam::AccountId:user/MyUserName"} ]

最佳实践是,出于以下原因,我们建议您仅在基于密钥的策略中指定账户:

  • 在这两种情况下,您信任另一个账户的管理员。在第一种情况下,您信任管理员,以确保仅授权的个人能够访问 IAM 用户,或者可以担任指定的角色。这创建的信任级别与仅指定账户 ID 基本相同。您信任账户和管理员。在您仅指定账户 ID 时,您为管理员提供了管理用户的灵活性。

  • 在您指定确切的角色时,IAM 在内部将角色转换为角色特有的“委托人 ID”。如果您删除角色并使用相同的名称重新创建角色,角色将获得新的委托人 ID。这意味着新角色不会自动获取对资源的访问权限。IAM 出于安全原因提供此功能,意味着意外删除和还原可能导致访问“中断”。

在您仅为账户根用户授予权限时,这组权限将成为账户管理员可以向用户和角色委派的选项的限制。如果没有先为账户授予权限,则管理员无法为资源授予权限。

重要

如果您选择直接授予跨账户访问密钥的权限而不使用角色,则必须使用自定义 AWS KMS 客户主密钥 (CMK) 对密钥加密。来自其他账户的委托人必须已获得密钥和自定义 AWS KMS CMK 的权限。

在 VPC 中运行所有内容

只要可能,您应该在无法从公有 Internet 访问的私有网络上运行尽可能多的基础设施。为此,请将您的服务器和服务托管在 Amazon VPC 提供的 Virtual Private Cloud (VPC) 中。AWS 提供了只能由您的账户中的资源访问的虚拟化私有网络。除非您明确配置了访问权限,否则无法从公有 Internet 查看或访问。例如,您可以添加 NAT 网关。有关 Amazon VPC 的完整信息,请参阅 Amazon VPC 用户指南

要在 VPC 环境中启用密钥轮换,请执行以下步骤:

  1. 配置 Lambda 轮换函数,以便在与具有轮换的密钥的数据库服务器或服务相同的 VPC 中运行。有关更多信息,请参阅 Amazon VPC 中的配置 Lambda 函数以访问 AWS Lambda Developer Guide 中的资源

  2. 现在从 VPC 中运行的 Lambda 轮换函数必须能够访问 Secrets Manager 服务终端节点。如果 VPC 没有直接 Internet 连接,您可以为 VPC 配置私有 Secrets Manager 终端节点,该终端节点可以由 VPC 中的所有资源访问。有关详细信息,请参阅 配置网络以支持轮换密钥

标记您的密钥

一些 AWS 服务允许您在资源中添加标签,并且 Secrets Manager 允许您标记密钥。Secrets Manager 将标签定义为包含客户定义的键和可选值的简单标签。您可以使用这些标签进行管理以及搜索和筛选您的 AWS 账户中的资源。在标记密钥时,请务必遵循以下准则:

  • 跨所有资源使用标准化命名方案。请记住,标签区分大小写。

  • 创建标签集,以使您能够执行以下操作:

    • 安全性/访问控制 – 您可以检查附加到密钥的标签,以授予或拒绝该密钥的访问权限。

    • 成本分配和跟踪 – 您可以按标签对您的 AWS 账单进行分组和分类。有关更多信息,请参阅 https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html 中的AWS Billing and Cost Management 用户指南使用成本分配标签

    • 自动化 – 您可以使用标签筛选资源以进行自动化活动。例如,某些客户运行自动启动/停止脚本以在非工作时间关闭开发环境,从而降低成本。您可以创建一个标签,然后检查该标签以指示是否应在关闭中包括特定的 Amazon EC2 实例。

    • AWS 管理控制台 – 通过使用某些 AWS 服务控制台,您可以根据标签组织显示的资源,并按标签对其进行排序和筛选。AWS 还提供了资源组工具以创建自定义控制台,从而根据资源的标签整合和组织资源。更多信息,请参阅 使用资源组AWS 管理控制台 入门指南.

可以创造性地使用标签以管理密钥。请记住,您绝不能在标签中存储密钥的敏感信息。

您可以在创建密钥时编辑密钥时为密钥添加标签。

更多信息,请参阅 AWS 标记策略AWS 答案 网站。

按计划轮换密钥

如果您的密钥有很长一段时间未更改,密钥泄露的可能性就会增大。随着越来越多的用户访问密钥,可能会有人处理不当,并已将密钥泄露给未经授权的实体。密钥可能会通过日志和缓存数据泄露出去。密钥可能会共享用于调试目的,但在调试完成后未更改或撤销。出于所有这些原因,密钥应该频繁地轮换。

配置 Secrets Manager 以便频繁地轮换您的密钥,避免为您的应用程序使用相同的密钥。

请参阅 轮换您的 AWS Secrets Manager 密钥

审计对密钥的访问

作为最佳实践,您应该监控密钥的使用情况,并记录对密钥进行的任何更改。这有助于确保您能够调查任何意外的使用或更改,并回滚不需要的更改。

您可以使用 AWS CloudTrail 记录所有 Secrets Manager 活动,来监控对密钥的访问。此外,您应该设置自动检查不当使用密钥的机制。

请参阅 监控您的 AWS Secrets Manager 密钥的使用

使用 AWS Config 监控您的密钥

AWS Secrets Manager 与 AWS Config 集成,可以更轻松地跟踪 Secrets Manager 中的密钥更改。AWS Config 可以帮助您定义有关密钥管理最佳实践的组织内部准则。此外,您还可以快速识别不符合您的安全规则的密钥,并从 Amazon SNS 接收有关您的密钥配置更改的通知。

请参阅 使用 AWS Config 监控 Secrets Manager 密钥