Jonathan Reyes desarrollador de software

Cómo compartir secretos en un equipo usando pass

Cuando trabajamos en un equipo de desarrollo de software y queremos compartir credenciales, contraseñas, llaves, tokens u otro tipo de secretos, es importante hacerlo de una manera segura. Hay varios artículos que explican cómo conseguirlo con herramientas como BlackBox, git-crypt o 1Password.

Otra opción muy útil es el almacén de contraseñas pass, que hace uso de gpg para cifrar los secretos almacenados y, gracias a su integración con git, permite llevar un control de versiones y compartir secretos entre los miembros de un equipo. Aquí se detallan los pasos para crear un almacén de secretos compartidos.

Configuración inicial

Comenzamos instalando pass como se indica en la sección de descargas en su página oficial. En versiones recientes de Debian y Ubuntu, por ejemplo, se lo puede instalar desde los repositorios oficiales:

apt-get install pass

En Mac OS X, la instalación es igual de sencilla con Homebrew:

brew install pass

No existe una versión oficial para Windows, pero se puede utilizar el cliente Pass4Win en conjunto con Gpg4win. Sin embargo, esta guía no cubre el procedimiento en este sistema operativo.

Una vez completada la instalación, creamos un nuevo directorio y nos ubicamos en él:

mkdir secretos
cd secretos

A continuación, necesitamos crear un wrapper ejecutable para pass que nos permitirá almacenar los secretos en el directorio actual y no en el directorio por defecto (~/.password-store). De esta manera, evitamos mezclar los secretos del equipo con los personales. Este ejecutable también eliminará todas las instancias de la cadena .gpg de los argumentos que reciba, permitiendo el autocompletado con la tecla tabuladora.

Para esto, creamos un archivo llamado passw con el siguiente contenido:

#!/bin/bash

PASSWORD_STORE_DIR=. pass "${@//.gpg/}"

Posteriormente, agregamos permisos de ejecución al archivo:

chmod +x passw

Estamos listos para inicializar nuestro almacén de secretos, para lo cual ejecutamos el comando ./passw init seguido de los correos electrónicos de los miembros del equipo separados por espacios, así:

Es importante que todos los correos electrónicos tengan una llave PGP válida asociada; si no, los próximos pasos fallarán. Si nos hace falta una guía introductoria sobre este tema, tanto la EFF como la FSF han publicado excelentes recursos en español.

A continuación, inicializamos el repositorio de git corriendo:

./passw git init

Este repositorio es el que compartiremos con nuestro equipo.

A partir de este punto, podemos continuar usando los comandos usuales de pass, recordando siempre utilizar el wrapper ./passw que creamos al inicio. Por ejemplo, para añadir la contraseña del ambiente de QA de nuestro proyecto ejecutaríamos:

./passw insert logins/qa

Y para copiar la contraseña al portapapeles:

./passw -c logins/qa

La herramienta pass es bastante versátil y tiene muchos otros comandos y opciones, los cuales están documentados en su página oficial y, con más detalle, en su manual.

Sólo resta compartirlo con el equipo

El repositorio que hemos inicializado en los pasos anteriores debe ser subido a un servidor de git para que los otros miembros del equipo puedan clonar sus copias del almacén de secretos.

Todas las credenciales estarán cifradas, pero los correos electrónicos de los miembros del equipo serán visibles en el archivo .gpg-id y, posiblemente, en el historial de commits del repositorio. Si esta información se considera sensible, no debemos subir el repositorio a servicios públicos de alojamiento de git (por ejemplo, GitHub).

¿Qué pasa si alguien se va del equipo? ¿Y si alguien más se une?

Si queremos agregar o remover a alguien del equipo, basta con correr de nuevo el comando ./passw init con la lista actualizada de correos electrónicos. Sin embargo, quienes salgan del equipo aún tendrán acceso a las versiones anteriores del repositorio, por lo que es recomendable restablecer los secretos.