Conexiones remotas seguras SSH y encapsulado o tunneling de tráfico VNC.
Índice
Introducción
1. Instalación y configuración del servicio OpenSSH para Linux
1.1. Suite SSH
1.2. Modificar parámetros de /etc/ssh/sshd_config
1.3. Iniciar el servicio OpenSSH server
2. Instalación y configuración del servidor x11vnc
2.1. Servidor x11vnc
2.2. Instalación
2.3. Configuración
3. Instalación y configuración del cliente SSH Putty en el PC cliente
3.1. Instalación
3.2. Configuración de Putty para permitir conexiones con túneles
4. Instalación y configuración del cliente TightVNC Viewer
4.1. Configuración
4.2. Cómo iniciar el servicio desde Putty
4.3. Iniciar sesión desde consola
4.4. Establecer conexión
5. Comprobaciones de seguridad
5.1. ¿Cómo sabemos que hemos realizado correctamente los pasos indicados?
SSH, Secure Shell, es la herramienta alternativa segura a los programas rsh (remote shell), rlogin (remote login) y telnet, cuya finalidad no es otra que la de ejecutar comandos en un sistema remoto. También se puede usar para encapsular tráfico VNC con el objeto de iniciar aplicaciones de la máquina remota como si estuvieran en la nuestra o realizar conexiones TCP arbitrarias a través de túneles cifrados.
Para ello utilizaremos el proyecto OpenSSH, que es la versión libre de SSH que se usa en GNU/Linux, los Unix libres y varios sistemas operativos comerciales.
Con SSH podemos crear un túnel cifrado que encapsule el tráfico a otro servicio de alguna máquina accesible desde el equipo remoto. Dicho de otro modo, podemos conectarnos por SSH a un equipo y, al margen de la sesión de terminal que iniciemos, abrir un puerto en nuestro equipo que se conecte a otro puerto de otra máquina a la que podemos llegar desde la máquina donde se halle el servidor SSH.
1. Instalación y configuración del servicio OpenSSH para Linux
1.1. Suite SSH
SSH trata de una suite de varios programas, cuyos compenentes básicos son el cliente y el servidor: para poder conectarnos a un equipo con SSH debe estar ejecutándose el servidor en la máquina remota. Hablamos de ssh para referirnos al cliente y sshd para el servidor.
SSH se encuentra de serie en todas las distribuciones; al menos la parte del cliente. El servidor también lo podemos encontrar, pero en la mayoría de los casos desactivado.
En el proceso de instalación, OpenSSH genera un par de claves de cifrado RSA y DSA de forma automática en las que este tutorial se centrarará para la autenticación de los usuarios.
Como OpenSSH se encuentra en nuestros repositorios instalaremos el servicio con un simple:
# aptitude install openssh-server
Las claves generadas de forma automática no contienen ninguna passphrase, así que crearemos otro par de claves RSA con passphrase para que la autenticación de los users sea más segura:
$ ssh-keygen
En el proceso se nos solicita el path de almacenamiento, sugiriendo por defecto el fichero ~/ssh/id_rsa (~ es un atajo para $HOME) y nombre de la clave privada (la clave pública se guarda en un fichero que toma el mismo nombre pero añadiendo la extensión .pub). Por ejemplo: si la ubicación que introducimos es ~/.ssh/id_rsa, la parte pública de la clave se encontrará en el fichero ~/.ssh/id_rsa.pub.
Al mismo tiempo también se nos pregunta una passphrase para la clave. SSH nos requerirá esta passphrase cada vez que usemos la clave. En algunos casos, como por ejemplo para entrar en equipos de confianza, podemos escoger no poner ninguna contraseña. Con ello podremos entrar en un equipo remoto por SSH automáticamente, sin autenticación alguna. Es menos seguro, sin embargo para una red interna se gana comodidad.
Los pares de claves generadas por defecto con este comando son de 2048 bits, suficientemente seguras.
Acto seguido copiamos el contenido de la clave pública .pub en un archivo que crearemos en ~/.ssh con el nombre authorized_keys2, mientras que la clave privada se deberá exportar al cliente con el objeto de ser utilizada por el usuario para el que ha sido generada, en el directorio ~/.ssh (de no existir, lo creamos).
1.2. Modificar parámetros de /etc/ssh/sshd_config
En /etc/ssh se encuentra el archivo de configuración de OpenSSH que deberá ser adaptado a nuestro sistema y asimismo ofrezca mayor seguridad. Se trata de un archivo de texto, así que podemos editarlo con el editor que utilicéis como preferente:
El siguiente ejemplo es de un sshd_config para autenticación con claves RSA. Posteriormente a la instalación sustituyo el archivo de configuración de sshd_config por el modelo personalizado:
# $OpenBSD: sshd_config,v 1.65 2003/08/28 12:54:34 markus Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.
#Port 22
#Protocol 2,1
Protocol 2
# Por defecto sshd escucha las peticiones de todas las interfaces del sistema, pero podemos limitar el acceso a través de una interfaz que sólo se pueda acceder desde la red local. Para ello podemos establecer: # ListenAddres 192.168.1.2, considerando que que el servidor a configurar posea la Ip 192.168.1.2
#ListenAddress 0.0.0.0
#ListenAddress ::
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 768
# Logging
#obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#Denegamo es acceso al usuario root
PermitRootLogin no
# The following setting overrides permission checks on host key files
# and directories. For security reasons set this to "yes" when running
# NT/W2K, NTFS and CYGWIN=ntsec.
StrictModes yes
#Permitimos la autenticación de intercambio de claves pública-privada RSA
RSAAuthentication yes
PubkeyAuthentication yes
#Archivo donde se almacenan las claves públicas. Le asignamos el valor 2 al final, pues algunas aplicaciones utilizan esa nomenclatura.
AuthorizedKeysFile /.ssh/authorized_keys2
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
IgnoreUserKnownHosts yes
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#Denegamos la autenticación por contraseña
PasswordAuthentication no
PermitEmptyPasswords no
# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCreds yes
# Set this to 'yes' to enable PAM authentication (via challenge-response)
# and session processing. Depending on your PAM configuration, this may
# bypass the setting of 'PasswordAuthentication'
#UsePAM yes
#AllowTcpForwarding yes
GatewayPorts yes
#En nuestro caso permitiremos la ejecución remota de aplicaciones gráficas
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
#KeepAlive yes
#UseLogin no
UsePrivilegeSeparation no
#PermitUserEnvironment no
#Compression yes
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS yes
#PidFile /var/run/sshd.pid
MaxStartups 10:30:60
# default banner path
Banner /etc/issue.net
# override default of no subsystems
Subsystem sftp /usr/sbin/sftp-server
#Permitir el acceso a determinados users desde ciertos clientes
#Allowusers usuario1 usuario2 usuario3@dirección_ip usuario4@dirección_ip
1.3. Iniciar el servicio OpenSSH server
Ahora ya podremos iniciar el servicio desde una consola:
# /etc/init.d/ssh start
2. Instalación y configuración del servidor x11vnc
2.1. Servidor x11vnc
x11vnc es un servidor VNC mediante el cual podremos conectarnos desde un cliente VNC instalado en cualquier otra maquina remota, tomando el control remoto de su escritorio usando el ratón, monitor y teclado, todo ello usando el contenido del framebuffer de una sesión X11 existente.
2.2. Instalación
x11vnc se encuentra en los repositorios de Debian, por lo tanto será tan fácil instalarlo como ejecutar el siguiente comando desde un terminal:
# apt-get install x11vnc
2.3. Configuración
El archivo de configuración de x11vnc se encuentra en nuestro home con el atributo oculto .x11vncrc. Para nuestro caso, lo editaremos y dejaremos sus parámetros por defecto a excepción de la siguiente línea que descomentaremos, con el objeto de que el servidor se mantenga en escucha sólo para su propia máquina. Esto impide las conexiones remotas atacando a la dirección Ip del servidor y lo habremos preparado para realizar el túnel sobre SSH.
- localhost # default:offImportante: También podremos configurar nuestro servidor VNC a través de su interfaz gráfica, en cambio con Lenny encontré un bug en el sentido de que al salvar el archivo de configuración descomenta todas las líneas, dejando el servicio sumido en un bucle que impide cualquier intento de logueo. Igual los desarrolladores lo han solucionado a estas alturas.
Para configurarlo a través de su interfaz gráfica ejecutamos desde un terminal el siguiente comando:
$ x11vnc -gui -passwd contraseña
El parámetro -gui nos lanza la interfaz gráfica.
El parámetro -passwd permite introducir una contraseña que servirá para poder loguearnos desde una máquina remota con un cliente VNC. Esta opción es obligatoria y no podemos dejarla en blanco. No obstante no será de importancia ahora, pues sólo utilizaremos este servicio para configurar x11vnc, habida cuenta de que a posteriori lo iniciaremos desde un cliente remoto SSH y la contraseña se pierde en cada cierre de sesión.
Obtendremos la siguiente ventana de configuración:

