Usa secretos del Administrador de secretos

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 el Administrador de secretos y, luego, configurar tu compilación para acceder a la información desde el administrador de secretos.

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 el SDK de Cloud.

  • Asegúrate de haber almacenado el secreto en el Administrador de secretos. Para obtener instrucciones, consulta Crea un secreto.

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

Permisos de IAM obligatorios

Otorga la función de IAM Administrador y descriptor de acceso a secretos (roles/secretmanager.secretAccessor) del administrador de secretos para la cuenta de servicio de Cloud Build:

  1. Abre la página Administrador de secretos 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 no está abierta, haz clic en Mostrar panel de información para abrirlo.

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

  5. En el cuadro de texto Nuevos miembros, 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 las compilaciones. Puedes encontrar el número del proyecto en la página de configuración del proyecto.

  6. En el cuadro desplegable Seleccionar una función, selecciona Administrador de accesos secretos al administrador de secretos.

  7. Haz clic en Guardar.

Configura compilaciones para acceder al secreto desde el administrador de secretos

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

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

    • Después de toda la compilación steps, agrega un campo availableSecrets a fin de especificar la versión del secreto y las variables de entorno que se usarán para 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 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.
      • 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 contraseña de Docker almacenados en el administrador de secretos.

    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: el ID del proyecto de Cloud en el que almacenaste tus secretos.
    • DOCKER_USERNAME_SECRET_NAME: el nombre secreto correspondiente a tu nombre de usuario de Docker. Puedes obtener el nombre del secreto en la página Administrador de secretos de Cloud Console.
    • DOCKER_USERNAME_SECRET_VERSION: La versión secreta del nombre de usuario de Docker. Para obtener la versión del secreto, haz clic en un nombre de secreto en la página Administrador de secretos de Cloud Console.
    • DOCKER_PASSWORD_SECRET_NAME: el nombre secreto correspondiente a tu contraseña de Docker. Puedes obtener el nombre del secreto en la página Administrador de secretos de Cloud Console.
    • DOCKER_PASSWORD_SECRET_VERSION: La versión secreta de tu contraseña de Docker. Para obtener la versión del secreto, haz clic en un nombre de secreto en la página Administrador de secretos de Cloud Console.
  3. Usa el archivo de configuración de compilación para iniciar una compilación de forma manual o automatizar compilaciones mediante activadores.

Ejemplo: Autenticación en Docker

En algunas situaciones, antes de interactuar con las imágenes de Docker, tu compilación tendría que autenticarse en Docker. Por ejemplo, se requiere la autenticación de Docker para realizar compilaciones a fin de extraer imágenes privadas y enviar imágenes privadas o públicas a Docker Hub. En estos casos, puedes almacenar tu nombre de usuario y contraseña de Docker en el administrador de secretos y, luego, configurar Cloud Build para acceder al nombre de usuario y la contraseña desde el administrador de secretos. Para obtener instrucciones sobre cómo hacer esto, 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 se recomienda configurar tu compilación para acceder a información sensible del Administrador de secretos es crear una solicitud de extracción de GitHub en respuesta a las compilaciones. Para ello, haz lo siguiente:

  • Crea un token de GitHub.
  • Almacena el token de GitHub en el administrador de secretos.
  • En tu archivo de configuración de compilación, sigue estos pasos:
  • Crea un activador de aplicación 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: 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 solicitudes de extracción entre repositorios en la misma red, el espacio de nombres head con un usuario como este: username:branch.
  • BASE_BRANCH: El nombre de la rama en la que deseas que se extraigan los cambios. Debería ser una rama existente en el repositorio actual. No puedes enviar una solicitud de extracción a un repositorio que solicite una combinación de otra base de repositorio.
  • GH_TOKEN_SECRET_NAME: el nombre secreto correspondiente a tu token de GitHub.
  • NEW_PR: La nueva solicitud de extracción que quieres crear.

¿Qué sigue?