本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS Secrets Manager 座席
Secrets Manager 代理的工作原理
AWS Secrets Manager 代理是一项客户端 HTTP 服务,可帮助您标准化在计算环境中使用 Secrets Manager 中的密钥的方式。您可以将以下服务与该密钥一起使用:
-
AWS Lambda
-
Amazon Elastic Container Service
-
Amazon Elastic Kubernetes Service
-
Amazon Elastic Compute Cloud
Secrets Manager 代理检索密钥并将其缓存在内存中,从而可让您的应用程序从本地主机获取密钥,而不必直接调用 Secrets Manager。Secrets Manager 代理只能读取密钥,而无法对其进行修改。
Secrets Manager Agent 是开源的。源代码、安装说明和最新版本信息可在上找到GitHub
重要
Secrets Manager Agent 使用您环境中的 AWS 凭据调用 Secrets Manager。它包括针对服务器端请求伪造(SSRF)的保护,以协助改进密钥安全性。默认情况下,Secrets Manager Agent 使用后量子 ML-KEM 密钥交换作为优先级最高的密钥交换。
了解 Secrets Manager 代理缓存
Secrets Manager 代理使用内存缓存,该缓存会在 Secrets Manager 代理重启时重置。它会根据以下条件定期刷新缓存的密钥值:
-
默认刷新频率(TTL)为 300 秒
-
您可以使用配置文件修改 TTL
-
在 TTL 过期后请求密钥时,就会发生刷新
注意
Secrets Manager 代理不包括缓存失效。如果密钥在缓存条目过期之前轮换,则 Secrets Manager 代理可能会返回过时的密钥值。
Secrets Manager 代理返回的密钥值与 GetSecretValue 的响应格式相同。密钥值在缓存中未进行加密。
主题
构建 Secrets Manager 代理
在开始之前,请确保您已为自己的平台安装标准开发工具和 Rust 工具。
注意
目前,在 macOS 上构建启用 fips 功能的代理需要以下解决方法:
-
创建名为
SDKROOT的环境变量,该变量设置为运行xcrun --show-sdk-path的结果
安装 Secrets Manager 代理
从以下安装选项中选择您的计算环境。
使用 Secrets Manager 代理检索密钥
要检索密钥,请调用本地 Secrets Manager 代理端点,并将密钥的名称或 ARN 作为查询参数包括在内。默认情况下,Secrets Manager 代理会检索密钥的 AWSCURRENT 版本。要检索其他版本,请使用 versionStage 或 versionId 参数。
重要
为了帮助保护 Secrets Manager 代理,您必须在每个请求中包含 SSRF 令牌标头:X-Aws-Parameters-Secrets-Token。Secrets Manager 代理会拒绝没有此标头或具有无效 SSRF 令牌的请求。您可以在 配置 Secrets Manager 代理 中自定义 SSRF 标头名称。
所需的权限
Secrets Manager Agent 使用 AWS 适用于 Rust 的 SDK,该软件开发工具包使用AWS 凭证提供者链。这些 IAM 凭证的身份决定了 Secrets Manager 代理检索密钥的权限。
-
secretsmanager:DescribeSecret -
secretsmanager:GetSecretValue
有关权限的更多信息,请参阅 的权限参考 AWS Secrets Manager。
重要
将密钥值拉入 Secrets Manager 代理后,任何有权访问计算环境和 SSRF 令牌的用户都可以从 Secrets Manager 代理缓存中访问密钥。有关更多信息,请参阅 安全注意事项。
示例请求
了解 refresh Now 参数
Secrets Manager 代理使用内存缓存来存储密钥值,该值会定期刷新。默认情况下,当您在生存时间(TTL)到期后请求密钥时,就会发生此刷新,通常每 300 秒刷新一次。但是,这种方法有时会导致密钥值过时,特别是如果密钥在缓存条目过期之前轮换。
为解决此限制,Secrets Manager 代理支持在 URL 中使用称为 refreshNow 的参数。您可以使用此参数强制立即刷新密钥的值,从而绕过缓存并确保您拥有最新的信息。
- 默认行为(没有
refreshNow) -
-
在 TTL 过期之前使用缓存值
-
仅在 TTL 之后刷新密钥(默认为 300 秒)
-
如果密钥在缓存过期之前轮换,则可能会返回旧值
-
- 使用
refreshNow=true的行为 -
-
完全绕过缓存
-
直接从 Secrets Manager 中检索最新的密钥值
-
使用新值更新缓存并重置 TTL
-
确保您始终获得最新的密钥值
-
Force-refresh 一个秘密的价值
重要
refreshNow 的默认值为 false。设置为 true 时,它将覆盖 Secrets Manager 代理配置文件中指定的 TTL,并对 Secrets Manager 进行 API 调用。
使用角色链跨账户检索机密
角色链接允许 Secrets Manager 代理通过使用 AWS STS AssumeRole假设 IAM 角色从其他 AWS 账户检索机密。Secrets Manager Agent 为每个唯一角色 ARN 创建并缓存一个单独的缓存客户端。每个角色客户端都维护自己的独立缓存,因此使用不同角色获取的相同密钥具有单独的缓存条目。
所需的权限
要使用角色链,您需要满足以下条件:
-
Secrets Manager 代理的环境凭证必须拥有目标角色 ARN 的
sts:AssumeRole权限。 -
目标角色必须具有
secretsmanager:GetSecretValue您要访问的密钥的secretsmanager:DescribeSecret权限。 -
目标角色的信任策略必须允许 Secrets Manager 代理的身份取代它。
检索跨账户密钥
在您向 Secrets Manager 代理发出的请求中包含roleArn查询参数,以指定在检索机密时扮演哪个角色。
角色链配置和限制
使用 TOML 配置文件中的max_roles选项配置角色链。这将设置同时扮演角色的最大数量,范围为 1 到 20。默认值为 20。
重要
假设的角色不会从 Secrets Manager 代理的角色缓存中移出。达到最大角色数量后,具有新角色 ARN 的请求将被拒绝并400显示错误,直到 Secrets Manager 代理重新启动。
角色链接的错误响应
400-
roleArn格式无效或已达到担任角色的最大数量。 403-
AWS STS
AssumeRole调用失败。验证目标角色的信任策略是否允许 Secrets Manager 代理的身份取代它。
Pre-fetch 启动时的秘密
默认情况下,当您的应用程序请求密钥时,Secrets Manager 代理会按需获取密钥。通过预取,Secrets Manager Agent 在启动时会将指定的密钥加载到缓存中,因此您的应用程序无需等待第一次 API 调用即可立即访问它们。 Pre-fetching 作为后台任务运行 — Secrets Manager Agent 会立即开始接受请求,并且在预取完成时不会阻塞。
您可以通过两种方式指定要预取的机密:
-
显式密钥-列出特定的密钥 ID 或 ARN。
-
Tag-based 发现-通过标签密钥发现秘密。Secrets Manager Agent 会获取所有带有指定标签的密钥。
所需的权限
除了检索密钥的标准权限外,预取还需要以下条件:
-
secretsmanager:BatchGetSecretValue— 所有预取操作均为必填项。 -
secretsmanager:ListSecrets— 仅在使用基于标签的发现时才需要。
配置预提取
在 TOML 配置文件中添加一个[prefetch]部分。以下选项可用:
cache_buffer_ratio-
预取期间每个客户端要填充的最大缓存比例,范围为 0.1 到 1.0。默认值为 0.8。当达到缓冲区限制时,Secrets Manager Agent 会停止预取剩余的密钥——它不会移出现有的缓存条目。预取期间未加载的密钥仍可按需提供。
max_jitter_seconds-
预取开始之前的随机延迟(以秒为单位),范围为 0 到 10。默认值是 0。使用它可以防止在多个代理同时启动时同步队列范围的 API 调用。
例 Pre-fetch 带有显式机密的配置
[prefetch] cache_buffer_ratio = 0.6 max_jitter_seconds = 5 secrets = [ { secret_id = "arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret-AbCdEf" }, { secret_id = "MyOtherSecret" }, ]
例 Pre-fetch 使用基于标签的发现进行配置
[prefetch] cache_buffer_ratio = 0.8 filter_tags = [ { key = "Environment" }, { key = "Team" }, ]
您还可以在同一个配置中组合显式密钥和基于标签的发现。要进行跨账户预提取,请添加字段。role_arn有关更多信息,请参阅 使用角色链跨账户检索机密。
例 Pre-fetch 具有跨账户访问权限的配置
[prefetch] cache_buffer_ratio = 0.6 max_jitter_seconds = 5 secrets = [ { secret_id = "arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret-AbCdEf" }, { secret_id = "cross-account-secret", role_arn = "arn:aws:iam::987654321098:role/SecretAccessRole" }, ] filter_tags = [ { key = "Environment" }, { key = "Team", role_arn = "arn:aws:iam::987654321098:role/SecretAccessRole" }, ]
配置 Secrets Manager 代理
要更改 Secrets Manager 代理的配置,请创建一个 TOML./aws_secretsmanager_agent --config
config.toml。
配置选项
log_level-
Secrets Manager 代理日志中报告的详细程度:DEBUG、INFO、WARN、ERROR 或 NONE。默认值为 INFO。
log_to_file-
是登录文件还 stdout/stderr是:
true或false。默认值为true。 http_port-
本地 HTTP 服务器的端口,范围在 1024 到 65535 之间。默认值为 2773。
region-
用于请求的 AWS 区域。如果未指定区域,则 Secrets Manager 代理会根据 SDK 确定区域。有关更多信息,请参阅《AWS SDK for Rust 开发人员指南》中的 Specify your credentials and default Region。
ttl_seconds-
缓存项目的 TTL(以秒为单位),范围在 1 到 3600 之间。默认值为 300。0 表示没有缓存。
cache_size-
缓存中可以存储的最大密钥数,范围为 1 至 1000。默认值为 1000。
ssrf_headers-
Secrets Manager 代理检查 SSRF 令牌的标头名称列表。默认值为 “X-Aws-Parameters-Secrets-Token、 X-Vault-Token”。
ssrf_env_variables-
Secrets Manager 代理按顺序检查 SSRF 令牌的环境变量名称列表。环境变量可以包含令牌或对令牌文件的引用,如下所示:
AWS_TOKEN=file:///var/run/awssmatoken。默认值为 “AWS_TOKEN, AWS_SESSION_TOKEN、 AWS_CONTAINER_AUTHORIZATION_TOKEN”。 path_prefix-
用于确定请求是否为基于路径的请求的 URI 前缀。默认值为“/v1/”。
max_conn-
Secrets Manager 代理允许的来自 HTTP 客户端的最大连接数,范围在 1 到 1000 之间。默认值为 800。
max_roles-
同时进行跨账户访问的 IAM 角色的最大数量,范围在 1 到 20 之间。默认值为 20。有关更多信息,请参阅 使用角色链跨账户检索机密。
可选功能
通过将 --features 标志传递给 cargo build,可以使用可选功能构建 Secrets Manager 代理。可用功能如下:
生成功能
prefer-post-quantum-
使
X25519MLKEM768成为最高优先级的密钥交换算法。否则,该算法可用,但不是最高优先级。X25519MLKEM768是一种混合的、后量子安全的密钥交换算法。 fips-
将代理使用的密码套件限制为仅限密码。 FIPS-approved
日志记录
- 本地日志记录
-
Secrets Manager Agent 会 stdout/stderr根据
log_to_file配置变量将错误记录到本地文件logs/secrets_manager_agent.log或文件中。当应用程序调用 Secrets Manager 代理来获取密钥时,这些调用会显示在本地日志中。它们不会出现在 CloudTrail 日志中。 - 日志轮换
-
当文件达到 10 MB 时,Secrets Manager 代理会创建一个新的日志文件,并且总共最多存储五个日志文件。
- AWS 服务日志
-
日志不会转到 Secrets Manager CloudTrail、或 CloudWatch。从 Secrets Manager 代理获取密钥的请求不会出现在这些日志中。当 Secrets Manager 代理调用 Secrets Manager 获取密钥时,该呼叫将 CloudTrail 使用包含的用户代理字符串进行录音
aws-secrets-manager-agent。
您可以在 配置 Secrets Manager 代理 中配置日志记录选项。
安全注意事项
- 信任域
-
对于代理架构,信任域是代理终端节点和 SSRF 令牌可访问的位置,通常是整个主机。为了保持相同的安全状况,Secrets Manager 代理的信任域应与 Secrets Manager 凭证可用的域相匹配。例如,在 Amazon EC2 上,使用 Amazon EC2 角色时,Secrets Manager 代理的信任域将与凭证的域相同。
重要
对于尚未使用已锁定 Secrets Manager 凭据的代理解决方案,注重安全的应用程序应考虑使用特定于语言的 AWS SDK 或缓存解决方案。有关更多信息,请参阅获取密钥。