Cómo utilizar contraseñas cifradas en scripts Bash

Una computadora portátil Linux al estilo de Ubuntu.
fatmawati achmad zaenuri / Shutterstock.com

Si se ve obligado a utilizar 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. De hecho, 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 utilizar un guión, ¿qué más puede hacer?

Puede ingresar la contraseña manualmente cuando el proceso llegue a ese punto, pero si el script se ejecutará sin supervisión, no funcionará. Afortunadamente, 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 diferente 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 usar claves SSH en este caso, porque pretendemos que no tenemos ningún control o derechos de administrador sobre la computadora Fedora.

Usaremos el conocido  kit  de herramientas OpenSSL para manejar el cifrado y una utilidad llamada sshpasspara introducir la contraseña en el comando SSH.

Instalación de OpenSSL y sshpass

Debido a que muchas otras herramientas de cifrado y seguridad utilizan OpenSSL, es posible que ya esté instalado en su computadora. Sin embargo, si no es así, solo lleva un momento instalarlo.

En Ubuntu, escriba este comando:

sudo apt obtener openssl

Para instalar sshpass, use este comando:

sudo apt install sshpass

En Fedora, debe escribir:

sudo dnf instalar openssl

El comando para instalar sshpasses:

sudo dnf instalar sshpass

En Manjaro Linux, podemos instalar OpenSSL con:

sudo pacman -Sy openssl

Finalmente, para instalar sshpass, use este comando:

sudo pacman -Sy sshpass

Cifrado en la línea de comandos

Antes de comenzar a usar el opensslcomando con scripts, familiaricémonos 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 comando. 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: 'pick.your.password'

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

Relacionado:  Su iPhone puede marcar automáticamente el 911 por usted

Los opensslparámetros son:

  • enc -aes-256-cbc : el tipo de codificación. Estamos utilizando 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 utilizando el algoritmo criptográfico SHA512.
  • -a : indica opensslque se 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 claves basada en contraseña 2 (PBKDF2) hace que sea mucho más difícil que un ataque de fuerza bruta tenga éxito en 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.
  • -sal : El uso de un valor de sal 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 usar para descifrar la contraseña remota cifrada. Sustitúyala pick.your.passwordpor una contraseña sólida de su elección.

La versión encriptada de nuestra  rusty!herring.pitshaft 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 opensslcon los mismos parámetros que usamos para cifrar, pero agregando la -dopción (descifrar).

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.

Relacionado:  Cómo verificar su condición cardiovascular (VO2 Max) en un Apple Watch

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. 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 remoto cifrada se almacenará en un archivo oculto diferente. Los permisos en el archivo evitarán que cualquier persona excepto usted (y el usuario root del sistema, obviamente) acceda 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 sólido.

echo 'oxidado! arenque.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 cataquí, no echo.

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

La contraseña se descifró correctamente a partir de los datos del archivo. Vamos a utilizarchmod para cambiar los permisos de este fichero para que nadie más puede acceder 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.

Usar 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: 'contraseña # secreta!

# computadora remota
REMOTE_LINUX = fedora-34.local

# conéctese a la computadora remota y coloque una marca de tiempo en un archivo llamado script.log
sshpass -p $ REMOTE_PASSWD ssh -T $ REMOTE_USER @ $ REMOTE_LINUX << _comandos_remotos
echo $ USER "-" $ (fecha) >> /home/$REMOTE_USER/script.log
_remote_commands
  • Configuramos una variable llamada REMOTE_USER«geek».
  • Luego establecemos una variable llamada REMOTE_PASSWDal 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 sshcomando para conectarnos a la computadora remota.

  • El sshpasscomando es el primer comando en la línea de conexión. Lo usamos con la -popción (contraseña). Esto nos permite especificar la contraseña que se debe enviar al sshcomando.
  • Usamos la -Topción (deshabilitar la asignación de pseudo-terminal) con sshporque no necesitamos tener un pseudo-TTY asignado a nosotros en la computadora remota.
Relacionado:  5 señales de que una VPN no es confiable 

Estamos usando un breve documento aquí para pasar un comando a la computadora remota. Todo lo que se encuentra entre las dos _remote_commandscadenas se envía como instrucciones a la sesión del usuario en la computadora remota; en este caso, es una sola línea del 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.

Úselo chmodpara 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 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.