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.
Antes de comenzar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Secret Manager APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Secret Manager APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Opcional. Completa la Guía de inicio rápido de Secret Manager para familiarizarte con este producto.
Crea una clave SSH
Abre una ventana de terminal.
Crea un directorio nuevo llamado
workingdir
y navega hasta él:mkdir workingdir cd workingdir
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.
Para almacenar tu clave SSH en el administrador de secretos, sigue estos pasos:
Ve a la página de Secret Manager en la consola de Google Cloud:
En la página de Secret Manager, haz clic en Crear secreto.
En la página Crear secreto, en Nombre, ingresa un nombre para el secreto.
En el campo Valor del secreto, haz clic en Subir y sube tu archivo
workingdir/id_github
.Deja la sección Regiones sin modificar.
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
Accede a GitHub.
En la esquina superior derecha, haz clic en tu foto de perfil y, luego, en Tu perfil.
En tu página de perfil, haz clic en Repositorios y, luego, en el nombre de tu repositorio.
En tu repositorio, haz clic en Configuración.
En la barra lateral, haz clic en Implementar claves y, luego, en Agregar clave de implementación.
Proporciona un título, pega la clave SSH pública de
workingdir/id_github.pub
.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.
Haga clic en Agregar clave.
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.
Abre la página Configuración (Settings) de Cloud Build:
En la lista desplegable, selecciona la cuenta de servicio cuyos roles deseas cambio.
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:
Crea un archivo de configuración de compilación llamado
cloudbuild.yaml
con dos pasos: el primer paso degcloud
accede a la clave SSH en Secret Manager y lo guarda comoid_rsa
en un volumen llamadossh
, junto con una copia delknown_hosts.github
El volumen se usa para conservar los archivos en los pasos de la compilación. En el segundo paso degit
, se usa la clave deid_rsa
para conectarse al repositorio degit@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:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- 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
En GitHub, navega hacia la página principal del repositorio.
En el nombre de tu repositorio, haz clic en Configuración.
En la barra lateral izquierda, haz clic en Claves de implementación.
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?
- Aprende a crear activadores de GitHub.
- Obtén más información sobre el uso de recursos encriptados en Cloud Build.
- Obtener más información sobre el administrador de secretos.