Cómo utilizar contraseñas cifradas en scripts Bash

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp

Contenidos

Una computadora portátil Linux al estilo de Ubuntu.

Si se ve obligado a usar una secuencia de comandos de Linux para conectarse a un recurso protegido con contraseña, probablemente se sienta incómodo al poner esa contraseña en la secuencia de comandos. OpenSSL resuelve ese problema por ti.

Contraseñas y secuencias de comandos

No es una buena idea poner contraseñas en scripts de shell. En realidad, es una muy mala idea. Si el guión cae en las manos equivocadas, todos los que lo lean podrán ver cuál es la contraseña. Pero si se ve obligado a usar un guión, ¿qué más puede hacer?

Puede ingresar la contraseña manualmente cuando el procedimiento llegue a ese punto, pero si el script se ejecutará sin supervisión, no funcionará. Por suerte, existe una alternativa a la codificación rígida de las contraseñas en el script. Contrariamente a la intuición, utiliza una contraseña distinto para lograr esto, junto con un cifrado sólido.

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 utilizar claves SSH para este caso, debido a que pretendemos que no tenemos ningún control o derechos de administrador sobre la computadora Fedora.

Vamos a hacer uso de los conocidos 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 cifrado y seguridad usan OpenSSL, es factible que ya esté instalado en su computadora. A pesar de esto, si no es así, solo lleva un momento instalarlo.

En Ubuntu, escriba este comando:

sudo apt get openssl

Instalar sshpass, use este comando:

sudo apt install sshpass

En Fedora, debe escribir:

sudo dnf install openssl

El comando para instalar sshpass es:

sudo dnf install sshpass

En Manjaro Linux, podemos instalar OpenSSL con:

sudo pacman -Sy openssl

Para terminar, para instalar sshpass, use este comando:

sudo pacman -Sy sshpass

Cifrado en la línea de comandos

Antes de comenzar a utilizar el openssl comando con scripts, vamos a familiarizarnos con él usándolo en la línea de comando. 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 openssl mando. Echaremos un vistazo a cada uno de ellos en un momento.

echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'

Estamos usando echo para enviar la contraseña de la cuenta remota a través de una tubería y al openssl mando.

los openssl los parámetros son:

  • enc -aes-256-cbc: El tipo de codificación. Estamos usando el cifrado de clave estándar de cifrado avanzado de 256 bits con encadenamiento de bloques de cifrado.
  • -md sha512: El tipo de resumen del mensaje (hash). Estamos usando el algoritmo criptográfico SHA512.
  • -a: Esto dice openssl para aplicar la codificación base 64 después de la etapa de cifrado y antes de la etapa de descifrado.
  • -pbkdf2: El uso de la función 2 de derivación de claves basada en contraseña (PBKDF2) hace que sea mucho más difícil que un ataque de fuerza bruta tenga éxito en adivinar su contraseña. PBKDF2 necesita 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.
  • -sal: El uso de un valor de sal aplicado aleatoriamente hace que la salida cifrada sea distinto cada vez, inclusive si el texto sin formato es el mismo.
  • -pass pass: ‘pick.your.password’: La contraseña que necesitaremos utilizar para descifrar la contraseña remota cifrada. Sustituir pick.your.password con una contraseña sólida de su elección.

La versión encriptada de nuestro rusty!herring.pitshaft La contraseña 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 el -d (descifrar) opción.

echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'

La cadena se descifra y nuestro texto original, la contraseña de la cuenta de usuario remoto, se escribe en la ventana del terminal.

Contraseña descifrada escrita en la ventana del terminal

Eso demuestra que podemos cifrar de forma segura la contraseña de nuestra cuenta de usuario remoto. Además podemos descifrarlo cuando lo necesitemos usando la contraseña que proporcionamos en la etapa de cifrado.

Pero, ¿esto verdaderamente mejora nuestra situación? Si necesitamos la contraseña de cifrado para descifrar la contraseña de la cuenta remota, ¿ciertamente la contraseña de descifrado deberá estar en el script? Bueno, sí lo hace. Pero la contraseña de la cuenta de usuario remoto cifrada se almacenará en un archivo oculto distinto. Los permisos en el archivo evitarán que cualquier persona excepto usted (y el usuario root del sistema, evidentemente) acceda a él.

Para enviar la salida del comando de cifrado a un archivo, podemos utilizar la redirección. El archivo se llama «.secret_vault.txt». Hemos cambiado la contraseña de cifrado a algo más sólido.

echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt

No ocurre 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 aqui no echo.

cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password'

La contraseña se descifró correctamente a partir de los datos del archivo. Usaremos chmod para cambiar los permisos de este archivo para que nadie más pueda tener acceso a él.

chmod 600 .secret_vault.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 utilizar el comando chmod en Linux

Utilizar OpenSSL en un script

Nuestro guión es bastante sencillo:

#!/bin/bash

# name of the remote account
REMOTE_USER=geek

# password for the remote account
REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password')

# remote computer
REMOTE_LINUX=fedora-34.local

# connect to the remote computer and put a timestamp in a file called script.log
sshpass -p $REMOTE_PASSWD ssh -T [email protected]$REMOTE_LINUX << _remote_commands
echo $USER "-" $(date) >> /home/$REMOTE_USER/script.log
_remote_commands
  • Establecemos una variable llamada REMOTE_USER a «geek».
  • Después establecemos 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 ssh comando para conectarse a la computadora remota.

  • los sshpass comando es el primer comando en la línea de conexión. Lo usamos con el -p (contraseña) opción. Esto nos posibilita especificar la contraseña que se debe enviar al ssh mando.
  • Usamos el -T (deshabilitar la asignación de pseudo-terminal) con la opción ssh debido a que no necesitamos tener un pseudo-TTY asignado en la computadora remota.

Estamos usando un corto aquí documento para pasar un comando a la computadora remota. Todo entre los dos _remote_commands las cadenas se envían como instrucciones a la sesión del usuario en la computadora remota; para este caso, es una sola línea de la secuencia de comandos 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.

Utilizar chmod para hacer que el script sea ejecutable.

chmod +x go-remote.sh

Todo lo que queda es probarlo. Arranquemos nuestro guión.

./go-remote.sh

Debido a que nuestro script es una plantilla minimalista para un script desatendido, no hay salida en 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 marcas de tiempo.

cat script.log

Tu contraseña es privada

La contraseña de su cuenta remota no está registrada en el script.

Y aún cuando la contraseña de descifrado es, en el script, nadie más puede tener acceso a su archivo «.secret_vault.txt» para descifrarlo y recuperar la contraseña de la cuenta remota.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.