Use segredos do Secret Manager

Esta página explica como incluir informações confidenciais, como palavras-passe e chaves de API no Cloud Build.

O Secret Manager é um Google Cloud serviço que armazena em segurança chaves de API, palavras-passe e outros dados confidenciais. Para incluir informações confidenciais nas suas compilações, pode armazenar as informações no Secret Manager e, em seguida, configurar a compilação para aceder às informações a partir do Secret Manager.

Antes de começar

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  • Para usar os exemplos de linhas de comando neste guia, instale e configure a CLI Google Cloud.

  • Certifique-se de que armazenou o segredo no Secret Manager. Para ver instruções, consulte o artigo Criar um segredo.

    • Anote o nome e a versão do segredo. Precisa destas informações para configurar o Cloud Build para aceder ao segredo.

Autorizações de IAM necessárias

Conceda a função do IAM Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) para o segredo à conta de serviço que está a usar para a compilação:

  1. Abra a página Secret Manager na Google Cloud consola:

    Aceda à página Secret Manager

  2. Selecione a caixa de verificação do segredo que quer usar na sua compilação.

  3. Se ainda não estiver aberto, clique em Mostrar painel de informações para o abrir.

  4. No painel, em Autorizações, clique em Adicionar principal.

  5. No campo Novos membros, introduza o endereço de email da sua conta de serviço.

  6. Na caixa de menu pendente Selecionar uma função, selecione Secret Manager Secret Accessor.

  7. Clique em Guardar.

Configurar compilações para aceder a segredos UTF-8 a partir do Secret Manager

  1. No diretório raiz do projeto, crie um ficheiro de configuração do Cloud Build denominado cloudbuild.yaml ou cloudbuild.json.

  2. No ficheiro de configuração de compilação:

    • Depois de todas as compilações steps, adicione um campo availableSecrets para especificar a versão secreta e as variáveis de ambiente a usar para o seu segredo. Pode incluir variáveis de substituição no valor do campo secretVersion. Pode especificar mais do que um segredo numa compilação.
    • No passo de compilação onde quer especificar o segredo:
      • Adicione um campo entrypoint que aponte para bash para usar a ferramenta bash no passo de compilação. Isto é obrigatório para fazer referência à variável de ambiente do segredo.
      • Adicione um campo secretEnv que especifique a variável de ambiente.
      • No campo args, adicione uma flag -c como o primeiro argumento. Qualquer string que passe após -c é tratada como um comando. Para mais informações sobre a execução de comandos bash com o -c, consulte a documentação do bash.
      • Quando especificar o segredo no campo args, especifique-o através da variável de ambiente com o prefixo $$.

    The following example build config file shows how to login to Docker using the Docker username and password stored in Secret Manager.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Replace the placeholder values in the above commands with the following:

    • PROJECT_ID: The ID of the Google Cloud project where you've stored your secrets.
    • DOCKER_USERNAME_SECRET_NAME: The secret name corresponding to your Docker username. You can get the secret name from the Secret Manager page in the Google Cloud console.
    • DOCKER_USERNAME_SECRET_VERSION: The secret version of your Docker username. You can get the secret version by clicking on a secret name on the Secret Manager page in the Google Cloud console.
    • DOCKER_PASSWORD_SECRET_NAME: The secret name corresponding to your Docker password. You can get the secret name from the Secret Manager page in the Google Cloud console.
    • DOCKER_PASSWORD_SECRET_VERSION: The secret version of your Docker password. You can get the secret version by clicking on a secret name on the Secret Manager page in the Google Cloud console.
  3. Use the build config file to start a build using the command line or to automate builds using triggers.

Example: Accessing secrets from scripts and processes

secretEnv field adds the value of the secret to the environment and you can access this value via environment variable from scripts or processes:

YAML

steps:
- name: python:slim
  entrypoint: python
  args: ['main.py']
  secretEnv: ['MYSECRET']
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
    env: 'MYSECRET'

JSON

{
  "steps": [
  {
    "name": "python:slim",
    "entrypoint": "python",
    "args": [
        "main.py"
    ],
    "secretEnv": [
        "MYSECRET"
    ]
}
],
"availableSecrets": {
  "secretManager": [
    {
        "versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
        "env": "MYSECRET"
    }
  ]
}
}

The following contents of main.py prints the first five characters of the secret:

import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")

Example: authenticating to Docker

In some situations, before interacting with Docker images, your build would need to authenticate to Docker. For example, Docker authentication is required for builds to pull private images and push private or public images to Docker Hub. In these cases, you can store your Docker username and password in Secret Manager and then configure Cloud Build to access the username and password from Secret Manager. For instructions on doing this see Interacting with Docker Hub images.

Example: GitHub pull request creation

Another example where you might want to configure your build to access a sensitive information from Secret Manager is for creating a GitHub pull request in response to builds. To do this:

  • Create a GitHub token.
  • Store the GitHub token in Secret Manager.
  • In your build config file:
    • After all the build steps, add an availableSecrets field to specify the secret version and the environment variable to use for the GitHub token.
    • Add a build step to invoke the command to create a GitHub pull request.
  • Create a GitHub app trigger and use the build config file to invoke the trigger.

The following example config file shows how to create a GitHub pull request using the GitHub token:

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

Substitua os valores dos marcadores de posição nos comandos acima pelo seguinte:

  • PROJECT_ID: o ID do Google Cloud projeto onde armazenou os seus segredos.
  • GITHUB_USERNAME: O nome de utilizador do GitHub do proprietário do repositório.
  • REPO_NAME: o nome do repositório do GitHub.
  • HEAD_BRANCH: o nome da filial onde as alterações são implementadas. Para pedidos de obtenção entre repositórios na mesma rede, use o espaço de nomes head com um utilizador como este: username:branch.
  • BASE_BRANCH: O nome da ramificação para a qual quer transferir as alterações. Deve ser um ramo existente no repositório atual. Não pode enviar um pedido de envio para um repositório que solicite uma união a uma base de outro repositório.
  • GH_TOKEN_SECRET_NAME: o nome do segredo correspondente ao seu token do GitHub.
  • NEW_PR: o novo pedido de obtenção que quer criar.

Configurar compilações para aceder a segredos não UTF-8 a partir do Secret Manager

  1. No ficheiro de configuração de compilação, adicione um passo de compilação para aceder à versão secreta no Secret Manager e armazene-a num ficheiro. O seguinte passo de compilação acede a secret-name e armazena-o num ficheiro denominado decrypted-data.txt:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt"
        ]
      }
      ]
    }
    
  2. Use o ficheiro com os dados descifrados num passo de compilação. O fragmento do código seguinte usa decrypted-data.txt para iniciar sessão num registo do Docker privado:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    - name: gcr.io/cloud-builders/docker
      entrypoint: 'bash'
      args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt"
         ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=my-user --password-stdin < decrypted-data.txt"
         ]
      }
      ]
    }
    
  3. Use o ficheiro de configuração de compilação para iniciar uma compilação através da linha de comandos ou para automatizar compilações através de acionadores.

O que se segue?