Tabla de contenidos
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 sshpass
para 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 sshpass
es:
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 openssl
comando 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 echo
para enviar la contraseña de la cuenta remota a través de una tubería y al openssl
comando.
Los openssl
pará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
openssl
que 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.password
por 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.
Para descifrar esto, necesitamos pasar esa cadena cifrada openssl
con los mismos parámetros que usamos para cifrar, pero agregando la -d
opció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.
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 cat
aquí, 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_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 conectarnos a la computadora remota.
- El
sshpass
comando es el primer comando en la línea de conexión. Lo usamos con la-p
opción (contraseña). Esto nos permite especificar la contraseña que se debe enviar alssh
comando. - Usamos la
-T
opción (deshabilitar la asignación de pseudo-terminal) conssh
porque no necesitamos tener un pseudo-TTY asignado a nosotros en la computadora remota.
Estamos usando un breve documento aquí para pasar un comando a la computadora remota. Todo lo que se encuentra entre las dos _remote_commands
cadenas 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 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 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.