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.
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:
Abra a página Secret Manager na Google Cloud consola:
Selecione a caixa de verificação do segredo que quer usar na sua compilação.
Se ainda não estiver aberto, clique em Mostrar painel de informações para o abrir.
No painel, em Autorizações, clique em Adicionar principal.
No campo Novos membros, introduza o endereço de email da sua conta de serviço.
Na caixa de menu pendente Selecionar uma função, selecione Secret Manager Secret Accessor.
Clique em Guardar.
Configurar compilações para aceder a segredos UTF-8 a partir do Secret Manager
No diretório raiz do projeto, crie um ficheiro de configuração do Cloud Build denominado
cloudbuild.yaml
oucloudbuild.json
.No ficheiro de configuração de compilação:
- Depois de todas as compilações
steps
, adicione um campoavailableSecrets
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 camposecretVersion
. 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 parabash
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$$
.
- Adicione um campo
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.
- Depois de todas as compilações
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 anavailableSecrets
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.
- After all the build
- 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 nomeshead
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
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" ] } ] }
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" ] } ] }
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?
- Saiba como usar credenciais encriptadas em compilações.
- Saiba como aceder a repositórios privados do GitHub.