En el menú Permissions marcamos la opción Localhost para luego en el menú Actions seleccionamos Settings: y save-settings para guardar la nueva configuración.
Una vez guardada la configuración paramos el servicio x11vnc desde la consola con Ctrl+c.
3. Instalación y configuración del cliente SSH Putty en el PC cliente
3.1. Instalación
Con el objeto de iniciar sesión por SSH desde una máquina remota podemos utilizar un terminal o un cliente muy completo como Putty. Personalmente prefiero administrar mis conexiones seguras desde este último. Los siguientes pasos se han realizado desde un cliente Windows, pero son exactamente los mismos para Linux.
Putty es una aplicación cliente SSH que no necesita instalación. Podemos descargarla de http://www.chiark.greenend.org/uk/, Putty, Download. En el caso de Debian esta aplicación gráfica se encuentra en sus repositorios, así que bastará ejecutar en un terminal:
# apt-get install putty
3.2. Configuración de Putty para permitir conexiones con túneles
Después de ejecutar Putty, En Session > Host Name (or IP address), especificamos la Ip o el nombre de la máquina remota donde corre el servidor SSH.

Una vez configurado por completo la podremos salvar dándole el nombre que queramos en Saved Sessions, pero eso será después de pasar por SSH > Tunnels y Auth.
Ahora nos vamos a SSH > Tunnels, para configurar el túnel:
En Source port escribimos 5900 y en Destination; 127.0.0.1:5900. Pulsamos sobre Add y se nos pasará a Forwarded ports: Debemos marcar Local ports accept connections from other hosts.

