SSH restringido desde Windows

  • Actualizado: 1 marzo 2023
  • Publicado por primera vez: 4 septiembre 2015

ssh restringido windows

*

El otro día, un compañero me planteó el siguiente problema: ¿Cómo puedo hacer que un usuario de Windows ejecute, en un linux, unos comandos específicos a través de SSH sin saber el password del usuario destino?

Mi respuesta fue: Para lo del password, habrá que usar certificados. Para lo otro, déjame que te lo mire. Y así empezó el "viaje" que me llevó a conocer un poco más SSH. Para aclarar el escenario, voy a explicarlo con un poco más de detalle.

Tenemos a un usuario del dominio de Windows que va a ejecutar un fichero .bat o .ps1... Este fichero tendrá una llamada a la versión de linea de comandos de putty (plink) para ejecutar un script remoto en una máquina linux. Esta típica configuración presenta un gran problema, el usuario puede ver el password en claro en el fichero .bat. ¿Cómo solucionarlo? Vamos a ello.

 

Configuración del servidor Linux

El servidor Linux en el que se vayan a ejecutar los comandos no debe tener ninguna característica especial que lo diferencie de otros Linux. La primera opción que hay que configurar el el fichero authorized_keys del usuario que va a ejecutar los comandos:

[root@srerver]# cat /home/user/.ssh/authorized_keys
command="/usr/local/bin/wrapper.sh",no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa CLAVE_PUBLICA_SSH rsa-key-20150703

Esta línea realiza lo siguiente:

  • command="/usr/local/bin/wrapper.sh": Cuando se realice una conexión con la CLAVE_PUBLICA_SSH, ejecuta el script wrapper.sh.
  • no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding: Estas opciones deshabilitan las capacidades extras de SSH para evitar que se abuse de la cuenta utilizada.
  • ssh-rsa CLAVE_PUBLICA_SSH rsa-key-20150703: esta parte de la línea es donde se incluirá la clave pública RSA que se generará en los pasos siguientes.

Con la configuración actual, cuando se intente ejecutar un comando vía SSH, este no se ejecutará, ya que hemos puesto en la configuración que ejecute el script wrapper.sh. Este script será el encargado de comprobar que el comando que llegue sea uno de los permitidos y de ejecutarlo:

[root@server]# vim /usr/local/bin/wrapper.sh
#!/bin/sh
# Script: /usr/local/bin/wrapper.sh

case "$SSH_ORIGINAL_COMMAND" in
"/u01/script/elevated_command.sh")
$SSH_ORIGINAL_COMMAND
echo "elevated_comand ejecutado "
;;
"scp -r -p -f /etc")
$SSH_ORIGINAL_COMMAND
;;

*)
echo "Command: $SSH_ORIGINAL_COMMAND" >> ~/command.txt
exit 1
;;
esac

Este script, aprovecha la funcionalidad de SSH que guarda en la variable $SSH_ORIGINAL_COMMAND el comando original que se había pasado por parámetro. Por lo tanto, este script incluye en un switch todos los comandos permitidos para posteriormente, ejecutar el correcto.

Hay que tener en cuenta, que en muchas ocasiones, el comando que se ejecuta internamente, no es exactamente igual al que se pasa por parámetro. Por eso, se ha añadido la opción de *) que guardará en el fichero command.txt cual ha sido el comando interpretado.

No hay que olvidar que dicho script debe tener permisos de ejecución:

[root@server]# chmod +x /usr/local/bin/wrapper.sh

Configuración del equipo Windows

Windows todavía no dispone de herramientas nativas para la ejecución de comandos SSH. Por esto, vamos a necesitar diferentes herramientas:

Lo primero que necesitaremos, será generar el par de claves RSA. Para ello, ejecutaremos PuTTyGen. Para asegurarnos de que la clave sea lo suficientemente robusta durante unos años, habrá que cambiar en la parte inferior derecha el parámetro "Number of bits in a generated key:" de 2048 a 4096. Seguidamente deberemos pulsar en "Generate":

 

putty_key_generator-500x243.png

Una vez generada la clave, deberemos exportar la clave privada de dos formas diferentes, la nativa de Putty y la de OpenSSH. Para exportar la clave privada de forma nativa, pulsaremos en "Save private key", lo que nos abrirá un menú para guardar el fichero *.ppk

Para exportar la clave en formato OpenSSH, hay que pulsar en el menú "Conversions" y luego en "Export OpenSSH key" en formato *.key.  Esto es necesario porque en función del programa que utilicemos, necesitará la clave privada en un formato o en otro.

Por último, nos queda copiar la clave pública que se encuentra en el cuadro con título: "Public key for pasting into OpenSSH authorized_keys file". Una vez copiada, la incorporaremos al fichero authorized_keys del servidor Linux.

A continuación, se muestra un ejemplo de uso de dicho sistema:

@echo off
REM /* cwRsync utiliza una unidad virtual llamada /cygdrive/ por lo que las rutas debe
REM ser relativas a esa unidad /*
SET LOG_DIR="/cygdrive/C/logs"
SET LOG_DIR_NOTEPAD="C:\Programs\Notepad\logs"
SET RSYNC="C:\cwRsync_5.4.1\rsync.exe"
SET PLINK="C:\plink.exe"

REM En windows no es necesario encerrar el comando entre comillas simples. Si lo
REM hacemos, debermos incluir dichas comillas en el script wrapper.sh
REM Plink utiliza el formato de clave privada nativo de Putty en fichero *.ppk

%PLINK% -v -ssh -i C:\private.ppk user@10.0.0.1 /u01/script/elevated_command.sh

REM cwRsync utiliza el formato de clave privada de OpenSSH en fichero *.key

%RSYNC% -av -e "/cygdrive/c/cwRsync_5.4.1/ssh -i C:\private.key" user@10.0.0.1:/u01/logs %LOG_DIR%

Con esto hemos visto un ejemplo de ejecutar un comando mediante ssh y realizar un rsync sin necesidad de contraseña y limitando los comandos que se pueden ejecutar.

 

Nuevo llamado a la acción

*Vector de Web creado por stories - www.freepik.es