Cloud Key Management Service es un servicio de Google Cloud que te permite administrar y usar claves criptográficas. En esta página, se explica cómo usar información encriptada de Cloud KMS en Cloud Build.
Antes de comenzar
-
Enable the Cloud Build and Cloud KMS APIs.
Para usar los ejemplos de la línea de comandos de esta guía, instala y configura Google Cloud CLI.
Encripta la información sensible con Cloud KMS. Cloud KMS guarda el contenido encriptado en un archivo.
Si deseas configurar las compilaciones a fin de usar datos encriptados, convierte ENCRYPTED_FILE en Base64 (este paso no es necesario para las opciones de configuración de compilación que usan archivos encriptados) [OPCIONAL]:
base64 ENCRYPTED_FILE
Permisos de IAM obligatorios
Otorga la función de IAM Desencriptador de CryptoKey de Cloud KMS (roles/cloudkms.cryptoKeyDecrypter
) a la cuenta de servicio de Cloud Build:
En la consola de Google Cloud, ve a la página Configuración de Cloud Build:
Ubica la fila con la función Desencriptador de CryptoKey de Cloud KMS y establece su estado en HABILITADO.
Configura compilaciones para usar datos encriptados
En el directorio raíz del proyecto, crea un archivo de configuración de compilación de Cloud Build llamado
cloudbuild.yaml
ocloudbuild.json
.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 el valor encriptado como una variable de entorno y elkmsKeyName
que se usará para desencriptarlo. Puedes usar variables de sustitución en el valor dekmsKeyName
. - 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. Esto es necesario para hacer referencia a la variable de entorno del secreto. - Agrega un campo
secretEnv
que especifique la variable de entorno para el valor encriptado. - En el campo
args
, agrega una marca-c
como primer argumento. Cualquier string que pases después de -c se trata como un comando. Si deseas obtener más información para ejecutar comandos bash con -c, consulta la documentación de bash. - Cuando especifiques el valor encriptado en el campo
args
, especifícalo con la variable de entorno con el prefijo$$
.
- Agrega un campo
En el siguiente archivo de configuración de compilación de ejemplo, se muestra cómo acceder a Docker y extraer una imagen privada:
YAML
steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD'] secretEnv: ['USERNAME', 'PASSWORD'] - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker pull $$USERNAME/IMAGE:TAG'] secretEnv: ['USERNAME'] availableSecrets: inline: - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME envMap: USERNAME: 'ENCRYPTED_USERNAME' - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME envMap: PASSWORD: 'ENCRYPTED_PASSWORD'
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=$$USERNAME --password=$$PASSWORD" ], "secretEnv": [ "USERNAME", "PASSWORD" ] }, { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker pull $$USERNAME/REPOSITORY:TAG" ], "secretEnv": [ "USERNAME" ] } ], "availableSecrets": { "inline": [{ "kmsKeyName": "projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME", "envMap": { "USERNAME": "ENCRYPTED_USERNAME" } }, { "kmsKeyName": "projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME", "envMap": { "PASSWORD": "ENCRYPTED_PASSWORD" } }] } }
Reemplaza los valores de marcador de posición en los comandos anteriores por la siguiente información:
PROJECT_ID
: Es el ID del proyecto de Google Cloud que contiene el servicio de Cloud KMS.USERNAME_KEYRING_NAME
: Es el nombre del llavero de claves de tu nombre de usuario de Docker.USERNAME_KEY_NAME
: Es el nombre de la clave de tu nombre de usuario de Docker.ENCRYPTED_USERNAME
: Es tu nombre de usuario encriptado de Docker en formato base64.PASSWORD_KEYRING_NAME
: Es el nombre del llavero de claves de la contraseña de Docker.PASSWORD_KEY_NAME
: Es el nombre de clave de tu contraseña de Docker.ENCRYPTED_PASSWORD
: Es tu contraseña encriptada de Docker en formato base64.REPOSITORY
: Es el nombre de tu repositorio de Docker desde el que extraes la imagen.TAG
: Es el nombre de la etiqueta de la imagen.
- Después de toda la compilación
Usa el archivo de configuración de compilación para iniciar una compilación de forma manual o automatizar compilaciones mediante activadores.
Configura compilaciones para usar archivos encriptados
En el directorio raíz del proyecto, crea un archivo de configuración de compilación de Cloud Build llamado
cloudbuild.yaml
ocloudbuild.json
.En el archivo de configuración de compilación, antes de cualquier paso de compilación que interactúe con el archivo desencriptado, agrega un paso de compilación
gcloud
para desencriptar el archivo encriptado con la clave de encriptación. En el siguiente ejemplo de archivo de configuración de compilación, se muestra cómo acceder a Docker con el archivo encriptado con la contraseña de Docker:YAML
steps: - name: gcr.io/cloud-builders/gcloud args: - kms - decrypt - "--ciphertext-file=ENCRYPTED_PASSWORD_FILE" - "--plaintext-file=PLAINTEXT_PASSWORD_FILE" - "--location=global" - "--keyring=KEYRING_NAME" - "--key=KEY_NAME" - name: gcr.io/cloud-builders/docker entrypoint: bash args: - "-c" - docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/gcloud", "args": [ "kms", "decrypt", "--ciphertext-file=ENCRYPTED_PASSWORD_FILE", "--plaintext-file=PLAINTEXT_PASSWORD_FILE", "--location=global", "--keyring=KEYRING_NAME", "--key=KEY_NAME" ] }, { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE" ] } ] }
Reemplaza los valores de marcador de posición en los comandos anteriores por la siguiente información:
KEYRING_NAME
: Es el nombre del llavero de claves de la contraseña de Docker.KEY_NAME
: Es el nombre de clave de tu contraseña de Docker.ENCRYPTED_PASSWORD_FILE
: Es el archivo encriptado con tu contraseña de DockerPLAINTEXT_PASSWORD_FILE
: Archivo de texto simple con la contraseña de Docker.
Usa el archivo de configuración de compilación para iniciar una compilación de forma manual o automatizar compilaciones mediante activadores.
Configura compilaciones para usar datos encriptados (heredados)
Para encriptar datos sensibles mediante Cloud KMS y usarlos en un archivo de configuración de compilación, haz lo siguiente:
En tu archivo de configuración de compilación, agrega un campo
secrets
a fin de especificar el valor encriptado y elCryptoKey
para usarlo a fin de desencriptarlo. Luego, en el paso de compilación en el que deseas usar la variable encriptada, agrega un camposecretEnv
para especificar la variable como una variable de entorno. Incluye el nombre de la variable en el camposecretEnv
. Si especificas el valor de la variable o una variable de entorno sin secreto con el mismo nombre, Cloud Build producirá un error.YAML
steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker login --username=user-name --password=$$PASSWORD'] secretEnv: ['PASSWORD'] - name: 'gcr.io/cloud-builders/docker' args: ['push', 'user-name/myubuntu'] secrets: - kmsKeyName: projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name secretEnv: PASSWORD: 'encrypted-password'
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=user-name --password=$$PASSWORD" ], "secretEnv": [ "PASSWORD" ] }, { "name": "gcr.io/cloud-builders/docker", "args": [ "push", "user-name/myubuntu" ] } ], "secrets": [ { "kmsKeyName": "projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name", "secretEnv": { "PASSWORD": "encrypted-password" } } ] }
¿Qué sigue?
- Obtén más información para configurar las compilaciones para acceder a los secretos desde Secret Manager.
- Obtén más información sobre cómo acceder a los repositorios privados de GitHub.