在Hitcorp管道上使用Hashicorp Vault的最佳方法是什么?

时间:2019-07-07 01:06:48

标签: gitlab gitlab-ci hashicorp-vault

假设我要使用Vault中的值创建一个变量。

Widget build(BuildContext context) {
    Unit.initialize();
    return Provider<AuthService>(
        builder: (_) => Auth(),
        dispose: (_, AuthService authService) => authService.dispose(),
        child: new MaterialApp(
            title: 'MyCoolApp',
            debugShowCheckedModeBanner: false,
            theme: new ThemeData(
              primarySwatch: Colors.blue,
            ),
            home: new RootPage()));
  }

有可能吗?

还有另一种在管道内使用保险柜秘密的方法吗?

2 个答案:

答案 0 :(得分:2)

我们在构建器映像中添加了一个辅助脚本,该脚本可以将指向机密的GitLab CI / CD作业变量转换为包含Vault机密的作业环境变量。在我们的案例中,我们还使用appRole auth方法来限制临时保险柜访问令牌的有效性。

一个用例示例是:

I want a job env var "MY_SECRET_TOKEN" with a value from a Vault secret.
So I add a CI/CD variable called V_MY_SECRET_TOKEN="secret/<path>/<key>"
Then I insert a job step to retrieve the secret value and populate
  the MY_SECRET_TOKEN with the value associated with the key.

变量已添加到GitLab中的CICD作业设置中。

VAULT_ADDR=https://vault.example.com:8200
VAULT_ROLE_ID=db02de05-fa39-4855-059b-67221c5c2f63
VAULT_SECRET_ID=6a174c20-f6de-a53c-74d2-6018fcceff64
VAULT_VAR_FILE=/var/tmp/vault-vars.sh

添加到.gitlab-ci.yml作业定义中的步骤。

script:
  - get-vault-secrets-by-approle > ${VAULT_VAR_FILE}
  - source ${VAULT_VAR_FILE} && rm ${VAULT_VAR_FILE}

这里是对我们使用的get-vault-secrets-by-approle帮助脚本的引用。
这里是thinking behind the design的摘要。

'before_script'选项不适合我们的工作流程,因为我们在gitlab-ci.yml定义中定义了特权和非特权阶段的组合。非特权作业将生成并进行质量检查代码,而特权作业将打包并释放代码。 VAULT_ROLE_ID和VAULT_SECRET_ID作业变量仅对特权打包和释放作业可见。

我还尝试了使用include,extend和yaml锚,但是我想将项目合并到现有的yaml映射(script: {}before_script: {})中,而不是将地图中的所有项目替换为模板。

答案 1 :(得分:1)

您可以在脚本之前/之后看到它,并在末尾使用已撤销的令牌。
参见gitlab.eng.cleardata.com pub/pipelines/gcp-ci.yml作为示例:

# Obtains credentials via vault (the gitlab-runner authenticates to vault using its AWS credentials)
# Configures the `gcloud` sdk and `kubectl` to authenticate to our *production* cluster
#
# Note: Do not override the before_script or the after_script in your job
#
.auth-prod: &auth-prod
  image: cleardata/bionic
  before_script:
    - |
      export CLUSTER_NAME=production
      export CLUSTER_LOCATION=us-central1
      export CLUSTER_PROJECT_ID=cleardata-production-cluster
    - vault login -method=aws -path=gitlab-ci -no-print header_value=gitlab.eng.cleardata.com
    - GCP_CREDS=$(vault read -field=private_key_data gitlab-ci/gcp/cleardata-production-cluster/key/deployment-key)
    - gcloud auth activate-service-account --key-file=<(base64 -d <<<$GCP_CREDS)
    - gcloud auth configure-docker
    - gcloud beta container clusters get-credentials $CLUSTER_NAME --region $CLUSTER_LOCATION --project $CLUSTER_PROJECT_ID
  after_script:
    - vault token revoke -self