3

我有一个带有构建规范的 CodeBuild 项目,该项目需要数据库密码值才能运行。我希望这个构建规范与环境无关,但每个环境都需要不同的数据库密码。每个环境的数据库密码值都存储在它自己的密钥下的 SSM 存储中。

在这种情况下,将数据库密码传递给 CodeBuild 项目的更好方法是什么?

使用 CodeBuildenv.parameter-store

似乎推荐的方法是使用 CodeBuild 的内置解决方案 ( env.parameter-store),但是我必须为每个环境加载密码,然后在构建脚本中选择一个密码:

# Supported Variables
#---------------------
# - ENVIRONMENT
#

version: 0.2

env:
  parameter-store:
    DB_PASSWORD_PROD: "/acme/prod/DB_PASSWORD"
    DB_PASSWORD_STAGE: "/acme/stage/DB_PASSWORD"
    DB_PASSWORD_QA: "/acme/qa/DB_PASSWORD"

phases:
  build:
    commands:
      - |-
        case "${ENVIRONMENT}" in
         "prod") DB_PASSWORD="${DB_PASSWORD_PROD}" ;;
         "stage") DB_PASSWORD=${DB_PASSWORD_STAGE} ;;
         "qa") DB_PASSWORD=${DB_PASSWORD_QA} ;;
        esac
      - echo "Doing something with \$DB_PASSWORD…"

这将需要向 SSM 发出三个请求,这会使 buildspec 更加复杂。这种方法对我来说似乎不是最理想的。

也许有一种方法可以使用 ENVIRONMENT 变量以某种方式构造 SSM 密钥env.parameter-store

从 CodePipeline 传递 SSM 参数

另一种方法是将密码从 CodePipeline 作为环境变量直接传递给 CodeBuild 项目。这将大大简化构建规范。但是从安全的角度来看它安全吗?

在 CodeBuild 脚本中手动获取 SSM 参数

手动从脚本中调用 SSM 以加载所需的值会更好吗?

# Supported Variables
#---------------------
# - ENVIRONMENT
#

version: 0.2

phases:
  build:
    commands:
      - >-
        DB_PASSWORD=$(
          aws ssm get-parameter
          --name "/acme/${ENVIRONMENT}/DB_PASSWORD"
          --with-decryption
          --query "Parameter.Value"
          --output text
        )
      - echo "Doing something with \$DB_PASSWORD…"

这种方法会更安全吗?

4

1 回答 1

4

使用 CodeBuild 的 env.parameter-store

查看文档,没有办法为每个环境动态构造 SSM 参数键和预加载参数是错误的。这会影响性能并对 API 速率限制产生负面影响,并使安全审计更加困难。

在 CodeBuild 脚本中手动获取 SSM 参数

我想这可能会起作用,但它会使脚本更复杂,并且还会更紧密地将它与 SSM 参数存储耦合,因为它需要了解 SSM 存储和键名结构。

从 CodePipeline 传递 SSM 参数

查看文档有一个特定的环境变量类型称为PARAMETER_STORE. 这允许在调用 CodeBuild 构建项目之前从 SSM 参数存储中获取值。

我相信这是实现预期结果的最干净的方法,它不应该以负面方式影响安全性,因为参数只能由 CodePipeline 在构建项目调用时解决:

- Name: stage-stage
  Actions:
    - Name: stage-stage-action
      RunOrder: 1
      ActionTypeId:
        Category: Build
        Provider: CodeBuild
        Owner: AWS
        Version: "1"
      Configuration:
        ProjectName: !Ref BuildProject
        EnvironmentVariables: |-
          [{
            "type":"PARAMETER_STORE",
            "name":"DB_PASSWORD",
            "value":"/acme/stage/DB_PASSWORD"
          }]

- Name: prod-stage
  Actions:
    - Name: prod-stage-action
      RunOrder: 1
      ActionTypeId:
        Category: Build
        Provider: CodeBuild
        Owner: AWS
        Version: "1"
      Configuration:
        ProjectName: !Ref BuildProject
        EnvironmentVariables: |-
          [{
            "type":"PARAMETER_STORE",
            "name":"DB_PASSWORD",
            "value":"/acme/prod/DB_PASSWORD"
          }]

- Name: qa-stage
  Actions:
    - Name: qa-stage-action
      RunOrder: 1
      ActionTypeId:
        Category: Build
        Provider: CodeBuild
        Owner: AWS
        Version: "1"
      Configuration:
        ProjectName: !Ref BuildProject
        EnvironmentVariables: |-
          [{
            "type":"PARAMETER_STORE",
            "name":"DB_PASSWORD",
            "value":"/acme/qa/DB_PASSWORD"
          }]
于 2019-11-30T16:08:24.923 回答