En ocasiones un administrador de sistemas tiene que realizar actividades de mantenimiento o acceso a información que se encuentra ubicada en servidores remotos, antiguamente, como ya se ha comentado en post anteriores, para el acceso a maquinas remotas se solía implementar soluciones como Telnet, sin embargo debido a las vulnerabilidades encontradas en dicha herramienta, rápidamente los administradores de sistemas optarón por un enfoque distinto donde la seguridad en el canal de comunicación y la transmisión de datos tuviera unos mínimos de seguridad, con esta idea, surgió SSH (Secure Shell).

SSH permite la conexión con servidores de forma segura por medio de una comunicación completamente cifrada entre el host origen y el destino, de esta forma los ataques pasivos de sniffing no consiguen obtener las credenciales de acceso al servicio ni la información intercambiada en texto claro (tal y como ocurría con Telnet) dado que solamente ambos extremos de la conexión disponen de las correspondientes claves publica/privada, solamente estos hosts podrán descifrar la información enviada entre ellos. SSH permite el establecimiento de conexiones seguras sobre medios inseguros (como una red pública o internet) además de que permite una gran cantidad de operaciones sobre dichas conexiones, como por ejemplo la creación de túneles cifrados, creación de proxys SOCKS, Port Forwarding, X11 Forwarding, etc. Todas estas características y mas se verán a lo largo de esta serie de post. A continuación se indicará el proceso de instalación de OpenSSH (implementación libre de SSH), algunos conceptos relacionados con el intercambio de claves y los formatos admitidos por SSH.

INSTALAR OPENSSH

En maquinas GNU/Linux con distribuciones basadas en Debian se pueden instalar directamente OpenSSH desde linea de comandos con el gestor de paquetes APT u otro ya que contiene los repositorios oficiales de Debian y Ubuntu contienen los paquetes necesarios para instalar OpenSSH.

sudo apt-get install openssh-server

En otras distribuciones el proceso de instalación también es sencillo, basta con seguir el clásico procedimiento de desempaquetar e instalar el software utilizando el script configure y el comando make. Para descargar y obtener más información sobre OpenSSH ir a su sitio web. http://www.openssh.com/

Por otra parte, para que OpenSSH funcione correctamente también es necesario tener instalado OpenSSL, si se trata de sistemas basados en Debian y se ha ejecutado el comando APT anteriormente indicado, el gestor de paquetes intentará descargar e instalar OpenSSL automáticamente, en el caso de que no sea bajo Debian se deberá hacer manualmente, ver el sitio oficial de openssl aquí: http://www.openssl.org/

Una vez instalado, su uso mas sencillo para la conexión con un host remoto tiene la siguiente sintaxis:

ssh <DIRECCION_IP>

Ahora, OpenSSH se instala como servicio en maquinas GNU/Linux y como cualquier servicio es posible arrancarlo y detenerlo en cualquier momento.

/etc/init.d/ssh stop * Stopping OpenBSD Secure Shell server sshd [ OK ]/etc/init.d/ssh start

* Starting OpenBSD Secure Shell server sshd [ OK ]

/etc/init.d/ssh restart

* Restarting OpenBSD Secure Shell server sshd [ OK ]

Obviamente, no se han tenido en cuenta ninguna de las opciones de las que dispone OpenSSH, esto se verá a continuación.

OPCIONES BASICAS EN OPENSSH

Existen algunas opciones básicas para el uso de OpenSSH que permiten establecer una conexión con un servidor remoto, ejemplos de algunas de estas opciones se listan a continuación:

>ssh -p 22 root@192.168.1.34

Realiza una conexión con el host remoto por medio del puerto 22, Por defecto el servicio se encuentra ejecutándose en dicho puerto, pero algunos servicios pueden ser configurados para que el puerto de escucha sea otro distinto.

>ssh -l adastra 192.168.1.34

Realiza una conexión al servidor remoto utilizando el usuario “adastra” para realizar la autenticación en el servidor remoto.

>ssh -p 22 root@192.168.1.34 «ls /tmp» root@192.168.1.34’s password:

orbit-Debian-gdm

Realiza una conexión con el host remoto utilizando el puerto 22 y el usuario “root” y finalmente especificando un comando que se debe ejecutar en el servidor remoto una vez sea verificada la contraseña ingresada y la autenticación se encuentre establecida. Una vez el comando termina su ejecución la conexión SSH se cierra de forma normal.

>ssh -p 55 root@192.168.1.34 «ls /bin | grep -i sh»root@192.168.1.34’s password:

bash

dash

rbash

sh

sh.distrib

Realiza una conexión con el host remoto utilizando el puerto 55 y el usuario “root”, finalmente ejecuta un comando que se lleva a cabo en la maquina remota, dado que los comandos en GNU/Linux permiten una variedad de opciones amplia se puede “jugar” un poco y manipular los resultados de los listados con el comando grep (como en este caso) esta manipulación se ejecuta en el servidor, sin embargo cabe anotar que también podría realizarse en el lado del cliente.

>ssh -p 22 root@192.168.1.34 «ls /bin» | grep -i sh
root@192.168.1.34’s password:bash

dash

rbash

sh

sh.distrib

Este comando es equivalente al anterior, la diferencia radica en que el filtrado de los resultados retornados por el comando “ls” que se ha ejecutado en la maquina remota, se lleva a cabo en la maquina que ha establecido la conexión (maquina local) a efectos prácticos en este caso los resultados han sido los mismos, sin embargo en otras situaciones un poco más especificas puede ser útil realizar estas operaciones en el host local.

