【问题标题】:Passing SSM parameters to CodeBuild project securely将 SSM 参数安全地传递给 CodeBuild 项目
【发布时间】:2020-03-25 18:46:15
【问题描述】:

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

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

使用 CodeBuild 的 env.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 发出三个请求,这会使构建规范更加复杂。这种方法在我看来不是最理想的。

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

从 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…"

这种方法会更安全吗?

【问题讨论】:

    标签: amazon-web-services environment-variables aws-codepipeline aws-codebuild ssm


    【解决方案1】:

    使用 CodeBuild 的 env.parameter-store

    documentation,没有办法动态构造SSM参数key,为每个环境预加载参数就错了。这会影响性能并对 API 速率限制产生负面影响,并使安全审计更加困难。

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

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

    从 CodePipeline 传递 SSM 参数

    查看documentation 有一个特定的环境变量类型称为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"
              }]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多