Cuida las credenciales: aplicando sentido común al historial de la terminal

por | junio 4, 2016

Muchas veces lanzamos scripts con algún que otro parámetro que puede contener información sensible. Por ejemplo, puede ser una contraseña, un usuario o una cadena de conexión. El historial de la terminal recuerda toda la actividad de un determinado usuario. Tendremos que ser nosotros quienes apliquemos sentido común para mantener la seguridad del sistema. Pongamos como ejemplo un script para conectar con una BBDD MySQL de la siguiente manera:

#!/bin/bash

user=$1
pass=$2

# Show databases
mysql -u “$user” -p“$pass” -e 'show databases;'
...

Para llamar a este script realizaríamos normalmente lo siguiente, considerando como hemos visto que el primer parámetro $1 es el usuario y el segundo $2 es la contraseña:


./testscript.sh max M19aSS

El problema tras lanzarlo es que si hacemos un history encontramos como es obvio la entrada correspondiente:

…
1013  04/06/16 12:47:44 ./testscript.sh max M19aSS
…

Como vemos, se muestra el comando que hemos lanzado revelando la contraseña en claro. Por razones de seguridad, esto no es muy buena idea… Para evitarlo, podríamos añadir la siguiente línea al final del script:

history -d $( history | awk '{print $1}' | tail -1 )

Después tendremos que ejecutar el script con el comando source. La razón es que cuando invocamos un script típicamente con ./mi_script.sh, se crea una nueva shell en la que ejecutarlo. El historial de esa shell invocada es independiente del de la shell «padre», por lo que recibiríamos el siguiente error:

./testscript.sh: line 10: history: -d: option requires an argument
history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]

Precisamente porque history | awk '{print $1}' | tail -1 no es capaz de encontrar ninguna entrada. Como la entrada del historial que queremos borrar pertenece a nuestro usuario, lo que haremos será lanzar el script con source (que no invoca otra shell) como decía anteriormente:

source testscript.sh max M19aSS

Si ahora buscáramos con history, no deberíamos ver ninguna entrada correspondiente a la acción anterior.

Otra opción temporal consiste en deshabilitar temporalmente el historial antes de lanzar nuestro script:

set +o history

Una vez lanzado, podemos volver a habilitarlo con:

set -o history

Por supuesto, la opción más sencilla de todas es borrar la línea específica del historial una vez ejecutado nuestro script para no dejar a la vista información sensible que pueda comprometer la seguridad del sistema:

history -d [numerolinea]

Sin embargo, los métodos anteriores, una vez automatizados creo que resultan más cómodos y evitan despistes que en el día a día se puedan fácilmente cometer.