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 鈥淭u nombre鈥
git config --global user.email 鈥淭u correo鈥

O si lo configuras para un repositorio espec铆fico:

git config user.name 鈥淭u nombre鈥
git config user.email 鈥淭u 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:

  • En la barra de preferencias, haz click en SSH and GPG keys:

  • Luego haz click en 鈥淣ew SSH key鈥:

  • En el campo 鈥淜ey鈥, pega la llave GPG que copiaste anteriormente.

  • 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 鈥測our 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.

Puedes ver m谩s informaci贸n de tu commit verificado en el bot贸n Verified:

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.

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