spring 启动 + 从不同的 AWS 账户加载秘密管理器秘密

spring boot + load secret manager secrets from different AWS account

我正在开发一个新的 Spring 引导应用程序,它将与 AWS-Postgres 数据库交互。无服务器数据库托管在不同的 AWS 账户中,其机密存储在 Secretmanager 中。

如何从跨账户秘密管理器有效地获取数据库凭据?

在 POC 中,我通过使用 STSAssumeRoleSessionCredentials 构建一个秘密管理器客户端来做到这一点

AWSSecretsManager awsSecretsManager = AWSSecretsManagerClientBuilder.standard()
                .withCredentials(credentialsProvider). // AssumeRole ( cross account session token)
                .withRegion("us-west-2")
                .build();

我执行了以下步骤来解决用例,但我认为这不是一个干净的解决方案。

  1. 获取的凭据
  2. 使用上述数据库凭据填充环境变量
  3. 让spring-boot/jpa设置数据库连接

我认为可以使用 spring-cloud-starter-aws-secrets-manager-config 解决这个问题,但没有找到任何 example/reference 关于如何配置它以便它可以从不同 AWS 账户中的 SecretManager 获取凭证的信息。

以上方法如何工作,或者有更好的解决方案吗?

你说得对,代码方面可以进一步简化。

假设 accountA 有秘密,而 accountB 是您的应用程序帐户。当前实施执行以下操作:

  • 使用 accountA 凭据在 accountB 中创建了一个客户端(遵循 AssumeRole 并且是最佳实践)
  • 秘密被获取然后使用。

可以做什么:

  • 在 accountA 中使用基于资源的策略,让 IAM 用户 and/or accountB 中的 IAM 角色可以访问 accountA 中的秘密。
  • 为用于 encrypt/decrypt 机密的密钥更新 accountA 中的 KMS 密钥策略。让同一个 IAM 用户 and/or 角色有权访问该 KMS 密钥。以便他们可以使用它。
  • 更新 IAM 用户的 IAM 策略 and/or accountB 中的角色,明确允许其使用 accountA 的秘密和 KMS 密钥。

现在,您可以使用用于该应用程序的同一 IAM User/Role 访问机密,理论上 spring-cloud-starter-aws-secrets-manager-config 也应该从 accountA 获取机密(我还没有测试过)为我自己)。

您将获得的最少好处是不会为不同的帐户创建 assumedRole 客户端。 More details on AWS Blog