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 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:

  1. En la consola de Google Cloud, 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 para especificar el valor encriptado como una variable de entorno y el kmsKeyName que se usará para desencriptarlo. Puedes usar variables de sustitución en el valor de kmsKeyName.
    • En el paso de compilación en el que deseas especificar el secreto:
      • Agrega un campo entrypoint que apunte a bash 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 $$.

    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.

  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 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 Docker
    • PLAINTEXT_PASSWORD_FILE: Archivo de texto simple con la 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 (heredados)

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?