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 Google Cloud servicio que almacena de forma segura claves de API, contraseñas y otros datos sensibles.
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 Secret Manager, haz lo siguiente:
Ve a la página de Secret Manager en la Google Cloud consola:
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 Settings.
En la barra lateral, haz clic en Claves de implementación 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 quieres 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 contenido 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 a la cuenta de servicio que usas para la compilación.
-
En la consola Google Cloud , ve a la página settings Cloud Build Permisos:
En la lista desplegable, selecciona la cuenta de servicio cuyos roles deseas cambiar.
Establece el estado del rol de
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. Las claves suelen recopilarse de los hosts remotos cuando se conectan a ellos por primera vez, pero también se pueden agregar de forma manual. Las claves de este archivo se usan para verificar la identidad del host remoto y proteger contra la suplantación de identidad.
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. Para ello, agrega la clave a un archivo known_hosts.github
temporal y, luego, copia el contenido de known_hosts.github
al 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: en el primer paso degcloud
, se accede a la llave SSH de Secret Manager y se 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 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 al que quieres acceder.PROJECT_ID
: Es el ID del proyecto 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 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