首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全地将SSM参数传递给CodeBuild项目

安全地将SSM参数传递给CodeBuild项目
EN

Stack Overflow用户
提问于 2019-11-30 14:42:02
回答 1查看 4.7K关注 0票数 4

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

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

使用CodeBuild的env.parameter-store

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

代码语言:javascript
复制
# 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中使用环境变量来构造SSM密钥

从CodePipeline传递SSM参数

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

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

从脚本中手动调用SSM来加载所需的值是否更好?

代码语言:javascript
复制
# 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…"

这种方法会更安全吗?

EN

回答 1

Stack Overflow用户

发布于 2019-11-30 16:08:24

使用CodeBuild的env.parameter.参数-存储

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

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

我想这是可行的,但它将使脚本更加复杂,并将它与SSM参数存储更紧密地结合在一起,因为它需要了解SSM存储和密钥名结构。

从CodePipeline传递SSM参数

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

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

代码语言:javascript
复制
- 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"
          }]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59117170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档