在 AWS CodePipeline 中处理 运行 时间和构建时间机密

Handling run time and build time secrets in AWS CodePipeline

我们正在处理为使用 AWS CodePipeline 构建并部署到 ECS 的应用程序提供构建时间和 运行 时间机密的问题。

最终,我们的愿景是为我们的每个应用程序创建一个通用管道,以实现以下目标:

这里是手头的问题:

还有一些注意事项:

我们考虑过使用 credstash 等工具来帮助管理凭据。此解决方案要求 CodeBuild 和 ECS 任务实例都能够使用 AWS CLI。为了避免混用更多凭证,我们决定最好将特权角色分配给需要使用 AWS CLI 的实例。这样,CLI 可以从实例元数据

中的角色推断凭据

鉴于这些限制,我们已尝试设计一种方法来管理我们的秘密。对于每个应用程序,我们创建一个管道。使用 Cloudformation 模板,我们创建:

CodePipeline 的 CodeBuild 步骤采用 CodeBuildRole 以允许它从凭证 table 中读取构建时间机密。 CodeBuild 然后构建项目并生成一个 Docker 图像,并将其推送到 ECR。最终,部署步骤使用 Cloudformation 模板和项目 public 存储库中随附的参数文件创建 ECS 服务 ECS 任务定义包括假定 ECSTaskRole 以允许任务从中读取 运行 时间机密凭据 table 并从 ECR 中提取所需的图像。

Here is a simple diagram of the AWS resources and their relationships as stated above

我们目前提出的解决方案存在以下问题:

在 CodePipeline 中是否有更完善的方法来传递我们可能忽略的秘密,或者这是我们能得到的最好的方法?

在较高级别,您可以将应用程序隔离在具有精细权限的单个 AWS 帐户中(这听起来像您正在尝试做的事情)或使用多个 AWS 帐户。两者本身都没有对错,但我更倾向于使用单独的 AWS 账户而不是管理精细权限,因为你的起点是完全隔离。

三个想法:

AWS Secret ManagerAWS Secrets Manager 帮助您保护秘密以访问应用程序、服务和 IT 资源。您可以在整个生命周期内轮换、管理和检索数据库凭据、API 密钥和其他秘密。

AWS Parameter Store 可以通过精细访问保护访问密钥。这种访问可以基于 ServiceRoles。

ECS 通过此模式提供对 ServiceRole 的访问:

build:
    commands:
      - curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq 'to_entries | [ .[] | select(.key | (contains("Expiration") or contains("RoleArn"))  | not) ] |  map(if .key == "AccessKeyId" then . + {"key":"AWS_ACCESS_KEY_ID"} else . end) | map(if .key == "SecretAccessKey" then . + {"key":"AWS_SECRET_ACCESS_KEY"} else . end) | map(if .key == "Token" then . + {"key":"AWS_SESSION_TOKEN"} else . end) | map("export \(.key)=\(.value)") | .[]' -r > /tmp/aws_cred_export.txt
      - chmod +x /tmp/aws_cred_export.txt 
      - /aws_cred_export.txt && YOUR COMMAND HERE

如果您提供给 CodeBuild 任务的 ServiceRole 有权使用参数存储密钥,您就可以开始了。

狩猎愉快,希望对您有所帮助