En este tutorial 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 Google Cloud servicio que almacena de forma segura claves de API, contraseñas y otros datos sensibles.
Objetivos
- Configura una clave SSH de GitHub.
- Añade la clave pública SSH a las claves de implementación de un repositorio privado.
- Almacena la clave SSH privada en Secret Manager.
- Envía una compilación que acceda a la clave de Secret Manager y la use para acceder al repositorio privado.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
- Secret Manager
- Cloud Build
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Antes de empezar
- 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.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Secret Manager APIs.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Secret Manager APIs.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
- Opcional. Completa la guía de inicio rápido de Secret Manager para familiarizarte con este producto.
Abre una ventana de terminal.
Crea un directorio llamado
workingdir
y accede a él:mkdir workingdir cd workingdir
Crea una clave SSH de GitHub, donde github-email es tu dirección de correo de GitHub:
ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
Este comando crea una clave SSH
workingdir/id_github
sin contraseña para tu clave SSH. Cloud Build no puede usar tu clave SSH si está protegida con una contraseña.Ve a la página Secret Manager en la Google Cloud consola:
En la página Secret Manager, haz clic en Crear secreto.
En la página Crear secreto, en Nombre, escribe un nombre para el secreto.
En el campo Valor del secreto, haz clic en Subir y sube tu archivo
workingdir/id_github
.No modifiques la sección Regiones.
Haz clic en el botón Crear secreto.
Inicia sesión en GitHub.
En la esquina superior derecha, haz clic en tu foto de perfil y, a continuación, en Tu perfil.
En la página de tu perfil, haz clic en Repositorios y, a continuación, en el nombre del repositorio.
En tu repositorio, haz clic en Configuración.
En la barra lateral, haz clic en Deploy Keys (Claves de implementación) y, a continuación, en Add deploy key (Añadir clave de implementación).
Proporciona un título y pega tu clave pública SSH de
workingdir/id_github.pub
.Selecciona Permitir acceso de escritura si quieres 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.
Haz clic en Añadir clave.
Elimina la clave SSH de tu disco:
rm id_github*
-
En la Google Cloud consola, ve a la página Permisos de settings Cloud Build:
En la lista desplegable, selecciona la cuenta de servicio cuyos roles quieras cambiar.
Cambia el estado del rol
Secret Manager Secret Accessor
a Habilitar.Crea un archivo de configuración de compilación llamado
cloudbuild.yaml
con dos pasos: el primer pasogcloud
accede a la clave SSH en Secret Manager y la guarda comoid_rsa
en un volumen llamadossh
, junto con una copia deknown_hosts.github
. El volumen se usa para conservar los archivos en los pasos de compilación. En el segundo pasogit
se usa la clave deid_rsa
para conectarse al repositorio engit@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'
GIT_USERNAME
: nombre de usuario de GitHub del propietario del repositorio.GIT_REPOSITORY
: nombre del repositorio de GitHub al que quieres acceder.PROJECT_ID
: El ID del Google Cloud proyecto en el que has almacenado tus secretos.SECRET_NAME
: nombre del secreto que has creado en Secret Manager.- 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.
En GitHub, ve a la página principal del repositorio.
Debajo del nombre del repositorio, haz clic en Settings (Configuración).
En la barra lateral de la izquierda, haz clic en Claves de implementación.
En la página Implementar claves, busca las claves de implementación asociadas a tu repositorio y haz clic en Eliminar.
- Consulta cómo crear activadores de GitHub.
- Consulta más información sobre cómo usar recursos cifrados en Cloud Build.
- Consulta más información sobre Secret Manager.
Crear una clave SSH
Almacena la clave SSH privada en Secret Manager
Cuando crees una clave SSH, se creará un archivo id_github
en tu entorno. Como cualquier persona puede autenticarse en tu cuenta con este archivo, debes almacenarlo en Secret Manager antes de usarlo en una compilación.
Para almacenar tu clave SSH en Secret Manager, sigue estos pasos:
Se subirá el archivo id_github
a Secret Manager.
Añade la clave pública SSH a las claves de implementación de tu repositorio privado
Conceder permisos
Debes conceder permiso para acceder a Secret Manager a la cuenta de servicio que estés usando para la compilación.
Añadir la clave pública SSH a los hosts conocidos
La mayoría de los equipos contienen un archivo llamado known_hosts
, que contiene claves conocidas de hosts remotos. Las claves suelen recogerse de los hosts remotos al conectarse a ellos por primera vez, pero también se pueden añadir manualmente. Las claves de este archivo se usan para verificar la identidad del host remoto y protegerlo frente a la suplantación de identidad.
Para que Cloud Build se conecte a GitHub, debes añadir la clave pública SSH al archivo known_hosts
en el entorno de compilación de Cloud Build. Para ello, añade la clave a un archivo known_hosts.github
temporal y, a continuación, copia el contenido de known_hosts.github
en el archivo known_hosts
del entorno de compilación de Cloud Build.
En el directorio workingdir
, crea un archivo llamado known_hosts.github
y añade la clave pública SSH a este archivo:
ssh-keyscan -t rsa github.com > known_hosts.github
En la siguiente sección, cuando configure la compilación, añadirá instrucciones al archivo de configuración de Cloud Build para copiar el contenido de known_hosts.github
en el archivo known_hosts
del entorno de compilación de Cloud Build.
Configurar la compilación
Para configurar la compilación, haz lo siguiente:
Sustituye los valores de los marcadores de posición de los comandos anteriores por los siguientes:
Para obtener información sobre las cadenas multilínea de YAML que se usan en el fragmento de código anterior, consulta Cadenas multilínea de YAML.
Enviar la compilación
Para enviar la compilación, ejecuta el siguiente comando:
gcloud builds submit --config=cloudbuild.yaml .
El resultado debería ser 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
Limpieza
Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.
Eliminar el proyecto
La forma más fácil de evitar que te cobren es eliminar el proyecto que has creado para el tutorial.
Para ello, sigue las instrucciones que aparecen a continuación: