viernes, 16 de diciembre de 2011

Túneles privados con SSH

El protocolo SSH (Secure SHell), que en principio se desarrolló como un sustituto de Telnet (línea de comandos de texto), ha crecido de manera que ahora es toda una suite de utilidades para comunicación encriptada. De entre las funcionalidades más útiles está la transferencia de ficheros (SFTP) y los túneles de comunicación segura y privada.
En este artículo vamos a explorar cómo podemos aprovecharnos de la tunelización sin grandes medios y mediante herramientas gratuitas y de fácil acceso en la red.
En comunicaciones, llamamos túnel a un canal de comunicación donde los paquetes o datagramas están encapsulados en un procolo encriptado negociado entre los dos extremos. De esta manera se cumplen las dos propiedades siguientes:
  • Cada paquete se encripta para que sólo pueda abrirlo el destinatario (privacidad).
  • Los paquetes contienen una firma elecrónica que sólo puede generar el nodo origen (autenticación).
De esta manera, nos aseguramos de que nadie que intercepte los paquetes puede leerlos ni suplantarlos. Un ejemplo típico de protocolo tunelizado es el conocido HTTPS que se usa para acceder a sitios web seguros en transacciones bancarias y otros usos. También son muy utilizados los servicios de VPN (Virtual Private Network) donde lo que se tuneliza es todo el tráfico entre redes.
En el caso de SSH, el propósito es general. Se va a encapsular cualquier tipo de paquetes entre puertos TCP, los cuales se desempaquetan de manera transparente tanto para la aplicación origen como la de destino, que sólo ven la comunicación como si fuera un canal local (localhost) en claro. Esto nos permite usarlo para casi cualquier aplicación. Véase el siguiente esquema:



Las utilidades de esta técnica son numerosas. Entre ellas:
  • Comunicación segura: Acceso a aplicaciones sensibles entre sedes de una empresa, o desde ubicaciones externas, atravesando redes no seguras. En este sentido es una alternativa cuando no se pueda usar VPN por su complejidad o por limitaciones en la red.
  • Traspasar limitaciones en redes que bloquean el acceso a determinados servicios. El típico ejemplo son las redes de empresas que impiden a sus empleados el acceso a ciertos protocolos o a sitios concretos.
  • Privacidad: Cuando queramos comunicarnos sin que nuestra actividad pueda ser monitorizada, ya sea por intrusos o por administradores de la red.
  • Acceso a puertos en NAT: Cuando se usa NAT, puede ser laborioso e inseguro estar mapeando los puertos de acceso a determinados servicios si estos no son de uso público. Con un túnel sólo hay que tener abierto el puerto que da acceso al servidor SSH, y a través de él se accede a todos los puertos del nodo de destino.
Caso de ejemplo

En este ejemplo, nos hemos desplazado con un portátil a una plaza pública donde el Ayuntamiento ofrece un Wifi de acceso a Internet. La inseguridad de esa red es total, dado que está abierta y cualquiera en muchos metros a la redonda podría monitorizar todo el tráfico sin problemas. Vamos a usar un túnel SSH para poder usar un cliente de correo (como Thunderbird, por ejemplo) sin temer por nuestra privacidad.
Para ello hemos preparado en casa un PC con Linux conectado a Internet (podríamos hacerlo en Windows, pero no es tan fácil y natural). En el Linux hemos dejado levantado el servicio ssh (que existe en cualquier distribución de Linux, generalmente bajo el paquete openssh-server). En el router hemos abierto el puerto SSH (por defecto el 22) para que se pueda acceder a él desde el exterior. Por supuesto, se puede mejorar la seguridad eligiendo otro puerto arbitrario (en este ejemplo usamos el 2222). Es imprescindible, lógicamente, que la red desde donde vamos a conectar permita conexiones con destino a ese puerto. Esto en la plaza pública es fácil, pero no es así, por ejemplo, en la red de una empresa según lo sofisticado del firewall o del proxy que usen.
En nuestro PC servidor tendremos que decirle al servicio ssh el puerto que debe escuchar. La configuración suele estar en /etc/ssh/sshd_config. Si queremos el puerto 22 no hay que cambiar nada. Nosotros cambiaremos la directiva Port con el valor 2222.
En el portátil, suponiendo que es Windows, podemos usar el cliente SSH libre: PuTTY. Es un ejecutable de pequeño tamaño sin instalación. Se puede obtener en la web de PuTTY. Descargaremos el binario putty.exe.
Abrimos una línea de comandos (Inicio->Ejecutar->cmd) de Windows y nos movemos a la carpeta donde tenemos el ejecutable del PuTTY. Allí solamente tenemos que lanzar este comando (todo en una sóla línea):
putty -P 2222 usuario@mi.casa -L 10000:servidor.smtp:25 -L 10001:servidor.pop:110
Donde los datos arbitrarios que he usado son:
  • 2222 es el puerto donde está abierto el servicio SSH en casa.
  • usuario es el usuario del PC servidor.
  • mi.casa es la IP (o DNS) del router en casa.
  • 10000 y 10001 son los puertos locales del portátil desde donde queremos acceder a los servicios de correo saliente (SMTP) y correo entrante (POP3), respectivamente. Podemos elegir cualquiera que no esté en uso.
  • servidor.smpt y servidor.pop3 son los servidores de correo de mi proveedor particular. Se puede usar también cualquiera de uso libre como el de Google.
  • 25 es el puerto SMTP del servidor de correo. 110 es el puerto del servidor POP3.
El servidor nos pide password y nos abre una línea de comando (opción -N si no queremos tenerla). Mientras tengamos abierta esta ventana, cada vez que conectemos con el puerto 10000 o 10001 en el PC local, estaremos abriendo un túnel encriptado hasta el servidor SSH en casa, y una vez allí va redireccionado, ya en claro, hasta el puerto 25 o 110, respectivamente, del servidor de correo. Alguien que monitorice el tráfico en la red pública (en cualquier punto entre el portátil y el servidor SSH) sólo ve que hay una conexión encriptada al puerto 2222 de determinada IP (la de casa), pero no puede saber qué información se está transmitiendo, ni su naturaleza (que es correo electrónico), ni el destino final de ésta (el servidor de correo).
Ya sólo hay que usar cualquier cliente de correo (como Thunderbird, por ejemplo), configurando la dirección SMTP (correo saliente) a localhost en el puerto 10000 y la entrante (POP3) como localhost al puerto 10001.

El lector avispado se habrá dado cuenta el potencial de esta técnica para cualquier tipo de servicio (escritorio remoto, proxy web, mensajería instantánea, etc.)

La seguridad se puede reforzar usando autenticación por clave pública y también estableciendo una lista de confianza (host.allow).

Fórum Técnico se ofrece gratuitamente y bajo licencia Creative Commons BY-NC-ND 3.0

No hay comentarios:

Publicar un comentario

Expresa tu opinión respetando a los demás y a unas mínimas reglas del lenguaje castellano.

Nota: solo los miembros de este blog pueden publicar comentarios.