Usa secretos y credenciales

En esta página, se explica cómo incluir información sensible, como contraseñas y claves de API en Cloud Build.

Antes de incluir información sensible en tus compilaciones, debes almacenarla en Administrador de secretos o encriptarla con Cloud Key Management Service y solo incluir la información encriptada en Cloud Build. Secret Manager es la técnica recomendada para administrar datos sensibles con Cloud Build. Puedes seguir usando Cloud KMS en los proyectos existentes, pero para los proyectos nuevos, se usa Secret Manager.

Antes de comenzar

Para ejecutar los comandos de gcloud en esta página, instala la herramienta de línea de comandos de gcloud.

  • Si ya instalaste el SDK de Cloud con anterioridad, ejecuta gcloud components update para asegurarte de tener la última versión disponible.

Usa Secret Manager

Secret Manager es un servicio de Google Cloud que almacena de manera segura claves de API, contraseñas y otros datos sensibles.

Para almacenar datos en Secret Manager y usarlos en Cloud Build, sigue estos pasos:

  1. Habilita la API de Secret Manager:

    Habilita la API de Secret Manager

  2. Otorga la función de IAM Secret Accessor a la cuenta de servicio de Cloud Build:

    1. Abre la página de IAM en Cloud Console.

      Abrir la página IAM

    2. Selecciona tu proyecto y haz clic en Open.

    3. En la tabla de permisos, ubica el correo electrónico que termina en @cloudbuild.gserviceaccount.com y haz clic en el ícono de lápiz.

    4. Agregar función Secret Manager Secret Accessor.

    5. Haga clic en Save.

  3. Almacena datos en Secret Manager:

    1. Ve a la página de Secret Manager en Cloud Console:

      Ir a la página de Secret Manager

    2. En la página de Secret Manager, haz clic en Crear secreto.

    3. En la página Crear secreto, en Nombre, ingresa secret-name.

    4. En el campo Valor del secreto, ingresa tus datos.

    5. Deja la sección Regiones sin modificar.

    6. Haz clic en el botón Crear secreto.

    Si deseas obtener instrucciones para usar el administrador de secretos con la herramienta de línea de comandos de gcloud, consulta la Guía de inicio rápido de Secret Manager. Si deseas obtener instrucciones para otorgar acceso a un secreto específico, consulta Administra el acceso a los secretos.

  4. 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"
        ]
      }
      ]
    }
    
  5. 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"
         ]
      }
      ]
    }
    
  1. Usa el archivo de configuración de compilación para iniciar una compilación de forma manual o automatizar compilaciones mediante activadores.

Usa Cloud KMS

Cloud KMS es un servicio de Google Cloud que te permite administrar y usar claves criptográficas.

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

  1. Habilita la API de Cloud KMS.

    Habilita la API de Cloud KMS.

  2. Otorga la función de IAM Cloud KMS CryptoKey Decrypter 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.

  3. Abre una ventana de terminal.

  4. Crea un Cloud KMS key-ring nuevo con el nombre keyring-name:

      gcloud kms keyrings create keyring-name --location global
    
  5. Crea un Cloud KMS key nuevo key-name para el key-ring keyring-name:

      gcloud kms keys create key-name \
          --location global --keyring keyring-name \
          --purpose encryption
    
  6. Configura Cloud Build para usar los datos encriptados:

    • Para usar variables encriptadas, haz lo siguiente:

      1. Encripta secret-name mediante key-name y keyring-name. El valor encriptado es una string codificada en base64. Asegúrate de no incluir caracteres innecesarios, como espacios o saltos de línea en secret-name. La marca -n indica a echo que no incluya un salto de línea al final:

         echo -n secret-name | gcloud kms encrypt --plaintext-file=- \
             --ciphertext-file=- --location=global --keyring=keyring-name \
             --key=key-name | base64
        
      2. 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"
                }
             }
             ]
         }
        
    • Para usar archivos encriptados, haz lo siguiente:

      1. Encripte el archivo llamado secrets.json mediante keyring-name y keyring-name. Esto produce un archivo encriptado llamado secrets.json.enc. secrets.json no deben superar los 64 KiB.

         gcloud kms encrypt --plaintext-file=secrets.json \
             --ciphertext-file=secrets.json.enc \
             --location=global --keyring=keyring-name\
             --key=key-name
        
      2. En tu archivo de configuración de compilación, antes de cualquier paso de compilación que interactúe con el archivo secrets.json desencriptado, agrega un paso de compilación que llame a gcloud de Cloud Build para desencriptarsecrets.json.enc con la clave de encriptación. Este paso de compilación es similar a los comandos que se usaron para encriptar el archivo.

        YAML

         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
        

        JSON

         {
           "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"
              ]
            }
            ]
         }
        

        Una vez que se complete este paso, todos los pasos posteriores pueden usar el archivo secrets.json desencriptado. 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.

  7. Usa el archivo de configuración de compilación para iniciar una compilación de forma manual o automatizar compilaciones mediante activadores.

¿Qué sigue?