Cómo usar contraseñas cifradas en Bash Scripts
Publicado: 2022-01-29Si se ve obligado a usar un script de Linux para conectarse a un recurso protegido con contraseña, probablemente no se sienta cómodo al poner esa contraseña en el script. OpenSSL resuelve ese problema por usted.
Contraseñas y scripts
No es una gran idea poner contraseñas en scripts de shell. De hecho, es una muy mala idea. Si el script cae en las manos equivocadas, todos los que lo lean pueden ver cuál es la contraseña. Pero si se ve obligado a usar un script, ¿qué más puede hacer?
Puede ingresar la contraseña manualmente cuando el proceso llegue a ese punto, pero si el script se va a ejecutar sin supervisión, eso no funcionará. Afortunadamente, existe una alternativa para codificar las contraseñas en el script. Contrariamente a la intuición, utiliza una contraseña diferente para lograr esto, junto con un cifrado fuerte.
En nuestro escenario de ejemplo, necesitamos hacer una conexión remota a una computadora Fedora Linux desde nuestra computadora Ubuntu. Usaremos un script de shell Bash para hacer una conexión SSH a la computadora Fedora. El script debe ejecutarse sin supervisión y no queremos poner la contraseña de la cuenta remota en el script. No podemos usar claves SSH en este caso, porque pretendemos que no tenemos ningún control o derechos de administración sobre la computadora Fedora.
Vamos a hacer uso del conocido kit de herramientas OpenSSL para manejar el cifrado y una utilidad llamada sshpass
para introducir la contraseña en el comando SSH.
RELACIONADO: Cómo crear e instalar claves SSH desde el shell de Linux
Instalación de OpenSSL y sshpass
Debido a que muchas otras herramientas de encriptación y seguridad usan OpenSSL, es posible que ya esté instalado en su computadora. Sin embargo, si no es así, solo toma un momento instalarlo.
En Ubuntu, escriba este comando:
sudo apt obtener openssl
Para instalar sshpass
, use este comando:
sudo apt instalar sshpass
En Fedora, debe escribir:
sudo dnf instalar openssl
El comando para instalar sshpass
es:
sudo dnf instalar sshpass
En Manjaro Linux, podemos instalar OpenSSL con:
sudo pacman -Sy abre SSL
Finalmente, para instalar sshpass
, use este comando:
sudo pacman -Sy sshpass
Cifrado en la línea de comandos
Antes de comenzar a usar el comando openssl
con scripts, familiaricémonos con él usándolo en la línea de comandos. Digamos que la contraseña de la cuenta en la computadora remota es rusty!herring.pitshaft
. Vamos a encriptar esa contraseña usando openssl
.
Necesitamos proporcionar una contraseña de cifrado cuando lo hagamos. La contraseña de cifrado se utiliza en los procesos de cifrado y descifrado. Hay muchos parámetros y opciones en el comando openssl
. Echaremos un vistazo a cada uno de ellos en un momento.
echo 'oxidado!arenque.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'elegir.su.contraseña'
Estamos usando echo
para enviar la contraseña de la cuenta remota a través de una tubería y al comando openssl
.
Los parámetros openssl
son:
- enc -aes-256-cbc : el tipo de codificación. Estamos utilizando el cifrado de clave de 256 bits del estándar de cifrado avanzado con encadenamiento de bloques de cifrado.
- -md sha512 : El tipo de resumen del mensaje (hash). Estamos usando el algoritmo criptográfico SHA512.
- -a : Esto le dice a
openssl
que aplique la codificación base-64 después de la fase de cifrado y antes de la fase de descifrado. - -pbkdf2 : el uso de la función de derivación de clave basada en contraseña 2 (PBKDF2) hace que sea mucho más difícil que un ataque de fuerza bruta logre adivinar su contraseña. PBKDF2 requiere muchos cálculos para realizar el cifrado. Un atacante necesitaría replicar todos esos cálculos.
- -iter 100000 : establece el número de cálculos que utilizará PBKDF2.
- -salt : el uso de un valor salt aplicado aleatoriamente hace que la salida cifrada sea diferente cada vez, incluso si el texto sin formato es el mismo.
- -pass pass:'pick.your.password' : La contraseña que necesitaremos para descifrar la contraseña remota encriptada. Sustituya
pick.your.password
por una contraseña robusta de su elección.
La versión cifrada de nuestra contraseña rusty!herring.pitshaft
se escribe en la ventana del terminal.
Para descifrar esto, necesitamos pasar esa cadena cifrada a openssl
con los mismos parámetros que usamos para cifrar, pero agregando la opción -d
(descifrar).
eco U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'elegir.su.contraseña'
La cadena se descifra y nuestro texto original, la contraseña de la cuenta de usuario remoto, se escribe en la ventana de la terminal.
Eso prueba que podemos cifrar de forma segura la contraseña de nuestra cuenta de usuario remoto. También podemos descifrarlo cuando lo necesitemos utilizando la contraseña que proporcionamos en la fase de cifrado.
Pero, ¿esto realmente mejora nuestra situación? Si necesitamos la contraseña de cifrado para descifrar la contraseña de la cuenta remota, seguramente la contraseña de descifrado deberá estar en el script. Bueno, sí, lo hace. Pero la contraseña de la cuenta de usuario remota encriptada se almacenará en un archivo oculto diferente. Los permisos en el archivo evitarán que nadie, excepto usted, y el usuario raíz del sistema, obviamente, accedan a él.
Para enviar la salida del comando de cifrado a un archivo, podemos usar la redirección. El archivo se llama ".secret_vault.txt". Hemos cambiado la contraseña de cifrado a algo más robusto.
echo 'oxidado!arenque.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!contraseña' > .secret_vault.txt
No sucede nada visible, pero la contraseña se cifra y se envía al archivo ".secret_vault.txt".
Podemos probar que funcionó descifrando la contraseña en el archivo oculto. Tenga en cuenta que estamos usando cat
aquí, no echo
.
gato .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!contraseña'
La contraseña se descifra correctamente de los datos del archivo. Usaremos chmod
para cambiar los permisos en este archivo para que nadie más pueda acceder a él.
chmod 600 .bóveda_secreta.txt
ls -l .secret_vault.txt
El uso de una máscara de permisos de 600 elimina todos los accesos para cualquier persona que no sea el propietario del archivo. Ahora podemos pasar a escribir nuestro guión.
RELACIONADO: Cómo usar el comando chmod en Linux
Uso de OpenSSL en un script
Nuestro guión es bastante sencillo:
#!/bin/bash # nombre de la cuenta remota REMOTE_USER=geek # contraseña para la cuenta remota REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!contraseña') # computadora remota REMOTE_LINUX=fedora-34.local # conectarse a la computadora remota y poner una marca de tiempo en un archivo llamado script.log sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands echo $USUARIO "-" $(fecha) >> /home/$USUARIO_REMOTO/script.log _comandos_remotos
- Configuramos una variable llamada
REMOTE_USER
en "geek". - Luego configuramos una variable llamada
REMOTE_PASSWD
al valor de la contraseña descifrada extraída del archivo ".secret_vault.txt", usando el mismo comando que usamos hace un momento. - La ubicación de la computadora remota se almacena en una variable llamada
REMOTE_LINUX
.
Con esa información, podemos usar el comando ssh
para conectarnos a la computadora remota.
- El comando
sshpass
es el primer comando en la línea de conexión. Lo usamos con la opción-p
(contraseña). Esto nos permite especificar la contraseña que debe enviarse al comandossh
. - Usamos la opción
-T
(deshabilitar asignación de pseudo-terminal) conssh
porque no necesitamos tener asignado un pseudo-TTY en la computadora remota.
Estamos usando un breve documento aquí para pasar un comando a la computadora remota. Todo lo que hay entre las dos cadenas _remote_commands
se envía como instrucciones a la sesión del usuario en la computadora remota; en este caso, es una sola línea de script Bash.
El comando enviado a la computadora remota simplemente registra el nombre de la cuenta de usuario y una marca de tiempo en un archivo llamado "script.log".
Copie y pegue el script en un editor y guárdelo en un archivo llamado "go-remote.sh". Recuerde cambiar los detalles para reflejar la dirección de su propia computadora remota, cuenta de usuario remota y contraseña de cuenta remota.
Use chmod
para hacer que el script sea ejecutable.
chmod +x ir-remoto.sh
Todo lo que queda es probarlo. Encendamos nuestro script.
./ir-remoto.sh
Debido a que nuestro script es una plantilla minimalista para un script desatendido, no hay salida a la terminal. Pero si revisamos el archivo “script.log” en la computadora Fedora, podemos ver que las conexiones remotas se han realizado con éxito y que el archivo “script.log” se ha actualizado con las marcas de tiempo.
guión de gato.log
Su contraseña es privada
La contraseña de su cuenta remota no está registrada en el script.
Y aunque la contraseña de descifrado está en el script, nadie más puede acceder a su archivo ".secret_vault.txt" para descifrarlo y recuperar la contraseña de la cuenta remota.