Cómo usar contraseñas cifradas en scripts Bash

Si se ve obligado a utilizar 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 este problema por ti.

Índice

    Contraseñas y scripts

    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, cualquiera que lo lea podrá ver cuál es la contraseña. Pero si se ve obligado a utilizar un script, ¿qué más puede hacer? Puede ingresar la contraseña manualmente cuando el proceso llegue a este punto, pero si el script necesita ejecutarse sin supervisión, no funcionará. Afortunadamente, existe una alternativa a la codificación de 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 establecer una conexión SSH a la computadora Fedora. El script debería 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 afirmamos que no tenemos derechos de control o administración en la computadora Fedora. Usaremos el conocido Kit de herramientas OpenSSL para administrar el cifrado y una utilidad llamada sshpass para proporcionar la contraseña en el comando SSH.

    Instale OpenSSL y sshpass

    Dado 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í, la instalación solo toma unos minutos. En Ubuntu, escriba este comando:

    sudo apt get openssl

    Instalar sshpass, use este comando:

    sudo apt install sshpass

    Cómo usar contraseñas cifradas en scripts Bash 14

    En Fedora, debe escribir:

    sudo dnf install openssl

    Cómo usar contraseñas cifradas en scripts Bash 15

    El comando para instalar sshpass es:

    sudo dnf install sshpass

    Cómo usar contraseñas cifradas en scripts Bash 16

    En Manjaro Linux, podemos instalar OpenSSL con:

    sudo pacman -Sy openssl

    Cómo usar contraseñas cifradas en scripts Bash 17

    Finalmente, para instalar sshpass, use este comando:

    sudo pacman -Sy sshpass

    Cómo usar contraseñas cifradas en scripts Bash 18

    Cifrado de línea de comando

    Antes de empezar 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. Encriptaremos esta contraseña usando openssl. Necesitamos proporcionar una contraseña de cifrado cuando hacemos esto. La contraseña de cifrado se utiliza en los procesos de cifrado y descifrado. Hay muchas configuraciones y opciones en el openssl pedido. Veremos 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'

    Cómo usar contraseñas cifradas en scripts Bash 19

    Utilizamos echo para enviar la contraseña de la cuenta remota a través de una tubería y en el openssl pedido. los openssl los parámetros son:

    • enc -aes-256-cbc: El tipo de codificación. Usamos 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). Usamos el algoritmo criptográfico SHA512.
    • -a: dice openssl 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 Derivación de clave basada en contraseña 2 (PBKDF2) hace que sea mucho más difícil para un ataque de fuerza bruta adivinar correctamente su contraseña. PBKDF2 requiere muchos cálculos para realizar el cifrado. Un atacante necesitaría replicar todos estos cálculos.
    • -es 100.000: define 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: 'elige.tu.contraseña': La contraseña que necesitaremos usar para descifrar la contraseña remota cifrada. Reemplazar pick.your.password con una contraseña segura de su elección.

    La versión encriptada de nuestro rusty!herring.pitshaft la contraseña está escrita en la ventana del terminal.
    Contraseña cifrada escrita en la ventana del terminal
    Para descifrar esto, necesitamos pasar esta cadena cifrada en 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'

    Cómo usar contraseñas cifradas en scripts Bash 20

    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
    Esto 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 durante la fase de cifrado. Pero, ¿mejora realmente 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 cifrada se almacenará en un archivo oculto diferente. Los permisos en el archivo evitarán que cualquier otra persona que no sea usted (y el usuario raíz del sistema, por supuesto) 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 por una más robusta.

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

    Cómo usar contraseñas cifradas en scripts Bash 21

    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 aquí no echo.

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

    Cómo usar contraseñas cifradas en scripts Bash 22

    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 acceder a él.

    chmod 600 .secret_vault.txt
    ls -l .secret_vault.txt

    Cómo usar contraseñas cifradas en scripts Bash 23

    El uso de una máscara de permiso de 600 elimina todo acceso para cualquier persona que no sea el propietario del archivo. Ahora podemos pasar a escribir nuestro guión.

    Utilice OpenSSL en un script

    Nuestro guión es bastante simple:

    #!/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 $REMOTE_USER@$REMOTE_LINUX << _remote_commands
    echo $USER "-" $(date) >> /home/$REMOTE_USER/script.log
    _remote_commands
    • Definimos una variable llamada REMOTE_USER a "friki".
    • Luego definimos 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 esta información podemos utilizar la ssh comando para conectarse a la computadora remota.

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

    Estamos usando un documento breve aquí para transmitir un comando a la computadora remota. Todo en el medio _remote_commands Las cadenas se envían 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 su propia dirección de computadora remota, cuenta de usuario remota y contraseña de cuenta remota. Usar chmod para hacer que el script sea ejecutable.

    chmod +x go-remote.sh

    Cómo usar contraseñas cifradas en scripts Bash 24

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

    ./go-remote.sh

    Cómo usar contraseñas cifradas en scripts Bash 25

    Debido a que nuestro script es un modelo 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 el archivo "script.log" se ha actualizado con las marcas de tiempo.

    cat script.log

    Cómo usar contraseñas cifradas en scripts Bash 26

    Tu contraseña es privada

    La contraseña de su cuenta remota no se guarda 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.

    ¡Haz clic para puntuar esta entrada!
    (Votos: 0 Promedio: 0)

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para asegurar que tengas una mejor experiencia al navegar por él. Leer más