Guardar contraseñas en Linux

Unos días atrás expliqué cómo evitar que tu contraseña quede expuesta en la terminal a través del historial del shell, en Mac. Hoy vamos a ver cómo guardar contraseñas en form segura en Linux.

En el artículo enlazado más arriba mencionamos que es común exponer contraseñas al pasarlas como argumento en la línea de comandos. Y el compromiso de seguridad que ello implica. También puede ocurrir que tengamos que manejarnos con una cantidad decente de contraseñas y recordarlas y escribirlas todo el tiempo sea un problema. En ambas situaciones un keyring o una keychain es muy útil. Vamos a ver de qué se trata y cómo aprovecharlos.

Un keyring (o keychain) es una aplicación (usualmente nativa del sistema operativo) que nos permite almacenar contraseñas, claves PGP y certificados en forma segura. En este artículo vamos a concentrarnos sólo en las contraseñas pero esta introducción facilitará el aprender el resto de los usos más tarde.

La idea

Se trata de almacenar las contraseñas en una aplicación que luego nos permitirá recuperarlas. Para esto nos solicitará siempre que ingresemos la contraseña que corresponde a la credencial de nuestro usuario en el sistema operativo. Para confirmar que somos nosotros quienes solicitamos recuperar la clave. Y evitar que alguien que simplemente se siente frente al teclado de nuestro equipo, aún si está desbloqueado, pueda recuperar (y ver) estas passwords.

Una vez almacenada una contraseña podremos evitar escribirla aprovechando el operador de reemplazo de comando (command substitution) del shell. Si ejecutamos una aplicación ficticia que requiere la contraseña como argumento podríamos escribir:

$ app -u miUsuario -p $(secret-tool lookup user miUsuario context app)

La substitución del shell hará que secret-tool lookup user miUsuario context app sea reemplazado por la contraseña que retornará la aplicación secret-tool. Y de esta forma evitamos escribirla y que quede expuesta en el historial. Pero veamos cómo funciona exactamente secret-tool.

Gnome-keyring

La aplicación secret-tool se utiliza en conjunto con gnome-keyring. En linux disponemos también de una alternativa relacionada con KDE llamada KWallet. Que cumple la misma función pero que no voy a detallar aquí. Sin embargo si continuás leyendo este artículo podrás tener el concepto y leyendo la documentación de KWallet podrás encontrar los comandos equivalentes a los expuestos aquí.

Al momento de escribir esto pude confirmar que el paquete gnome-keyring viene instalado por defecto en un Ubuntu desktop. Si este no es el caso o si el equipo donde te encontrás no lo tiene. Simplemente hay que instalarlo:

$ sudo apt-get install gnome-keyring

Luego hay que instalar secret-tool, que no viene por defecto:

$ sudo apt install libsecret-tools

Ahora ya podremos almacenar nuestra primera contraseña en el keyring. Para esto será necesario que usemos atributos (con sus valores pertinentes) para poder identificar la contraseña y luego recuperarla. Estos atributos y valores son arbitrarios pero recomiendo utilizar algo que tenga sentido para organizar las contraseñas. Personalmente creo que es indispensable escribir el nombre de usuario al que pertenece la clave y el contexto en el que se usa. Es decir, si se trata de una clave para GitHub podría usar “github” como contexto. También tenemos que pasar una etiqueta que será usada para mostrar la contraseña en la lista. Pero ésta no nos sirve para recuperar el password desde la línea de comandos.

$ secret-tool store --label="Prueba" user leandro context artifactory
Password:

Llamando a la aplicación secret-tool y usando el comando store vamos a guardar una clave. Para el ejemplo puse un atributo user y su valor “leandro” y otro context y como valor “artifactory”. Insisto en que los nombres de los atributos son arbitrarios. Yo lo puse en inglés pero podrían ser en español. El valor de los atributos puede ser cualquier cosa pero tiene sentido que pongamos valores correspondientes a lo que el atributo que elegimos representa.

Inmediatamente nos pedirá que ingresemos la contraseña que queremos guardar. Yo ingresé “miClave” en este caso. Si es la primera vez que guardamos una contraseña gnome-keyring creará un keyring por defecto y nos pedirá que lo protejamos con una contraseña maestra. La cual deberemos ingresar para recuperar las claves. Es posible que en una instalación con una configuración distinta a la mía esto no sea solicitado y que la propia clave del usuario del sistema operativo sirva para acceder al keyring.

gnome-keyring

Con esto ya habremos guardado nuestra primera clave en el keyring. Ahora confirmaremos que fue guardada correctamente utilizando el comando que también nos servirá para utilizarla, por ejemplo, en un command substitution de bash.

$ secret-tool lookup user leandro context artifactory
miClave

Ejecutamos secret-tool con el comando lookup para buscar una contraseña en base a los atributos con los que la guardamos. Por supuesto paso los mismos atributos que antes pero no paso etiqueta. Y obtengo en la salida del programa lo que ingresé como clave cuando la guardé. Con esto ya sé que está lista para ser usada.

Un ejemplo de uso de esta clave sería al ejecutar Maven con una configuración que espera la contraseña del servidor de Artifactory en una propiedad de Maven llamada server.password.

$ mvn deploy -Dserver.id=miArtifactory -Dserver.username=leandro -Dserver.password=$(secret-tool lookup user leandro context artifactory)

Extras

La aplicación secret-tool tiene otros dos comandos que pueden ser útiles. Uno es para buscar todas las claves que tengan asociado cierto atributo. Si agrego otra contraseña para el mismo contexto del ejemplo anterior podría luego ejecutar el comando search y tener una salida de este tipo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ secret-tool search --all context artifactory
[/org/freedesktop/secrets/collection/Default_5fkeyring/2]
label = Prueba2
secret = otra
created = 2021-08-17 02:14:17
modified = 2021-08-17 02:14:17
schema = org.freedesktop.Secret.Generic
attribute.context = artifactory
attribute.user = hernan
[/org/freedesktop/secrets/collection/Default_5fkeyring/1]
label = Prueba
secret = miClave
created = 2021-08-17 02:06:21
modified = 2021-08-17 02:06:21
schema = org.freedesktop.Secret.Generic
attribute.context = artifactory
attribute.user = leandro

Si quier eliminar una de las contraseñas puedo utilizar el comando clear:

$ secret-tool clear user hernan context artifactory
$ secret-tool search --all context artifactory
[/org/freedesktop/secrets/collection/Default_5fkeyring/1]
label = Prueba
secret = miClave
created = 2021-08-17 02:06:21
modified = 2021-08-17 02:06:21
schema = org.freedesktop.Secret.Generic
attribute.context = artifactory
attribute.user = leandro

En este caso eliminé la contraseña asociada con el usuario hernan para el contexto artifactory. Y al volver a listar todas las claves de ese contexto podemos ver que ya no existe una para el usuario hernan.