问题标签 [aws-secrets-manager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
amazon-web-services - AWS Secrets Manager and Cloud Formation - can not create secret because it already exists
I have a CF template with a simple secret inside, like this:
The stack is created successfully and the secret is correctly generated.
However when I delete the stack and recreate it again I get the following error message:
The operation failed because the secret pk.stage.compid.credentials already exists. (Service: AWSSecretsManager; Status Code: 400; Error Code: ResourceExistsException; Request ID: ###)
I guess this is because the secret is not really deleted but only marked for deletion for x days.
It is possible to delete a secret immediately via CLI, but how can this be done within the CF Template?
I need to delete and recreate the stacks because it is part of a continous integration/delivery pipeline which is automatically triggered on source code commits.
amazon-web-services - 使用开放连接在 AWS 中轮换 RDS 密钥
如果在与 RDS 的连接当前打开时轮换机密,该连接是否仍能够查询数据库,还是会变为非活动状态?
amazon-cloudformation - 在 Cloudformation 中使用 AWS Secrets manager 的 Secret
我想将 read_only_user 的密码导出到 EC2 实例。如何访问 UserData 中创建的密码?
我尝试使用 !Join 但当然这不起作用。我将非常感谢这里的任何帮助。
更新:
通过如上所示更改代码,我确实得到了解析字符串,但它没有给我实际的密码。如何解决 arn 以获取纯密码?
encryption - 如何实现零停机密钥轮换
我在 AWS 中运行了几个微服务,其中一些相互通信,其中一些具有外部客户端或作为外部服务的客户端。
为了实现我的服务,我需要一些秘密(用于签名/验证令牌的 RSA 密钥对、对称密钥、API 密钥等)。我为此使用 AWS SecretsManager,它工作正常,但我现在正在实施对密钥轮换的适当支持,我有一些想法。
- 我正在使用 AWS SecretsManager,定期(约 5 分钟)获取秘密并在本地缓存它们。
- 我正在使用 AWS SecretsManager 的版本阶段功能来根据需要引用 AWSCURRENT 和 AWSPREVIOUS 版本。
假设服务 A 需要服务 B 的密钥 K:
- 假设在开始时,K 具有当前值 K1 和先前值 K0。
- 服务 A 将始终使用(并在本地缓存)K 的 AWSCURRENT 版本与 B 通信,因此在本例中为 K1
- 服务 B 将 AWSCURRENT 和 AWSPREVIOUS 版本保留在其本地缓存中并同时接受 [K1, K0]
- 在轮换 K 时,我首先确保服务 B 使用的密钥被轮换,这样在刷新间隔过去后,服务 B 的所有实例都接受 [K2, K1] 而不是 [K1, K0]。在刷新间隔过去之前,A 的所有实例仍然使用 K1。
- 当刷新间隔过去时,意味着 B 的所有实例都必须获取 K2,我轮换密钥以进行服务,以便 A 将使用 K1 或 K2,直到刷新间隔结束,然后只使用 K2。
- 这样就完成了密钥轮换(但如果认为 K1 被泄露,我们可以再次轮换 B 的密钥以推出 K1 并得到 [K3, K2])。
这是最好的方法还是有其他需要考虑的?
然后,在某些情况下,我有一个在同一服务中使用的对称密钥 J,例如用于加密某些会话的密钥。因此,在对服务 C 的一次请求中,会话使用密钥 J1 加密,然后需要在稍后阶段使用 J1 解密。我有多个 C 服务实例。
这里的问题是,如果相同的秘密用于加密和解密,旋转它会变得更加混乱 - 如果密钥旋转到具有值 J2 并且一个实例已刷新以便它将使用 J2 加密,而另一个实例仍然看不到J2,解密会失败。
我可以在这里看到一些方法:
用不同的轮换方案分成两个秘密,一次轮换一个,类似于上面。这增加了要处理的额外秘密的开销,具有相同的值(除了它们之间有一段时间轮换)
让解密在失败时强制刷新秘密:
- 加密始终使用 AWSCURRENT(J1 或 J2 取决于是否刷新)
- 解密将尝试 AWSCURRENT 然后 AWSPREVIOUS,如果两者都失败(因为使用 J2 和 [J1, J0] 存储的另一个实例的加密)将请求手动刷新密钥(现在存储 [J2, J1]),然后尝试AWSCURRENT 和 AWSPREVIOUS 再次。
在密钥窗口中使用三个密钥并始终使用中间的一个进行加密,因为它应该始终位于所有其他实例的窗口中(除非它被旋转了几次,比刷新间隔快)。这增加了复杂性。
还有哪些其他选择?这似乎是一个标准用例,但我仍然努力寻找最佳方法。
编辑 - - - - - - - - -
根据 JoeB 的回答,到目前为止我提出的算法是这样的:假设最初秘密的当前值为 K1,而 PENDING 值为 null。
普通手术
- 所有服务定期(每 T 秒)查询 SecretsManager
AWSCURRENT
和AWSPENDING
自定义标签ROTATING
并全部接受(如果存在)-> 所有服务接受 [AWSCURRENT
=K1] - 所有客户端都使用
AWSCURRENT
=K1
密钥轮换
- 为 PENDING 阶段设置一个新值 K2
- 等待 T 秒 -> 现在所有服务都接受 [
AWSCURRENT
=K1,AWSPENDING
=K2] - 添加
ROTATING
到 K1 版本 + 移动AWSCURRENT
到 K2 版本 +AWSPENDING
从 K2 中删除标签(似乎没有标签的原子交换)。直到 T 秒过去,一些客户端将使用 K2 和一些 K1,但所有服务都接受两者 - 等待 T 秒 -> 所有服务仍然接受 [
AWSCURRENT
=K2,AWSPENDING
=K1] 并且所有客户端使用AWSCURRENT
=K2 ROTATING
从 K1移除舞台。请注意,K1 仍然有AWSPREVIOUS
舞台。- T 秒后,所有服务将只接受 [
AWSCURRENT
=K2],K1 有效死亡。
这应该适用于单独的秘密和用于加密和解密的对称秘密。
不幸的是,我不知道如何为此使用内置的旋转机制,因为它需要几个步骤,中间有延迟。一个想法是发明一些自定义步骤并让该setSecret
步骤创建一个 CloudWatch cron 事件,该事件将在 T 秒后再次调用该函数,并使用 stepsswapPending
和调用它removePending
。如果 SecretsManager 可以自动支持这一点,那就太棒了,例如通过支持函数返回一个值,指示应该在 T 秒后调用下一步。
amazon-web-services - 检索 AWS SM 机密并导出到容器环境变量
任何人都可以建议从 Dockerfile 检索 AWS secrets-manager 机密并将机密值作为环境变量在 Docker 运行后发送到 Docker 容器的最佳方法。
我问这个问题的原因是,我试图删除在 git 代码存储库的不同位置硬编码的所有敏感密码信息,并将密码移动到 AWS secrets-manager。
amazon-ecs - 我可以在 ECS 任务定义中获取特定版本的 Secrets Manager 密钥吗?
我使用 AWS Secrets Manager 存储了一个密钥。我正在尝试将密钥作为环境变量检索到 ECS 任务定义中。
在docs之后,我创建了一个 ECS 任务定义,其中包括以下部分:
据我了解,当我的任务开始时,这是:
my_password
从 Secrets Manager获取最新版本的密钥- 在任务中解密它
- 将其分配给环境变量
MY_PASSWORD
我想在我的任务定义中加载特定版本的秘密,因此更改秘密意味着创建一个新的任务定义。
我可以这样做吗?
我在谷歌上搜索过,但找不到其他人试图这样做。
我尝试将版本 ID 附加到valueFrom
参数,即
但这有一个错误:
为密钥 es_username 指定的 Systems Manager 参数名称无效。参数名称最长为 2048 个字符,包括以下字母和符号:a-zA-Z0-9_.-、
mule - 在 1 次调用中检索多个 AWS 机密管理器
我在 aws secret manager 中存储了 3 个以上的秘密,并且想一次为我的应用程序检索 2 个秘密。调用 getSecretValue() 一次只能返回 1 个密钥的结果。您能否建议如何通过单个函数调用从 aws 秘密管理器中检索多个秘密?
asynchronous - AWS Lambda:异步调用外部处理程序(初始化部分,调用 lambda)
我想通过以下代码在 lambda 处理程序之外调用一个异步函数:
'client' 没有被初始化。如果在处理程序中执行相同的代码,则可以完美运行。initSecrets 包含调用 AWS SecretsManager 的 getSecrets() 的 lambda 调用有没有人知道如何在处理程序之外正确调用异步函数以进行初始化?
非常感谢您的支持。
node.js - NodeJs 无法回调 AWS Secrets Manager 响应
我正在尝试使用 AWS Secrets Manager 获取我的 RDS 凭证,
Secrets Manager SDK 能够正确获取 Secret,
但我无法将其导出回我的调用文件。
我有 2 个文件 -
1. index.js -
2.secrets-manager.js -
我觉得我在 Node 方面犯了一些错误,
这就是为什么回调无法正常工作
的原因,Lambda 超时,
并且日志在 creds 变量中没有显示任何内容 -