639 - Pass y GoPass, contraseñas en Linux y Android

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

1:25
-3:15

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *