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 nos 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.
Para usar os exemplos de linha de comando neste guia, instale e configure a Google Cloud CLI.
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 de Acessador de secrets do Secret Manager (roles/secretmanager.secretAccessor
)
para o secret da conta de serviço do Cloud Build:
Abra a página do Secret Manager no console do Google Cloud:
Marque a caixa de seleção do secret que você quer usar no build.
Se ela ainda não estiver aberta, clique em Mostrar painel de informações para abrir o painel.
No painel, em Permissões, clique em Adicionar principal.
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.Na caixa suspensa Selecionar um papel, escolha Acessor do secret do Gerenciador de secrets.
Clique em Save.
Configurar builds para acessar secrets UTF-8 do Secret Manager
No diretório raiz do projeto, crie um arquivo de configuração do Cloud Build chamado
cloudbuild.yaml
oucloudbuild.json
.No arquivo de configuração de build:
- Após a criação de
steps
, adicione um campoavailableSecrets
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 camposecretVersion
. É 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 parabash
para usar a ferramenta bash na etapa de versão. É obrigatório para se referir à variável de ambiente da chave secreta. - Adicione um campo de
secretEnv
especificando a variável de ambiente. - No campo
args
, adicione uma sinalização-c
como primeiro argumento. Qualquer string que você passar depois de-c
será 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$$
.
- Adicione um campo
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 Google Cloud em que você armazenou as chaves secretas.DOCKER_USERNAME_SECRET_NAME
: o nome do secret correspondente ao seu nome de usuário do Docker. É possível encontrar o nome do secret na página do Secret Manager no console do Google Cloud.DOCKER_USERNAME_SECRET_VERSION
: a versão do secret do seu nome de usuário do Docker. Para conferir a versão do secret, clique em um nome dele na página do Secret Manager no console do Google Cloud.DOCKER_PASSWORD_SECRET_NAME
: o nome do secret correspondente à sua senha do Docker. É possível encontrar o nome do secret na página do Secret Manager no console do Google Cloud.DOCKER_PASSWORD_SECRET_VERSION
: a versão do secret da sua senha do Docker. Para conferir a versão do secret, clique em um nome dele na página do Secret Manager no console do Google Cloud.
- Após a criação de
Use o arquivo de configuração do build para iniciar um build usando a linha de comando ou automatizar builds usando gatilhos.
Exemplo: como acessar secrets de scripts e processos
O campo secretEnv
adiciona o valor do secret ao ambiente, e é possível acessar esse valor por meio da variável de ambiente a partir de scripts ou processos:
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"
}
]
}
}
O conteúdo a seguir de main.py
imprime os cinco primeiros caracteres do secret:
import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")
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:
- Crie um token do GitHub.
- Armazene o token do GitHub no Secret Manager.
- No arquivo de configuração de build, faça o seguinte:
- Após a criação de
steps
, adicione um campoavailableSecrets
para especificar a versão do secret e a variável de ambiente a ser usada para o token do GitHub. - Adicione uma etapa de versão para invocar o comando a fim de criar uma solicitação de envio do GitHub.
- Após a criação de
- Crie um acionador do app do GitHub e use o arquivo de configuração do build para invocar o gatilho.
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 Google 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 envio entre repositórios na mesma rede, o namespacehead
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;
Configurar builds para acessar secrets não UTF-8 do Secret Manager
No arquivo de configuração da versão, adicione uma etapa de versão para acessar a versão secreta no Gerenciador de secrets e armazená-la em um arquivo. A etapa de versão a seguir acessa secret-name e a armazena em um arquivo chamado 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" ] } ] }
Use o arquivo com os dados descriptografados em uma etapa de versão. O snippet de código a seguir usa decrypted-data.txt para fazer login em um registro particular do Docker:
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" ] } ] }
Use o arquivo de configuração do build para iniciar um build usando a linha de comando ou automatizar builds usando gatilhos.
A seguir
- Saiba como usar credenciais criptografadas em builds.
- Saiba como acessar repositórios GitHub particulares.