Acceder a GitHub desde una compilación mediante claves SSH


En este instructivo, se muestra cómo usar Secret Manager con Cloud Build para acceder a repositorios privados de GitHub desde una compilación. Secret Manager es un servicio de Google Cloud que almacena de forma segura claves de API, contraseñas y otros datos sensibles.

Objetivos

  • Configurar una Llave SSH para GitHub
  • Agrega la clave SSH pública a las claves de implementación de un repositorio privado.
  • Almacena la clave SSH privada en el Administrador de secretos
  • Envía una compilación que acceda a la clave desde el Administrador de secretos y la use para acceder al repositorio privado.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • Secret Manager
  • Cloud Build

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de Cloud Build and Secret Manager.

    Habilita las API

  5. Instala Google Cloud CLI.
  6. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  7. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  8. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  9. Habilita las API de Cloud Build and Secret Manager.

    Habilita las API

  10. Instala Google Cloud CLI.
  11. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  12. Opcional. Completa la Guía de inicio rápido de Secret Manager para familiarizarte con este producto.

Crea una clave SSH

  1. Abre una ventana de terminal.

  2. Crea un directorio nuevo llamado workingdir y navega hasta él:

    mkdir workingdir
    cd workingdir
    
  3. Crea una clave SSH nueva de GitHub, en la que github-email es tu dirección de correo electrónico de GitHub:

    ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
    

    Este comando crea una nueva clave SSH workingdir/id_github sin una frase de contraseña para tu clave SSH. Cloud Build no puede usar tu clave SSH si está protegida con una frase de contraseña.

Almacena la clave SSH privada en el Administrador de secretos

Cuando creas una clave SSH, se crea un archivo id_github en tu entorno. Debido a que cualquiera puede autenticarse en tu cuenta con este archivo, debes almacenar el archivo en Secret Manager antes de usarlo en una compilación.

  1. Para almacenar tu clave SSH en el administrador de secretos, sigue estos pasos:

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

      Ir a la página Secret Manager

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

    3. En la página Crear secreto, debajo de Nombre, ingresa un nombre para el secreto.

    4. En el campo Valor del secreto, haz clic en Subir y sube el archivo workingdir/id_github.

    5. Deja la sección Regiones sin modificar.

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

Esto subirá tu archivo id_github al Administrador de secretos.

Agrega la clave SSH pública a las claves de implementación de tu repositorio privado

  1. Accede a GitHub.

  2. En la esquina superior derecha, haz clic en tu foto de perfil y, luego, en Tu perfil.

  3. En tu página de perfil, haz clic en Repositorios y, luego, en el nombre de tu repositorio.

  4. En tu repositorio, haz clic en Configuración.

  5. En la barra lateral, haz clic en Implementar claves y, luego, en Agregar clave de implementación.

  6. Proporciona un título, pega la clave SSH pública de workingdir/id_github.pub.

  7. Selecciona Permitir acceso de escritura si deseas que esta clave tenga acceso de escritura al repositorio. Una clave de implementación con acceso de escritura permite que una implementación envíe datos al repositorio.

  8. Haga clic en Agregar clave.

  9. Borra la clave SSH del disco:

    rm id_github*
    

Otorga permisos

Debes otorgar permiso a la cuenta de servicio de Cloud Build para acceder al Administrador de secretos durante la compilación.

  1. Abre la página IAM en la consola de Google Cloud:

    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. Haz clic en Guardar.

Agrega la clave SSH pública a hosts conocidos

La mayoría de las máquinas contienen un archivo llamado known_hosts, que posee claves conocidas para hosts remotos. A menudo, las claves se recopilan de los hosts remotos cuando se conectan a ellos por primera vez, pero también se pueden agregar de forma manual. Las claves en este archivo se usan para verificar la identidad del host remoto y como protección contra la suplantación.

Para que Cloud Build se conecte a GitHub, debes agregar la Llave SSH pública al archivo known_hosts en el entorno de compilación de Cloud Build. Para ello, agrega la clave a un archivo temporal known_hosts.github y, luego, copia el contenido de known_hosts.github en el archivo known_hosts en el entorno de compilación de Cloud Build.

En tu directorio workingdir, crea un archivo llamado known_hosts.github y agrega la clave SSH pública a este archivo:

ssh-keyscan -t rsa github.com > known_hosts.github

En la siguiente sección, cuando configures la compilación, agregarás instrucciones al archivo de configuración de Cloud Build para copiar el contenido de known_hosts.github al archivo known_hosts en el entorno de compilación de Cloud Build.

Configure la compilación

Para configurar la compilación, sigue estos pasos:

  1. Crea un archivo de configuración de compilación llamado cloudbuild.yaml con dos pasos: el primer paso de gcloud accede a la clave SSH en Secret Manager y la guarda como id_rsa en un volumen llamado ssh, junto con una copia del known_hosts.github. El volumen se usa para conservar los archivos en los pasos de la compilación. El segundo paso de git usa la clave de id_rsa para conectarse al repositorio en git@github.com:git-username/git-repository.

    # Access the id_github file from Secret Manager, and setup SSH
    steps:
    - name: 'gcr.io/cloud-builders/git'
      secretEnv: ['SSH_KEY']
      entrypoint: 'bash'
      args:
      - -c
      - |
        echo "$$SSH_KEY" >> /root/.ssh/id_rsa
        chmod 400 /root/.ssh/id_rsa
        cp known_hosts.github /root/.ssh/known_hosts
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Clone the repository
    - name: 'gcr.io/cloud-builders/git'
      args:
      - clone
      - --recurse-submodules
      - git@github.com:GIT_USERNAME/GIT_REPOSITORY
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest
        env: 'SSH_KEY'
    

Reemplaza los valores de marcador de posición en los comandos anteriores por la siguiente información:

  • GIT_USERNAME: Es el nombre de usuario de GitHub del propietario del repositorio.
  • GIT_REPOSITORY: Es el nombre del repositorio de GitHub al que deseas acceder.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud en el que almacenaste tus secretos.
  • SECRET_NAME: Es el nombre del secreto que creaste en Secret Manager.

Para obtener información sobre las strings YAML de varias líneas usadas en el fragmento anterior, consulta YAML de varias líneas.

Envía la compilación

Para enviar la compilación, ejecuta el siguiente comando:

gcloud builds submit --config=cloudbuild.yaml .

El resultado es similar al siguiente:

Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"

FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][  3.9 KiB/  3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                              IMAGES  STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487  XXXX-XX-XXT17:57:21+00:00  13S       gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz  -                                 SUCCESS

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra la clave de implementación de tu repositorio

  1. En GitHub, navega hacia la página principal del repositorio.

  2. En el nombre de tu repositorio, haz clic en Configuración.

  3. En la barra lateral izquierda, haz clic en Claves de implementación.

  4. En la página Claves de implementación, busca las claves de implementación asociadas con tu repositorio y haz clic en Borrar.

¿Qué sigue?