Usa credenciales encriptadas de Cloud KMS

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

  • Habilita las API de Cloud Build and Cloud KMS.

    Habilita las API

  • Para usar los ejemplos de la línea de comandos de esta guía, instala y configura el SDK de Cloud.

  • Encripta la información sensible mediante Cloud KMS. Cloud KMS guarda el contenido encriptado en un archivo.

  • Si quieres configurar compilaciones para que usen datos encriptados, convierte los ENCRYPTED_FILE a base64 (este paso no es necesario para las configuraciones de compilación que usen archivos encriptados):

        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:

  1. En Cloud Console, ve a la página Configuración de Cloud Build:

    Abrir la página Configuración

  2. 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

  1. En el directorio raíz del proyecto, crea un archivo de configuración de compilación de Cloud Build llamado cloudbuild.yaml o cloudbuild.json.

  2. En tu archivo de configuración de compilación, haz lo siguiente:

    • Después de toda la compilación steps, agrega un campo availableSecrets a fin de especificar el valor encriptado como una variable de entorno y kmsKeyName para desencriptarlo. Puedes usar variables de sustitución en el valor de kmsKeyName.
    • En el paso de compilación en el que desees especificar el secreto:
      • Agrega un campo entrypoint que apunte a bash para usar la herramienta de 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. Para obtener más información sobre cómo ejecutar comandos de 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 $$.

    En el siguiente ejemplo de archivo de configuración de compilación, 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: el ID del proyecto de Cloud que contiene tu servicio de Cloud KMS.
    • USERNAME_KEYRING_NAME: el nombre del llavero de claves de tu nombre de usuario de Docker.
    • USERNAME_KEY_NAME: El nombre de clave de tu nombre de usuario de Docker.
    • ENCRYPTED_USERNAME: tu nombre de usuario de Docker encriptado en formato base64
    • PASSWORD_KEYRING_NAME: el nombre del llavero de claves de tu contraseña de Docker.
    • PASSWORD_KEY_NAME: El nombre de clave de tu contraseña de Docker.
    • ENCRYPTED_PASSWORD: tu contraseña encriptada de Docker en formato base64.
    • REPOSITORY: El nombre de tu repositorio de Docker desde el que extraes la imagen.
    • TAG: El nombre de etiqueta de tu imagen.

  3. 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

  1. En el directorio raíz del proyecto, crea un archivo de configuración de compilación de Cloud Build llamado cloudbuild.yaml o cloudbuild.json.

  2. En tu archivo de configuración de compilación, antes de agregar cualquier paso de compilación que interactúe con el archivo desencriptado, agrega un paso de compilación de 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 mediante el archivo encriptado con una 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: el nombre del llavero de claves de tu contraseña de Docker.
    • KEY_NAME: El nombre de clave de tu contraseña de Docker.
    • ENCRYPTED_PASSWORD_FILE: archivo encriptado con tu contraseña de Docker.
    • PLAINTEXT_PASSWORD_FILE: archivo de texto sin formato con tu contraseña de Docker
  3. 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 (heredado)

Para encriptar datos sensibles mediante Cloud KMS y usarlos en un archivo de configuración de compilación, haz lo siguiente:

  1. En tu archivo de configuración de compilación, agrega un campo secrets a fin de especificar el valor encriptado y el CryptoKey para usarlo a fin de desencriptarlo. Luego, en el paso de compilación en el que deseas usar la variable encriptada, agrega un campo secretEnv para especificar la variable como una variable de entorno. Incluye el nombre de la variable en el campo secretEnv. 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?