639 - Pass y GoPass, contraseñas en Linux y Android
Como gestionar contraseñas en #linux y #android con #pass y #gopass y una aproximación al scripting en linux de la mano de #fish
A raíz de la última tragedia acaecida en mi ordenador personal, por un lado, y por el otro, la nueva incorporación de la tablet Android a mi ecosistema de chismes, he estado pensando sobre pass y gopass. Pero no solo sobre estas, sino también sobre todo el ecosistema de nuevas herramientas que han aterrizado en mi universo Linux desde la llegada de Rust a mi entorno personal. Así, como ya adelanté, he decidido hacer una marcha atrás y tomar pass como gestor de contraseñas para mis scripts, reemplazando a gopass. Esto me lleva a tener que hacer un poco de scripting, de lo que te voy a hablar en este episodio, y además, un poco de reflexión sobre las ventajas e inconvenientes de toda esta miriada de herramientas.
Pass y GoPass, contraseñas en Linux y Android
Antes de nada, una pequeña introducción, sobre pass
y gopass
, y porque son tan importantes actualmente para mi.
¿Que es Pass?
Pass
es un gestor de contraseñas basado en la línea de comandos, que utiliza GPG
para cifrar y descifrar las contraseñas. Se trata de un proyecto de código abierto, y es una herramienta muy sencilla y fácil de usar. Cada una de las credenciales que queremos utilizar se guarda como un archivo, y que se pueden gestionar con las herramientas de línea de comandos de Unix.
En mi caso, y hasta la fecha no le había prestado la suficiente atención, porque no lo había entendido. No entendía su funcionamiento, porque básicamente, no había leído suficiente sobre él. Craso error. Y es que, pass es una herramienta muy potente, y muy sencilla de utilizar.
¿Que es GoPass?
GoPass
es una reescritura de Pass
en Go
, que añade algunas funcionalidades adicionales. Una de ellas es que te permite trabajar de forma intereactiva. Pero, en esencia, GoPass
es Pass
en Go
.
¿Para que utilizo actualmente gopass y en breve pass?
Como te he contado en alguna ocasión, mis dotfiles, que son los archivos de configuración que utilizo en mi sistema, están sincronizados con Git
, y los tengo en un repositorio público en GitHub
. Pero en ese repositorio, aquellos archivos de configuración que tienen variables sensibles, están en modo plantilla. Es decir, aparece el nombre de la variable pero no el contenido de la misma, como ya te puedes imaginar.
Cada vez que sincronizo los archivos de configuración, tengo que reconstruir esas plantillas a partir de las variables sensibles. Y para ello, utilizo GoPass
. GoPass
me permite acceder a las contraseñas, y reconstruir los archivos de configuración de forma segura.
Mis scripts en fish
A principios de este año te comenté, en contreto en el episodio 559, titulado Fish ha revolucionado mi terminal, te dije que había decidido migrar de shell
. Pasando, por un tortuoso camino que me sacó de Bash
, pasando por Zsh
hasta llegar a Fish
. En el que actualmente me encuentro, y que, a pesar de que todavía no se ha migrado a Rust, me siento realmente cómodo.
Si bien, estoy realmente satisfecho con esta shell
, lo cierto es que tiene una clara desventaja frente a otras alternativas como Bash
o Zsh
, y es que básicamente, tiene una comunidad mucho mas reducida, y por tanto, es mas complicado scripts para hacer determinadas operaciones. Cosa, que en el caso de las otras shell
es mas fácil. Casi cualquier cosa que quieras hacer en las otras shell, seguro que alguien ya lo ha hecho antes.
Sin embargo, a pesar de que la sintaxis de Fish
es distinta a la de las otras shell
la realidad es que me encuentro muy cómodo con esta shell
, y me ha permitido, poco a poco, ir adentrándome en ella, y creando mis propios scripts.
Y todo esto, te lo cuento, porque actualmente, estoy utilizando Fish
para el desarrollo de nuevas funcionalidades, como por ejemplo, la renderización de scripts. Y es por esto por lo que te traigo actualmente fish.
Y por otro lado están las variables de entorno, una herramienta, que hasta la fecha no la he explotado lo suficiente, pero que en los últimos tiempos estoy utilizando mucho. Y es que, las variables de entorno, son una forma muy sencilla de pasar información entre los distintos scripts, y que te permite, por ejemplo, pasar información de un script a otro, de forma muy sencilla.
Utilizando Fish con Gopass
Así, para renderizar los scripts utilizando gopass y fish, estaba utilizando esta función que te indico a continuación,
function yadmalt --description="generate templates with gopass variables"
# set variables
gopass list --flat | while read -l item
set variable $(string replace \/ _ "$item" | string upper)
echo $variable
set -xg $variable "$(gopass show --password $item)"
end
# configure templates
yadm alt
# unset variables
gopass list --flat | while read -l item
set variable $(string replace \/ _ "$item" | string upper)
set -e "$variable"
end
end
En este script, lo que hago es, primero, obtener la lista de contraseñas, y por cada una de ellas, obtengo el valor de la contraseña, y la guardo en una variable de entorno. Posteriormente, genero los archivos de configuración, y finalmente, elimino las variables de entorno.
Utilizando Pass con Fish
Ahora me toca realizar la misma operación con pass
, y no es tan complejo como me pudiera plantear inicialmente,
function unjinja --description="Fill scripts"
set STORE_PATH $(path normalize ~/.password-store)
echo $STORE_PATH
fd -g "*.gpg" $STORE_PATH | while read -l item
set key $(string replace "$STORE_PATH/" "" $item | path change-extension '')
set variable $(path basename $key | string upper)
set -xg $variable "$(pass $key)"
end
yadm list -a | while read -l item
if [ $(path extension $item) = ".jinja" ]
set jinja $(path normalize ~/"$item")
set output $(path change-extension '' "$jinja")
jinrender --jinja "$jinja" --output "$output"
end
end
fd -g "*.gpg" $STORE_PATH | while read -l item
set key $(string replace "$STORE_PATH/" "" $item | path change-extension '')
set variable $(path basename $key | string upper)
set -e "$variable"
end
end
Como ves, es muy similar al anterior, aunque he hecho algunos cambios, para utilizar jinrender
. Si recuerdas, te hablé de jinrender
en el episodio 635 titulado Crear miniaturas para YouTube con Inkscape. Esta misma herramienta me sirve para hacer la operación, y me gusta mucho mas que utilizar el sistema integrado de yadm
. Mas que nada porque este es un sistema que me he creado yo, y que me permite hacer las cosas a mi manera.
Siguientes pasos
Esto me lleva a la idea de completar la migración de gopass
a pass
y reemplazar las plantillas que tenía hasta el momento por estas nuevas plantillas que me parecen mucho mas elegantes, por las razones que te indiqué actualmente.
Un error
Como te conté en el episodio 623 Una tablet en la mochila y posteriormente en el 631, estoy utilizando yadm
en tanto en el equipo de escritorio como en la tablet Android. En este segundo caso, creé un repositorio llamado termux
único y exclusivo para la tablet. Y precisamente aquí es donde está mi error.
Esto me lo indicó en su momento Antonio. ¿Por qué no utilizas el mismo repositorio para ambos equipos? Y la verdad es que no se me había ocurrido. Y es que, en el fondo, es una idea muy buena. Y es que, si utilizo el mismo repositorio, puedo tener los mismos archivos de configuración en ambos equipos, y no tener que estar sincronizando entre ambos equipos. Y es que, al final, es lo que quiero, tener la misma configuración en ambos equipos.
En concreto, la propuesta era mantener dos ramas, una para el ordenador y otra para la tablet. Pero la verdad es que no es lo que quiero. Quiero utilizar una única rama para ambos dispositivos. Y para esto tengo que utilizar precisamente las plantillas de yadm
que me permiten en base al dispositivo personalizar la configuración para cada uno de ellos. Y esto es precisamente lo que voy a hacer.
Pero, de nuevo, no utilizaré yadm
, si no que voy a utilizar precisamente jinrender
para todo esto. Pero no porque piense que es mejor, ni nada por el estilo, sino porque soy el padre de la criatura.
Una reflexión
Todo esto e ha llevado a reflexionar sobre mi obsesión por las nuevas herramientas. En este caso, a mi necesidad de utilizar gopass
en lugar de pass
. Y es que, en el fondo, no necesitaba gopass
, si no que pass
me hubiera servido perfectamente. Pero, en el fondo, es mi obsesión por las nuevas herramientas, y mi necesidad de utilizarlas, lo que me ha llevado a utilizar gopass
.
Es fundamental a la hora de reemplazar una antigua herramienta por otra moderna tener en cuenta ventajas e inconvenientes. Y es que, en este caso, no he tenido en cuenta los inconvenientes de gopass
, y me he lanzado a utilizarlo sin tener en cuenta que pass
me hubiera servido perfectamente.
No solo es lo que me ofrece una herramienta nueva frente a una clásica. También tengo que tenemos que tener en cuenta su disponibilidad en todos los entornos en los que trabajamos y su facilidad, o no, a la hora de instalarlo.
Es conveniente que pongas su correspondiente shebang aunque este un poco obsoleto, caduco, vetusto y anacrónico pero quien copia y/o descarga el script y no tiene instalado fish en su ordenador y trate de ejecutarlo y le de hostias hasta en el carné.
Por cierto, Atareao creo que es necesario un pequeño esquema para guiar al lector, porque tienes un «pifostio» majo entre herramientas, shells y complementos de vim que estas volviendo loco al noble seguidor del podcast.
saludos
En general suelo poner el shebang, sin embargo, en este caso particular, por tratarse de funciones específicas de fish, no he considerado ponerlo.
Respecto al pifostio… Por lo que veo y deduzco de las estadísticas del podcast, no todos los oyentes escuchan todos los episodios. Hay temas que interesan mas que otros. Por ejemplo, hay gente que está mas interesada en self-hosted, y otros en Linux… Es difícil.
Sin embargo, me quedo con la idea de la guía, aunque realmente no se como llevarla a cabo, porque, lo cierto es que se trata de una evolución. No utilizo todas las herramientas actualmente, sino que algunas herramientas las he ido dejando por el camino y otras se han ido incoporando. Lo mismo sucede con la shell, etc.
Muchas gracias por tu comentario y sugerencia
Saludos