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 Repositorios de GitHub de una compilación. Secret Manager es un servicio de Google Cloud que almacena 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    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 clave SSH nueva 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, en Nombre, ingresa un nombre para el secreto.

    4. En el campo Valor del secreto, haz clic en Subir y sube tu 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 se envíe al repositorio.

  8. Haga clic en Agregar clave.

  9. Borra la clave SSH del disco:

    rm id_github*
    

Otorgar permisos

Debes otorgar permiso para acceder a Secret Manager del servicio cuenta que estás usando para la creación.

  1. Abre la página Configuración (Settings) de Cloud Build:

    Abrir la página Configuración de Cloud Build

  2. En la lista desplegable, selecciona la cuenta de servicio cuyos roles deseas cambio.

  3. Establece el estado de la función Secret Manager Secret Accessor en Habilitar.

Agrega la clave SSH pública a hosts conocidos

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

Para que Cloud Build se conecte a GitHub, debes agregar la clave SSH pública al archivo known_hosts en el entorno de compilación de Cloud Build. Tú 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 lo 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. En el segundo paso de git, se usa la clave de id_rsa para conectarse al repositorio de 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. a los que quieren acceder.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud. en la que almacenaste tus Secrets.
  • SECRET_NAME: Es el nombre del Secret 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 a este:

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

Realiza una limpieza

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, sigue estos pasos:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

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?