Ajude a moldar o futuro da entrega de software e manifeste-se respondendo à pesquisa sobre o estado de DevOps 2202.

Como usar secrets do Gerenciador de secrets

Nesta página, explicamos como incluir informações confidenciais, como senhas e chaves de API, no Cloud Build.

O Gerenciador de secrets é um serviço do Google Cloud que armazena com segurança chaves de API, senhas e outros dados confidenciais. Para incluir informações confidenciais nas suas versões, é possível armazenar as informações no Gerenciador de secrets e, em seguida, configurar sua versão para acessar as informações do Gerenciador de secrets.

Antes de começar

  • Ative as APIs Cloud Build and Secret Manager.

    Ative as APIs

  • Para usar os exemplos de linha de comando deste guia, instale e configure o SDK do Cloud.

  • Verifique se você armazenou o secret no Gerenciador de secrets. Para ver instruções, consulte Como criar um secret.

    • Anote o nome e a versão do secret. Você precisará dessas informações para configurar o Cloud Build para acessar o secret.

Permissões do IAM obrigatórias

Conceda o papel de IAM do Secretador de secrets do Gerenciador de secrets (roles/secretmanager.secretAccessor) à chave secreta da conta de serviço do Cloud Build:

  1. Abra a página "Gerenciador de secrets" no Console do Google Cloud:

    Acessar a página "Gerenciador de secrets"

  2. Marque a caixa de seleção do secret que você quer usar na build.

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

  4. No painel, em Permissões, clique em Adicionar membro.

  5. Na caixa de texto Novos membros, insira o endereço de e-mail da sua conta de serviço do Cloud Build no formato PROJECT_NUMBER@cloudbuild.gserviceaccount.com. PROJECT_NUMBER é o número do projeto em que você está executando versões. É possível encontrar o número do projeto na página Configurações do projeto.

  6. Na caixa suspensa Selecionar um papel, selecione Acessador de secrets do Gerenciador de secrets.

  7. Clique em Save.

Como configurar builds para acessar o secret do Gerenciador de secrets

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

  2. No arquivo de configuração de build:

    • Em todas as versões steps, adicione um campo availableSecrets para especificar a versão do secret e as variáveis de ambiente a serem usadas na chave secreta. É possível incluir variáveis de substituição no valor do campo secretVersion. É possível especificar mais de um secret em uma criação.
    • Na etapa de criação em que você quer especificar o secret:
      • Adicione um campo entrypoint apontando para bash para usar a ferramenta bash na etapa de criação. Isso é necessário para consultar a variável de ambiente do secret.
      • Adicione um campo secretEnv especificando a variável de ambiente.
      • No campo args, adicione uma sinalização -c como o primeiro argumento. Qualquer string que você passa depois de -c é tratada como um comando. Para mais informações sobre como executar comandos bash com -c, consulte a documentação do bash (em inglês).
      • Ao especificar o secret no campo args, especifique-o usando a variável de ambiente com o prefixo $$.

    O exemplo de arquivo de configuração de versão a seguir mostra como fazer login no Docker usando o nome de usuário e a senha do Docker armazenados no Gerenciador de secrets.

    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"
         }]
      }
    }
    

    Substitua os valores dos marcadores nos comandos acima pelo seguinte:

    • PROJECT_ID: o ID do projeto do Cloud em que você armazenou as chaves secretas.
    • DOCKER_USERNAME_SECRET_NAME: o nome do secret correspondente ao nome de usuário do Docker. Você pode conseguir o nome secreto na página do Gerenciador de secrets no Console do Cloud.
    • DOCKER_USERNAME_SECRET_VERSION: a versão do secret do seu nome de usuário do Docker. Para ver a versão do secret, clique em um nome secreto na página Gerenciador de secrets no Console do Cloud.
    • DOCKER_PASSWORD_SECRET_NAME: o nome secreto correspondente à senha do Docker. Você pode conseguir o nome secreto na página do Gerenciador de secrets no Console do Cloud.
    • DOCKER_PASSWORD_SECRET_VERSION: a versão do secret da senha do Docker. Para ver a versão do secret, clique em um nome secreto na página Gerenciador de secrets no Console do Cloud.
  3. Use o arquivo de configuração de build para iniciar manualmente um build ou para automatizar builds usando acionadores.

Exemplo: autenticação no Docker

Em algumas situações, antes da interação com imagens do Docker, a criação precisa ser autenticada no Docker. Por exemplo, a autenticação do Docker é necessária para que as imagens extraiam imagens particulares e enviem imagens particulares ou públicas para o Docker Hub. Nesses casos, armazene seu nome de usuário e senha do Docker no Gerenciador de secrets e, em seguida, configure o Cloud Build para acessar o nome de usuário e a senha do Gerenciador de secrets. Para ver instruções sobre como fazer isso, consulte Como interagir com imagens do Docker Hub.

Exemplo: criação da solicitação de envio do GitHub

Outro exemplo em que convém configurar sua versão para acessar informações confidenciais do Gerenciador de secrets é criar uma solicitação de envio GitHub em resposta a versões. Para fazer isso:

O arquivo de configuração de exemplo a seguir mostra como criar uma solicitação de envio do GitHub usando o token do GitHub:

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 nos comandos acima pelo seguinte:

  • PROJECT_ID: o ID do projeto do Cloud em que você armazenou as chaves secretas.
  • GITHUB_USERNAME: o nome de usuário do GitHub do proprietário do repositório;
  • REPO_NAME: o nome do repositório do GitHub.
  • HEAD_BRANCH: o nome da ramificação em que as alterações são implementadas. Para solicitações de pull entre repositórios na mesma rede, use head como namespace de um usuário como username:branch.
  • BASE_BRANCH: o nome da ramificação em que as alterações serão extraídas. Ela precisa ser uma ramificação existente no repositório atual. Não é possível enviar uma solicitação de envio a um repositório que solicite uma mesclagem a uma base de outro repositório.
  • GH_TOKEN_SECRET_NAME: o nome secreto correspondente ao token do GitHub.
  • NEW_PR: a nova solicitação de envio que você quer criar.

A seguir