Usa Secrets de Secret Manager

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

Secret Manager es un servicio de Google Cloud que almacena de manera segura claves de API, contraseñas y otros datos sensibles. Para incluir información sensible en tus compilaciones, puedes almacenar la información en Secret Manager y, luego, configurar tu compilación a fin de acceder a la información desde Secret Manager.

Antes de comenzar

  • Habilita las API de Cloud Build and Secret Manager.

    Habilita las API

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

  • Asegúrate de almacenar el secreto en Secret Manager. Para obtener instrucciones, consulta Crea un secreto.

    • Anota el nombre y la versión de tu secreto. Necesitarás esta información para configurar Cloud Build a fin de acceder al secreto.

Permisos de IAM obligatorios

Otorga el rol de IAM Secret Manager de acceso (roles/secretmanager.secretAccessor) del secreto a la cuenta de servicio de Cloud Build:

  1. Abre la página Secret Manager en Google Cloud Console:

    Ir a la página Secret Manager

  2. Selecciona la casilla de verificación del secreto que deseas usar en tu compilación.

  3. Si aún no está abierto, haz clic en Mostrar panel de información para abrir el panel.

  4. En el panel, en Permisos, haz clic en Agregar principal.

  5. En el cuadro de texto Principales nuevas, ingresa la dirección de correo electrónico de tu cuenta de servicio de Cloud Build con el formato PROJECT_NUMBER@cloudbuild.gserviceaccount.com. PROJECT_NUMBER es el número del proyecto en el que ejecutas compilaciones. Puedes encontrar el número de proyecto en la página de configuración del proyecto.

  6. En el cuadro desplegable Selecciona una función, elige Accesor secreto de Secret Manager.

  7. Haz clic en Guardar.

Configurar compilaciones para acceder a Secrets UTF-8 desde Secret Manager

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

  2. En el archivo de configuración de compilación:

    • Después de todo el steps de compilación, agrega un campo availableSecrets para especificar la versión del Secret y las variables de entorno que se usarán en tu secreto. Puedes incluir variables de sustitución en el valor del campo secretVersion. Puedes especificar más de un secreto en una compilación.
    • 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.
      • 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 secreto 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 con el nombre de usuario y la contraseña de Docker almacenados en Secret Manager.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    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 Cloud en el que almacenaste tus secretos.
    • DOCKER_USERNAME_SECRET_NAME: Es el nombre secreto correspondiente a tu nombre de usuario de Docker. Puedes obtener el nombre del Secret en la página Secret Manager de Console.
    • DOCKER_USERNAME_SECRET_VERSION: Es la versión del secreto de tu nombre de usuario de Docker. Para obtener la versión del Secret, haz clic en un nombre de secreto en la página Secret Manager de la consola.
    • DOCKER_PASSWORD_SECRET_NAME: Es el nombre del secreto correspondiente a tu contraseña de Docker. Puedes obtener el nombre del Secret en la página Secret Manager de Console.
    • DOCKER_PASSWORD_SECRET_VERSION: Es la versión del secreto de tu contraseña de Docker. Para obtener la versión del Secret, haz clic en un nombre de secreto en la página Secret Manager de la consola.
  3. Usa el archivo de configuración de compilación para iniciar una compilación con la línea de comandos o automatizar compilaciones con activadores.

Ejemplo: Accede a Secrets desde secuencias de comandos y procesos

El campo secretEnv agrega el valor del secreto al entorno, y puedes acceder a él a través de una variable de entorno desde secuencias de comandos o procesos.

YAML

steps:
- name: python:slim
  entrypoint: python
  args: ['main.py']
  secretEnv: ['MYSECRET']
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
    env: 'MYSECRET'

JSON

{
  "steps": [
  {
    "name": "python:slim",
    "entrypoint": "python",
    "args": [
        "main.py"
    ],
    "secretEnv": [
        "MYSECRET"
    ]
}
],
"availableSecrets": {
  "secretManager": [
    {
        "versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
        "env": "MYSECRET"
    }
  ]
}
}

El siguiente contenido de main.py imprime los primeros cinco caracteres del secreto:

import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")

Ejemplo: autenticación en Docker

En algunas situaciones, antes de interactuar con las imágenes de Docker, se debe autenticar la compilación en Docker. Por ejemplo, se requiere autenticación de Docker para que las compilaciones obtengan imágenes privadas y envíen imágenes privadas o públicas a Docker Hub. En estos casos, puedes almacenar el nombre de usuario y la contraseña de Docker en Secret Manager y, luego, configurar Cloud Build para acceder a ellos. A fin de obtener instrucciones para hacerlo, consulta Interactúa con imágenes de Docker Hub.

Ejemplo: Creación de una solicitud de extracción de GitHub

Otro ejemplo en el que puedes configurar tu compilación para acceder a información sensible de Secret Manager es crear una solicitud de extracción de GitHub en respuesta a compilaciones. Para ello, siga estos pasos:

  • Crea un token de GitHub.
  • Almacena el token de GitHub en Secret Manager.
  • En tu archivo de configuración de compilación, haz lo siguiente:
    • Después de todo el steps de compilación, agrega un campo availableSecrets para especificar la versión del Secret y la variable de entorno que se usarán en el token de GitHub.
    • Agrega un paso de compilación para invocar el comando para crear una solicitud de extracción de GitHub.
  • Crea un activador de apps de GitHub y usa el archivo de configuración de compilación para invocar el activador.

En el siguiente archivo de configuración de ejemplo, se muestra cómo crear una solicitud de extracción de GitHub con el token de GitHub:

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

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 Cloud en el que almacenaste tus secretos.
  • GITHUB_USERNAME: El nombre de usuario de GitHub del propietario del repositorio.
  • REPO_NAME: Es el nombre del repositorio de GitHub.
  • HEAD_BRANCH: El nombre de la rama en la que se implementan los cambios Para las solicitudes de extracción de repositorio cruzado en la misma red, el espacio de nombres head con un usuario como este: username:branch.
  • BASE_BRANCH: Es el nombre de la rama en la que deseas implementar los cambios. Debe ser una rama existente en el repositorio actual. No puedes enviar una solicitud de extracción a un repositorio que solicite una combinación con una base de otro repositorio.
  • GH_TOKEN_SECRET_NAME: El nombre del secreto correspondiente a tu token de GitHub.
  • NEW_PR: Es la solicitud de extracción nueva que deseas crear.

Cómo configurar compilaciones para acceder a Secrets que no son UTF-8 desde Secret Manager

  1. 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"
        ]
      }
      ]
    }
    
  2. 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"
         ]
      }
      ]
    }
    
  3. Usa el archivo de configuración de compilación para iniciar una compilación con la línea de comandos o automatizar compilaciones con activadores.

¿Qué sigue?