Como usar secrets do Secret Manager

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 em seus builds, é possível armazená-las no Gerenciador de secrets e, em seguida, configurar seu build 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 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 do IAM Acessador de Secret ao Gerenciador de Secrets (roles/secretmanager.secretAccessor) para o secret à 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 no build.

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

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

  5. Na caixa de texto Novos principais, 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 os builds. Encontre esse número na página de configurações do projeto.

  6. Na caixa suspensa Selecionar um papel, escolha Acessor do secret do Gerenciador de secrets.

  7. Clique em Save.

Como configurar builds para acessar o secret do Secret Manager

  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:

    • Após a criação de steps, adicione um campo availableSecrets para especificar a versão do secret e as variáveis de ambiente a serem usadas no secret. É possível incluir variáveis de substituição no valor do campo secretVersion. É possível especificar mais de um secret em uma versão.
    • Na etapa de versão em que você quer especificar o secret:
      • Adicione um campo entrypoint que aponte para bash para usar a ferramenta bash na etapa de versão. Isso é necessário para fazer referência à variável de ambiente do secret.
      • Adicione um campo de secretEnv especificando a variável de ambiente.
      • No campo args, adicione uma sinalização -c como primeiro argumento. Qualquer string transmitida após -c é tratada como um comando. Para mais informações sobre como executar comandos bash com -c, consulte a documentação do bash.
      • Ao especificar o secret no campo args, especifique-o usando a variável de ambiente prefixada com $$.

    O exemplo de arquivo de configuração de criação a seguir mostra como fazer login no Docker usando o nome de usuário e a senha do Docker armazenados no 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"
         }]
      }
    }
    

    Substitua os valores dos marcadores nos comandos acima pelo seguinte:

    • PROJECT_ID: o ID do projeto do Cloud em que você armazenou os secrets.
    • DOCKER_USERNAME_SECRET_NAME: o nome do secret correspondente ao seu nome de usuário do Docker. Encontre o nome do secret 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 acessar a versão do secret, clique no nome dele na página Gerenciador de secrets do Console do Cloud.
    • DOCKER_PASSWORD_SECRET_NAME: o nome do secret correspondente à sua senha do Docker. Encontre o nome do secret na página do Gerenciador de secrets no Console do Cloud.
    • DOCKER_PASSWORD_SECRET_VERSION: a versão do secret da sua senha do Docker. Para acessar a versão do secret, clique no nome dele na página Gerenciador de secrets do 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 as imagens do Docker, seu build precisaria ser autenticado no Docker. Por exemplo, a autenticação do Docker é necessária para que as versões extraiam imagens privadas e enviem imagens privadas ou públicas para o Docker Hub. Nesses casos, é possível armazenar o nome de usuário e a senha do Docker no Secret Manager e, em seguida, configurar o Cloud Build para acessar o nome de usuário e a senha do Secret Manager. Para instruções sobre como fazer isso, consulte Como interagir com imagens do Docker Hub.

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

Outro exemplo em que convém configurar seu build para acessar uma informação confidencial do Secret Manager é criar uma solicitação de envio do GitHub em resposta aos builds. Para fazer isso:

O exemplo de arquivo de configuração 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 os secrets.
  • 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 envio entre repositórios na mesma rede, o namespace head com um usuário como este: username:branch.
  • BASE_BRANCH: o nome da ramificação em que você quer receber as mudanças. Essa precisa ser uma ramificação existente no repositório atual. Não é possível enviar uma solicitação de envio para um repositório que solicita uma mesclagem a uma base de outro repositório.
  • GH_TOKEN_SECRET_NAME: o nome do secret correspondente ao seu token do GitHub.
  • NEW_PR: a nova solicitação de envio que você quer criar;

A seguir