En esta página, se explica cómo incluir información sensible, como contraseñas y claves de API en Cloud Build.
Secret Manager es un servicio de Google Cloud que almacena de manera segura claves de API, contraseñas y otros datos sensibles. Para incluir información sensible en tus compilaciones, puedes almacenarla en Secret Manager y, luego, configurar tu compilación a fin de acceder a ella.
Antes de comenzar
-
Enable the Cloud Build and Secret Manager APIs.
Para usar los ejemplos de la línea de comandos de esta guía, instala y configura Google Cloud CLI.
Asegúrate de haber almacenado el secreto en Secret Manager. Para obtener instrucciones, consulta Crea un secreto.
- Anota el nombre y la versión del secreto de tu secreto. Necesitarás esta información para configurar Cloud Build a fin de acceder al secreto.
Permisos de IAM obligatorios
Otorga la función de IAM Descriptor de acceso a secretos de Secret Manager (roles/secretmanager.secretAccessor
) para el secreto a la cuenta de servicio de Cloud Build:
Abre la página Secret Manager en la consola de Google Cloud:
Selecciona la casilla de verificación del secreto que deseas usar en tu compilación.
Si aún no está abierto, haz clic en Mostrar panel de información para abrir el panel.
En el panel, en Permisos, haz clic en Agregar principal.
En el cuadro de texto Principales nuevas, ingresa la dirección de correo electrónico de tu cuenta de servicio de Cloud Build con el formulario
PROJECT_NUMBER@cloudbuild.gserviceaccount.com
.PROJECT_NUMBER
es el número del proyecto en el que ejecutas compilaciones. Puedes encontrar el número de proyecto en la página de configuración del proyecto.En el cuadro desplegable Selecciona un rol, selecciona Acceso a secretos de Secret Manager.
Haz clic en Guardar.
Configura compilaciones para acceder a secretos UTF-8 desde Secret Manager
En el directorio raíz del proyecto, crea un archivo de configuración de compilación de Cloud llamado
cloudbuild.yaml
ocloudbuild.json
.En el archivo de configuración de compilación:
- Después de todos los
steps
de compilación, agrega un campoavailableSecrets
para especificar la versión del secreto y las variables de entorno que se usarán en él. Puedes incluir variables de sustitución en el valor del camposecretVersion
. Puedes especificar más de un secreto en una compilación. - En el paso de compilación en el que deseas especificar el secreto:
- Agrega un campo
entrypoint
que apunte abash
para usar la herramienta bash en el paso de compilación. Este es obligatorio para hacer referencia a la variable de entorno del secreto. - Agrega un campo
secretEnv
que especifique la variable de entorno. - En el campo
args
, agrega una marca-c
como primer argumento. Cualquier string que pases después de-c
se trata como un comando. Para obtener más información sobre cómo ejecutar comandos Bash con-c
, consulta la documentación de Bash. - Cuando especifiques el secreto en el campo
args
, especifícalo con la variable de entorno con el prefijo$$
.
- Agrega un campo
En el siguiente ejemplo de archivo de configuración de compilación, se muestra cómo acceder a Docker con el nombre de usuario y la contraseña de Docker almacenados en 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" }] } }
Reemplaza los valores de marcador de posición en los comandos anteriores por la siguiente información:
PROJECT_ID
: El ID del proyecto de Google Cloud en el que almacenaste tus secretos.DOCKER_USERNAME_SECRET_NAME
: Es el nombre secreto correspondiente a tu nombre de usuario de Docker. Puedes obtener el nombre del Secret en la página Secret Manager de la consola de Google Cloud.DOCKER_USERNAME_SECRET_VERSION
: Es la versión del secreto de tu nombre de usuario de Docker. Para obtener la versión del secreto, haz clic en el nombre de un secreto en la página Secret Manager de la consola de Google Cloud.DOCKER_PASSWORD_SECRET_NAME
: Es el nombre del secreto correspondiente a tu contraseña de Docker. Puedes obtener el nombre del Secret en la página Secret Manager de la consola de Google Cloud.DOCKER_PASSWORD_SECRET_VERSION
: Es la versión del secreto de tu contraseña de Docker. Para obtener la versión del secreto, haz clic en el nombre de un secreto en la página Secret Manager de la consola de Google Cloud.
- Después de todos los
Usa el archivo de configuración de compilación para iniciar una compilación mediante la línea de comandos o para automatizar compilaciones con activadores.
Ejemplo: Cómo acceder a Secrets desde secuencias de comandos y procesos
El campo secretEnv
agrega el valor del secreto al entorno, y puedes
acceder a este valor a través de la variable de entorno desde las secuencias de comandos o los procesos:
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"
}
]
}
}
El siguiente contenido de main.py
imprime los primeros cinco caracteres del secreto:
import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")
Ejemplo: Autenticación en Docker
En algunas situaciones, antes de interactuar con imágenes de Docker, tu compilación deberá autenticarse en Docker. Por ejemplo, la autenticación de Docker es necesaria para que las compilaciones extraigan imágenes privadas y envíen imágenes privadas o públicas a Docker Hub. En estos casos, puedes almacenar tu nombre de usuario y contraseña de Docker en Secret Manager y, luego, configurar Cloud Build para acceder al nombre de usuario y la contraseña de Secret Manager. Para obtener instrucciones sobre cómo hacer esto, consulta Interactúa con imágenes de Docker Hub.
Ejemplo: Creación de solicitud de extracción de GitHub
Otro ejemplo en el que se recomienda configurar tu compilación para acceder a información sensible de Secret Manager es crear una solicitud de extracción de GitHub en respuesta a las compilaciones. Para ello, siga estos pasos:
- Crea un token de GitHub.
- Almacena el token de GitHub en Secret Manager.
- En tu archivo de configuración de compilación, haz lo siguiente:
- Después de toda la compilación
steps
, agrega un campoavailableSecrets
para especificar la versión del secreto y la variable de entorno que se usará para el token de GitHub. - Agrega un paso de compilación para invocar el comando que crea una solicitud de extracción de GitHub.
- Después de toda la compilación
- Crea un activador de app de GitHub y usa el archivo de configuración de compilación para invocar el activador.
En el siguiente archivo de configuración de ejemplo, se muestra cómo crear una solicitud de extracción de GitHub con el token de 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"
}
]
}
}
Reemplaza los valores de marcador de posición en los comandos anteriores por la siguiente información:
PROJECT_ID
: El ID del proyecto de Google Cloud en el que almacenaste tus secretos.GITHUB_USERNAME
: Es el nombre de usuario de GitHub del propietario del repositorio.REPO_NAME
: Es el nombre del repositorio de GitHub.HEAD_BRANCH
: Es el nombre de la rama en la que se implementan los cambios. Para las solicitudes de extracción entre repositorios de la misma red, agrega el espacio de nombreshead
a un usuario de la siguiente manera:username:branch
.BASE_BRANCH
: Es el nombre de la rama de la que deseas que se extraigan los cambios. Debería ser una rama existente en el repositorio actual. No puedes enviar una solicitud de extracción a un repositorio que solicite una combinación a una base de otro repositorio.GH_TOKEN_SECRET_NAME
: Es el nombre del secreto correspondiente a tu token de GitHub.NEW_PR
: La solicitud de extracción nueva que deseas crear.
Configura compilaciones para acceder a secretos que no sean UTF-8 desde Secret Manager
En tu archivo de configuración de compilación, agrega un paso de compilación para acceder a la versión del secreto en Secret Manager y almacenarla en un archivo. En el siguiente paso de compilación, se accede a secret-name y se almacena en un archivo llamado 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" ] } ] }
Usa el archivo con los datos desencriptados en un paso de compilación. En el siguiente fragmento de código, se usa decrypted-data.txt para acceder a un registro privado de 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" ] } ] }
Usa el archivo de configuración de compilación para iniciar una compilación mediante la línea de comandos o para automatizar compilaciones con activadores.
¿Qué sigue?
- Aprende a usar credenciales encriptadas en compilaciones.
- Obtén más información sobre cómo acceder a los repositorios privados de GitHub.