Binary Coffee

¿Cómo y por qué firmar tus commits?

git github
# ¿Cómo y por qué firmar tus commits? A estas alturas del siglo XXI seguramente usas Git tanto para mantener un control estricto de las versiones que vas generando en tu proceso de desarrollo de software, como para estructurar tu flujo de trabajo individual o en equipo. Si no es así, realmente debieras comenzar ya mismo. En este breve tutorial vamos a conversar sobre los commits, por qué es importante firmarlos con una llave GPG y cómo hacerlo. ## Lo que sucede normalmente Normalmente cuando estamos programando, cerramos los commits a nombre nuestro y de nuestro correo. Esto sucede porque cuando instalas Git por primera vez, requiere que lo configures con estos comandos a nivel global: ``` git config --global user.name “Tu nombre” git config --global user.email “Tu correo” ``` O si lo configuras para un repositorio específico: ``` git config user.name “Tu nombre” git config user.email “Tu correo” ``` Esta forma tan común de trabajar deja expuesta una potencial vulnerabilidad que nos puede traer serios problemas cuando trabajamos en equipos de muchas personas. De esta manera puede suceder que un desarrollador configure su cliente de Git para realizar commits a nombre de otro miembro del equipo y con esto, introducir errores o vulnerabilidades en la base de código del proyecto para causar daños futuros. Imagínate que eres la persona encargada de revisar los commits antes de mezclarlos con las ramas que van a producción, y que alguien sube un commit haciéndose pasar por ti. Existe una probabilidad muy real de que no revises ese commit porque creas que fuiste tú mismo, y lo apruebes. De esta manera, un commit mal intencionado o erróneo podría terminar de cara a tus usuarios causando problemas o dejando incluso puertas traseras. Parece ciencia ficción, pero es un problema muy real en nuestra industria. O puede ser que sencillamente alguien use el terminal de un miembro del equipo para introducir un commit dañino (caso más verosímil 😉). La solución es firmar los commits usando claves GPG. ## ¿Cómo se hace? Te explicaré cómo hacerlo, a partir de lo que he visto en la documentación oficial de GitHub. El primer paso es generar una llave GPG en tu terminal de trabajo: ``` gpg --full-generate-key ``` Debes especificar el tipo de llave que deseas usar, o presiona Enter para aceptar la opción por defecto. Introduce el tamaño de la llave, GitHub recomienda al menos 4096 bits. Introduce el tiempo que la llave será válida (recomendable, por ejemplo: 1 año) o presiona Enter para aceptar la opción por defecto que implica que la llave nunca expira (no recomendable). Verifica que ĺas opciones que seleccionaste son correctas. Introduce tu información de usuario. Cuando se te pida tu dirección de email, asegúrate de introducir la dirección de correo verificada de tu cuenta de GitHub. Introduce una contraseña segura. Usa el comando `gpg --list-secret-keys --keyid-format LONG` para listar las llaves GPG para las cuales tienes sus llaves públicas y privadas. Conocer la llave privada de tu llave GPG es necesario para firmar commits o ingluso tags. ``` gpg --list-secret-keys --keyid-format LONG ``` De la lista de llaves GPG, copia la que desees usar. En este ejemplo el ID de la llave GPG es `3AA5C34371567BD2`: ``` $ gpg --list-secret-keys --keyid-format LONG /Users/hubot/.gnupg/secring.gpg ------------------------------------ sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10] uid Hubot ssb 4096R/42B317FD4BA89E7A 2016-03-10 ``` Ejecuta el siguiente comando, sustituyendo el ID de la llave GPG que deseas usar. En este ejemplo el id de la llave GPG es `3AA5C34371567BD2`: ``` $ gpg --armor --export 3AA5C34371567BD2 ``` Copia tu llave GPG, comenzando en `-----BEGIN PGP PUBLIC KEY BLOCK-----` y terminando en `-----END PGP PUBLIC KEY BLOCK-----`: Añade la llave GPG a tu cuenta de GitHub: * En la parte superior derecha de GitHub, haz click en tu foto de perfil y luego en **Settings**: ![](https://api.binary-coffee.dev/uploads/29a32b7f977742abb1bcc5a124464831.png) * En la barra de preferencias, haz click en **SSH and GPG keys**: ![](https://api.binary-coffee.dev/uploads/6bc817a414734d098821b4924ba2f759.png) * Luego haz click en “New SSH key”: ![](https://api.binary-coffee.dev/uploads/5ab912b71e4c4939a8f1a62298806c59.png) * En el campo “Key”, pega la llave GPG que copiaste anteriormente. ![](https://api.binary-coffee.dev//uploads/e2b50501c8a8436d94dcdd394eb87cb3.png) * Haz click en **Add SSH key**. * Para confirmar la acción, introduce tu contraseña de GitHub. Para decirle a tu cliente de Git que vas a usar una llave GPG para firmar tus commits, ejecuta los siguientes comandos, sustituyendo la llave de ejemplo por la tuya: ``` $ git config --global user.signingkey 3AA5C34371567BD2 $ git config --global commit.gpgsign true ``` Puedes configurar GIT para usar la llave GPG localmente en un repositorio: ``` $ git config user.signingkey 3AA5C34371567BD2 $ git config commit.gpgsign true ``` Edita el archivo de configuración de Git para que se firmen todos los commits automáticamente en tu repositorio. Abre el archivo `.git/config` y añade esta línea en la sección `[user]`. ``` signingkey = 3AA5C34371567BD2 ``` Un último paso es editar el archivo `~/.gnupg/pgp.conf` y añade estas dos líneas al final para evitar el error `no tty`: ``` no-tty use-agent ``` ¡Listo! A partir de este momento, cada vez que desees firmar un commit (que debiera ser siempre), debes correr este comando e introducir la contraseña asociada a la llave GPG: ``` $ git commit -S -m “your commit message” ``` Luego puedes subir tu commit al repositorio remoto: ``` $ git push ``` Ahora puedes navegar en GitHub hasta tu commit y comprobar que está verificado. ![](https://api.binary-coffee.dev//uploads/c87483d25ff545fe85b67db7b4630763.png) Puedes ver más información de tu commit verificado en el botón **Verified**: ![](https://api.binary-coffee.dev//uploads/6df081fd704d4637bbaa0c1c9ee8f377.png) **Nota:** Recuerda configurar tu IDE para que firme los commits automáticamente. Por ejemplo, si usas PyCharm debes seleccionar la opción **Sign-off commit**. ![](https://api.binary-coffee.dev//uploads/2dcc86bbfc534680804abb6262bcc122.png) Y esto es todo, lo que queda es difundir esta cultura de trabajo a nuestros compañeros de equipo y colegas en la comunidad. Ahora venga, a tomarnos un café binario y sigamos construyendo nuestras naves, ya con un poco más de seguridad en el trabajo. ¡Salud! 👩‍🚀 ☕️ 🚀
Opiniones