>ssh -p 22 -C root@192.168.1.34

Este comando es equivalente a los primeros ejemplos que se han indicado anteriormente, sin embargo se utiliza la opción -C que permite la compresión de todos los datos y la información que viaja entre el origen y el destino, lo que permite ahorrar ancho de banda y recursos en el segmento de red. El algoritmo que utiliza OpenSSH para el proceso de compresión es el mismo que se utiliza en la utilidad gzip y el nivel puede ser controlado por la opción “CompressionLevel” que se puede especificar con la opción “-o”.

ssh -p 22 -C -f root@192.168.1.34 «ls /bin | grep -i sh»
root@192.168.1.34’s password:root@adastra-VPCEB3C5E:/home/adastra# bash

dash

rbash

sh

sh.distrib

En este ejemplo se establece una conexión con el host remoto indicando que se realice la compresión de todos los datos intercambiados entre ambos hosts además de esto, también se especifica la opción “-f” que obliga a OpenSSH a ejecutarse como un proceso en background, después de que se establezca la conexión del ejemplo anterior y se ejecute el comando especificado, el proceso se va a quedar “esperando” esta es la diferencia entre los resultados de este comando y el indicado en lineas anteriores.

FICHEROS DE CONFIGURACION EN OPENSSH

Como seguramente hasta este punto quedará claro, SSH maneja un modelo “cliente/servidor” en donde un cliente se conecta a un servidor y accede a una consola remota o ejecuta comandos sobre dicha maquina sobre un canal de comunicación segura, sin embargo, dado que se pueden realizar redirecciones de las conexiones a host remotos y crear conexiones hacia múltiples puntos por medio de puentes de conexión y forwarding (algo que se verá en profundidad en la próxima entrada) por este motivo en OpenSSH existen ficheros de configuración tanto para clientes como para servidores donde se especifican diferentes características relacionadas con opciones globales, procesos de autenticación, entre otras cosas. Los ficheros de configuración en cada uno de los puntos de una conexión SSH se encuentran ubicados en el directorio de configuración global /etc/ssh en este directorio se encuentran ubicados los siguientes ficheros en base a la función que realicen en el proceso de conexión (cliente o servidor)

Cliente (ssh, scp y sftp):

ssh_config: Se trata del fichero de configuración principal de la parte del cliente, por defecto OpenSSH cargará este fichero si y solo si el usuario no tiene el mismo fichero ubicado en su directorio de usuario en ~/.ssh/config

Por otro lado, es importante anotar que, cuando se ha establecido una conexión con un servidor por primera vez, OpenSSH genera de forma automática un par de claves publica/privada que van a permitir al usuario identificar el servicio como conocido, la parte publica de estas claves se almacena en el servidor y la privada en el cliente, en concreto estos ficheros se almacenan en el lado del cliente en el directorio ~/.ssh/known_hosts, si por algún motivo estos ficheros cambian o son modificados por alguien se producirá un error en el proceso de conexión. Por otro lado las claves publicas autorizadas se almacenan en el directorio ~/.ssh/authorized_keys las cuales pueden ser posteriormente utilizadas por el cliente empleando la opción “-i” que permite especificar un fichero *.pub que le permitirá al cliente conectarse al servidor sin que este solicite contraseña, siempre y cuando el servidor consiga validar la identidad del cliente dentro de sus ficheros de identificación (esto puede llegar a ser un vector de ataque en aquellas ocasiones en las que un atacante tiene acceso al sistema de archivos de un cliente valido, tal como se ha indicado en una entrada anterior aquí: https://thehackerway.wordpress.com/2011/06/18/penetrando-sistemas-bajo-plataforma-gnulinux-vulnerable-con-metasploit-framework-%E2%80%93-parte-ii/)

Todo lo relacionado con las claves publicas/privadas y opciones de configuración de estos ficheros se definirán en las siguientes entradas, de momento es importante tener estos conceptos claros.

Servidor (sshd):

sshd_config: Fichero de configuración global del servicio SSHD.

sshd_host_dsa_key: Clave privada DSA utilizada por el servicio SSHD para la generación de claves publicas/privadas en formato DSA.

sshd_host_dsa_key.pubClave publica DSA utilizada por el servicio SSHD

sshd_host_key: Clave privada RSA para servicio SSHD versión 1

sshd_host_key.pub: Clave publica RSA para el servicio SSHD versión 1

sshd_host_rsa_key: Clave privada RSA para el servicio SSHD versión 2

sshd_host_rsa_key.pub: Clave publica RSA para el servicio SSHD versión 2

id_dsa: Contiene la identidad de autenticación en formato DSA del usuario (Cuando el cliente utiliza la opción “-i” y especifica el cifrado DSA)

id_dsa.pub: Contiene la clave publica DSA del usuario

id_rsa: La clave publica RSA que contiene la identidad del usuario, este fichero es utilizado en versiones de SSH 2.

identity: La clave privada RSA utilizada en versiones SSH versión 1.

En las próximas entradas relacionadas con SSH se verán mas conceptos y ejemplos de uso de OpenSSH que tratarán de profundizar un poco más en el campo de la administración remota y en el establecimiento de túneles locales y remotos de conexiones SSH cifradas.