Usa recursos encriptados

En esta página, se explica cómo usar recursos encriptados en tus solicitudes de compilación. Puedes usar recursos encriptados como archivos o variables para pasar información sensible, como tokens de autorización, a tus pasos de compilación.

Puedes encriptar y desencriptar recursos con las CryptoKeys de Cloud Key Management Service (Cloud KMS), que te permiten administrar el acceso y la rotación de claves de encriptación con flexibilidad y facilidad. Las CryptoKeys están almacenadas en llaveros de claves, que son grupos de CryptoKeys con fines organizativos.

Debes completar la Guía de inicio rápido de Cloud KMS para conocer Cloud KMS y habilitar la API de Cloud KMS.

Crea un llavero de claves y CryptoKey de Cloud KMS

Puedes crear llaveros de claves y CryptoKeys con los comandos gcloud kms keyrings create y gcloud kms keys create.

Para crear un llavero de claves, ejecuta el comando siguiente en tu shell o ventana de terminal:

gcloud kms keyrings create [KEYRING-NAME] \
  --location=global

Para crear una clave criptográfica, haz lo siguiente:

gcloud kms keys create [KEY-NAME] \
  --location=global \
  --keyring=[KEYRING-NAME] \
  --purpose=encryption

En el que:

  • [KEYRING-NAME] es el nombre del llavero de claves para crear.
  • [KEY-NAME] es el nombre de la clave criptográfica para crear.

Otorga acceso a la clave criptográfica a la cuenta de servicio de Cloud Build

Para desencriptar tu recurso durante la compilación, debes otorgar un permiso de acceso a tu clave criptográfica a la cuenta de servicio de Cloud Build. Si solo necesita desencriptar el archivo, solo debes otorgar el permiso de desencriptación.

Para otorgar permiso, realiza lo siguiente:

Console

  1. Visita el menú IAM de GCP Console.
  2. Copia la dirección de correo electrónico de la cuenta de servicio de Cloud Build, que contiene @cloudbuild.gserviceaccount.com.
  3. Visita el menú de encriptación de claves de GCP Console.
  4. Selecciona tu llavero de claves de la lista y, luego, haz clic en Permiso.
  5. Completa el campo Agrega miembros con la dirección de correo electrónico de la cuenta de servicio.
  6. Desde el menú desplegable Funciones, elige Desencriptador de CryptoKey de Cloud KMS.
  7. Haz clic en Agregar.

gcloud

Ejecuta el comando siguiente desde tu shell o ventana de terminal:

gcloud kms keys add-iam-policy-binding \
    [KEY-NAME] --location=global --keyring=[KEYRING-NAME] \
    --member=serviceAccount:[SERVICE-ACCOUNT]@cloudbuild.gserviceaccount.com \
    --role=roles/cloudkms.cryptoKeyDecrypter

Para obtener más información sobre este comando, consulta la documentación de gcloud kms keys.

Si no conoces la dirección de correo electrónico de la cuenta de servicio de Cloud Build, dirígete al menú IAM de Google Cloud Platform Console. La dirección de correo electrónico de la cuenta de servicio contiene @cloudbuild.gserviceaccount.com.

Para obtener más información sobre cómo otorgar acceso a las claves, consulta Usa IAM con Cloud KMS en la documentación de Cloud KMS.

Encripta un archivo con la clave criptográfica

Para encriptar un archivo, ejecuta el comando siguiente en tu shell o ventana de terminal:

gcloud kms encrypt \
  --plaintext-file=secrets.json \
  --ciphertext-file=secrets.json.enc \
  --location=global \
  --keyring=[KEYRING-NAME] \
  --key=[KEY-NAME]

Eso produce un archivo encriptado llamado secrets.json.enc, que incluye los contenidos de secrets.json.

Almacena el archivo encriptado

Una vez que encriptaste tu archivo, lo puedes almacenar en la misma ubicación que tu código fuente, por ejemplo, en un Cloud Source Repository o en un repositorio conectado de GitHub o Bitbucket.

Por ejemplo, para agregar y confirmar el archivo encriptado a tu repositorio de Git:

git add secrets.json.enc
git commit -am "Add encrypted secrets.json.enc"
git push

