Cómo usar contraseñas cifradas en Bash Scripts

Publicado: 2022-01-29
Una computadora portátil Linux estilo Ubuntu.
fatmawati achmad zaenuri/Shutterstock.com

Si 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.

Contraseña cifrada escrita 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' 

Anuncio publicitario

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.

Contraseña descifrada escrita en la ventana del 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' 

Anuncio publicitario

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 comando ssh .
  • Usamos la opción -T (deshabilitar asignación de pseudo-terminal) con ssh porque no necesitamos tener asignado un pseudo-TTY en la computadora remota.
Cómo usar "Aquí documentos" en Bash en Linux
RELACIONADO Cómo usar "Aquí documentos" en Bash en Linux

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 

Anuncio publicitario

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.