Pasamos a Auth, donde le indicaremos la ubicación de la clave privada a utilizar para la autenticación de la conexión. Dicha clave será la que habíamos generado con aterioridad y que previamente habremos importado en la máquina cliente y convertida a formato .ppk. En nuestro caso la he llamado quillo.

Importante: Las claves privadas generadas con ssh-keygen pueden ser usadas desde una consola, sin embargo para utilizarla con el cliente Putty será necesario convertirla en un formato soportado por éste. Para ello emplearemos una herramienta llamada PuttyGen:

El proceso es tan sencillo que obviamos este paso. Una vez efectuado comprobaremos que se nos habrá generado una clave privada soportada por putty con extensión .ppk a partir de la clave privada creada con ssh-keygen.
La conversión de la clave privada de origen openssh a formato soportado por putty en un cliente Linux la efectuamos con el siguiente comando desde una consola:
$ puttygen nombre_clave_openssh -o nombre_clave.ppk
El resto de secciones del cliente Putty las dejamos como se hallan por defecto, entre otras cosas, por seguridad.
Ya tenemos configurado el cliente SSH, así que podemos iniciar sesión cuando queramos.
Una vez hayamos establecido conexión por SSH, podemos iniciar sesión por un túnel seguro a través de TightVNC, para emular un escritorio desde la máquina remota en nuestra propia máquina.
4. Instalación y configuración del cliente TightVNC Viewer
4.1. Configuración
Se da por hecho que tenemos instalado el cliente TigthtVNC viewer, aunque podemos usar cualquier otro (en Linux uso VNC Viewer), así que sólo queda, de forma muy sencilla, establecer conexión con el servidor.
Procederemos a ello escribiendo la Ip de localhost, 127.0.0.1 o la palabra localhost, para iniciar sesión.
Importante: Debemos previamente tener abierta sesión sobre SSH para poder acceder, además como haber iniciado el servicio x11vnc desde la consola de Putty, de lo contrario sería rechazada la solicitud.
4.2. Cómo iniciar el servicio desde Putty
Escribimos x11vnc -passwd contraseña en la consola de sesión de Putty.

4.3. Iniciar sesión desde consola
Si en lugar de utilizar el cliente Putty para iniciar sesión por ssh, preferimos un terminal, entonces ejecutamos el siguiente comando:
$ ssh -L 5900:127.0.0.1:5900 usuario@dirección_ip_servidor
Una vez conectados lanzamos el servidor x11vnc:
usuario@servidor:~$ x11vnc -passwd contraseña
4.4. Establecer conexión
Después de haberse iniciado el servicio x11vnc ya podremos establecer conexión con TightVNC viewer. Para ello escribimos localhost o la dirección Ip 127.0.0.1 y pulsamos sobre Connect.

Posteriormente nos pedirá la password que será aquella establecida al iniciar el servidor x11vnc.

Con estos sencillos pasos ya podremos haber iniciado conexión segura con máquinas remotas.
5. Comprobaciones de seguridad
5.1. ¿Cómo sabemos que hemos realizado correctamente los pasos indicados?
Podemos intentar establecer conexión con TightVNC viewer hacia la dirección Ip del equipo remoto y comprobaremos que la solicitud será rechazada.
Realizaremos una verficación de las conexiones activas establecidas a través del comando netstat y sus modificadores –n y -b desde una consola del Símbolo del Sistema.

Se observa cómo se establece conexión de localhost, sobre la propia máquina, hacia el puerto por defecto de x11vnc, el 5900 y la respuesta de Putty, y hacia la máquina remota por el puerto seguro de SSH, el 22. Por lo tanto, el túnel se ha creado correctamente y de forma segura.
Aún podemos ir más lejos y ejecutar un analizador de protocolos potente como Wireshark, veremos cómo nos devuelve sólo capturas de tráfico encriptado.
