viernes, abril 28, 2006

Tunel seguro con Secure Shell (SSH)

Mandar datos de una máquina a otra, a través de la red, entraña ciertos peligros fácilmente solucionables. Uno de ellos es el envío de datos en texto plano y sin encriptar. Cualquiera que nos escuche la red podrá capturar lo que quiera y hacer con los datos lo que le venga en gana, pero si encriptamos los datos pasando por dentro de un tunnel seguro el problema se solucionará.

Una vez levantado el tunel, deberemos configurar el aplicativo para que apunte al localhost por un puerto determinado, puerto que escuchará el stunel y reenviará a la máquina cliente (siempre la misma) por el puerto del ssh, y una vez entregado irá a buscar el puerto del aplicativo en la máquina cliente. Esto también es válido si solo tenemos un puerto abierto entre las dos máquinas.

Para levantar un tunel en una máquina Linux es muy sencillo:

# ssh -l user -N -f -L local_port:client_ip:client_port client_ip

Para utilizar la máquina como GW para usar ese tunnel, debemos añadir el flag "-g" quedando de la siguiente manera:

# ssh -l user -g -N -f -L local_port:client_ip:client_port client_ip

Si lo queremos levantar con un script sin que nos pida password, lo que deberemos hacer es generar unas claves en el servidor (yo se las he generado para el usuario root, pero no es muy aconsejable hacerlo con este usuario):

server:~# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
39:13:78:53:df:bc:08:f0:f9:06:bb:cf:f7:1a:00:99 root@server

server:~# ssh-copy-id -i .ssh/id_rsa.pub root@client_ip
15
Password:
Now try logging into the machine, with "ssh 'root@client_ip'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

server:~# ssh root@client_ip

Ahora ya no necesitamos introducir el password al conectar, es tan fácil como esto!
Si queremos mantener una comunicación entre un cliente y un servidor mysql de forma encriptada, quedaría de la siguiente forma (ejemplo):

# ssh -l root -N -f -L 1241:192.168.1.100:1241 192.168.1.100

Ah, y SSH también está disponible para Windows, no solo para Linux/Unix, así que no hay excusa! ;-)


-- La seguridad nos aporta tranquilidad, pero nunca debemos confiarnos --