将SSM参数安全地传递到CodeBuild项目中

问题描述 投票:0回答:1

我有一个带有buildspec的CodeBuild项目,该项目需要数据库密码值才能运行。我希望此buildspec与环境无关,但是每个环境都需要不同的数据库密码。每个环境的数据库密码值都在其自己的密钥下存储在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发送三个请求,这会使buildspec更加复杂。在我看来,这种方法不太理想。

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

从CodePipeline传递SSM参数

另一种方法是将密码从CodePipeline作为环境变量直接传递到CodeBuild项目。这将大大简化buildspec。但是从安全角度来看是否安全?

在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个回答
0
投票

使用CodeBuild的env.parameter-store

documentation,无法动态构造SSM参数密钥,并且为每个环境预加载参数是错误的。这将影响性能并对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",
          }]'
© www.soinside.com 2019 - 2024. All rights reserved.