Para evitar la confirmación del archivo de texto sin formato secrets.json a tu repositorio, agrega el nombre del archivo al archivo .gitignore de tu repositorio.

echo "secrets.json" >> .gitignore
git commit -am "Add secrets.json to .gitignore"
git push

Desencripta el archivo durante tu compilación

Ahora que el archivo está encriptado con una clave de encriptación a la que puede acceder tu cuenta de servicio de compilador, puedes agregar un paso de compilación para desencriptar los contenidos del archivo encriptado.

En tu solicitud de compilación, antes de agregar cualquier paso de compilación que interactúe con el archivo secrets.json desencriptado, agrega uno que llame al compilador gcloud para desencriptar secrets.json.enc con la clave de encriptación. Este paso de compilación es similar a los comandos usados para encriptar el archivo.

steps:
- name: gcr.io/cloud-builders/gcloud
  args:
  - kms
  - decrypt
  - --ciphertext-file=secrets.json.enc
  - --plaintext-file=secrets.json
  - --location=global
  - --keyring=[KEYRING-NAME]
  - --key=[KEY-NAME]
# more steps here

Después de completar este paso, cualquier paso posterior puede usar el archivo secrets.json en el directorio de espacio de trabajo.

Por ejemplo, puedes usar los secretos de este archivo a fin de obtener dependencias externas o para incluir tokens secretos en imágenes de contenedor de Docker que compiles.

Encripta una variable de entorno con la llave criptográfica

Para encriptar una variable de entorno, ejecuta el comando siguiente en tu shell o ventana de terminal:

echo -n $MY_SECRET | gcloud kms encrypt \
  --plaintext-file=- \  # - reads from stdin
  --ciphertext-file=- \  # - writes to stdout
  --location=global \
  --keyring=[KEYRING-NAME] \
  --key=[KEY-NAME] | base64

Este comando encripta el valor de la variable de entorno $MY_SECRET mediante la llave criptográfica. El valor encriptado es una string codificada en base64 para que puedas incluir el valor en tu solicitud de compilación con facilidad.

Usa la variable encriptada en solicitudes de compilación

En tu solicitud de compilación, incluye un campo secrets, el cual especifica el valor encriptado y la clave criptográfica que debes usar para desencriptarlo:

secrets:
- kmsKeyName: projects/[PROJECT-ID]/locations/global/keyRings/[KEYRING-NAME]/cryptoKeys/[KEY-NAME]
  secretEnv:
    MY_SECRET: <base64-encoded encrypted secret>

En tus pasos de compilación, especifica que el valor desencriptado debe estar disponible como una variable de entorno:

steps:
- name: 'my-builder-image'
  args: ['my', 'args']
  env: ['FOO=foo', 'BAR=bar']
  secretEnv: ['MY_SECRET']

Ejemplo de solicitud de compilación mediante una variable encriptada

En el ejemplo de solicitud de compilación siguiente, se envía una imagen de Docker a Dockerhub con una contraseña encriptada de Dockerhub:

steps:

# Pull a public image from Dockerhub.
- name: 'gcr.io/cloud-builders/docker'
  args: ['pull', 'ubuntu']

# Retag the image into a user's repository.
- name: 'gcr.io/cloud-builders/docker'
  args: ['tag', 'ubuntu', '[MY-USER]/myubuntu']

# Login to provide credentials for the push.
# PASSWORD is decrypted before this step runs.
# Note: You need a shell to resolve environment variables with $$
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'docker login --username=[MY-USER] --password=$$PASSWORD']
  secretEnv: ['PASSWORD']

# Push the image to Dockerhub.
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', '[MY-USER]/myubuntu']

secrets:
- kmsKeyName: projects/[PROJECT-ID]/locations/global/keyRings/[KEYRING-NAME]/cryptoKeys/[KEY-NAME]
  secretEnv:
    PASSWORD: <base64-encoded encrypted Dockerhub password>

En este ejemplo, el paso docker login accede a Dockerhub con el nombre de usuario especificado y la contraseña desencriptada de Dockerhub para que el paso siguiente pueda realizar docker push de la imagen desde el repositorio del usuario a Dockerhub con esas credenciales.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...