En las entradas anteriores he intentado indicar un poco el uso de las características mas interesantes de OpenSSH y el protocolo SSH, dichas características permiten establecer de forma segura diversos tipos de conexiones y mecanismos de autenticación, así como diversos “tips” que son frecuentemente tomados por los administradores como medidas de seguridad que permiten a un servicio SSH prestarse con unos niveles mínimos de confianza sobre redes no confiables como por ejemplo Internet. En esta ocasión se intentará, como ya se ha dicho, profundizar un poco más en la utilización de SSH.

Utilizando un Túnel Dinámico para Navegar Seguramente con Firefox

Como se ha indicado en la entrada anterior, es posible crear un túnel dinámico que permite que cualquier conexión sea manejada por el servidor SSH, de esta forma se pueden establecer distintos tipos de conexiones de forma segura, un proxy SOCKS es frecuentemente utilizado en entornos corporativos donde los empleados deben configurar sus navegadores web para tener acceso a internet, Un proxy es en realidad un mero intermediario entre el cliente (navegador web) y el sitio que desea consultar, existen diversos motivos para establecer un proxy, uno de los mas comunes es simplemente para filtrar y monitorizar el trafico de un segmento de red, de esta forma el proxy también podrá rechazar aquellas conexiones que no sean adecuadas de acuerdo a un conjunto de reglas declaradas por el administrador de red, en este caso concreto, SSH permitirá que la conexión sea segura gracias al establecimiento de un canal cifrado (canal SSH), de esta forma, si existe alguien más en el segmento de red que intentá capturar los paquetes que viajan en el segmento de red (sniffing) por medio de una herramienta como wireshark, no podrá ver en “texto claro” la conexión establecida entre el cliente, SSH SOCKS-Proxy y Destino de la conexión.

Como se ha indicado en la entrada anterior, se inicia el túnel dinámico (Proxy SOCKS)

>ssh -f -ND 8090 -C root@localhost

Posteriormente se configura Firefox para que utilice como Socks proxy el servidor local en el puerto 8090:

Ir a: Editar → Preferencias → Opción Avanzado → Tab Red → Botón “Configuración…”

En dicha interfaz solamente resta establecer la opción de “Configuración manual del proxy” y en la opción de Servidor SOCKS indicar servidor y puerto.

Ahora es necesario establecer una propiedad en Firefox que permite realizar cualquier tipo de consulta DNS contra el servidor SSH en lugar de hacerla de forma directa, para esto es necesario navegar hacia “about:config” y establecer la propiedad network.proxy.socks_remote_dns en TRUE con esto solamente falta reiniciar el navegador y comenzar a navegar.

Cuando la sesión SSH se termine, el servidor SOCKS también finaliza, si esto ocurre ya no habrá salida a internet ni a ningún otro sitio, seria necesario volver a iniciar el servidor SOCK o configurar el navegador para establecer los parámetros de salida a internet adecuados.

Creando Tuneles con Putty

Putty es una herramienta que permite “encapsular” en una única interfaz de usuario muchas de las características disponibles del protocolo SSH, permitiendo establecer conexiones con servidores SSH, Telnet, Rlogin, entre otros.

Putty es una herramienta que frecuentemente utilizan desarrolladores y administradores de sistemas para acceder a un servidor remoto y realizar operaciones administrativas sin necesidad de conocer a fondo las potencialidades que ofrece la linea de comandos, es una buena opción sobre maquinas Windows, sin embargo bajo maquinas Linux, probablemente no sea tan robusto como tener una consola y un buen nivel de conocimientos sobre el comando “ssh”.

Con Putty se pueden crear todos los puertos estudiados en la entrada anterior: Local, Remoto y Dinámico, todo desde la misma interfaz. Antes de continuar con la explicación de como realizar dichas tareas es necesario instalar el software necesario (Putty) para esto solamente basta con ejecutar el comando:

>apt-get install putty

Bajo una maquina Debian o alguno de sus derivados, si se trata de una maquina Windows es necesario descargar el fichero ejecutable desde: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Una de las ventajas de este ejecutable es que no inicia un proceso de instalación ni nada parecido, simplemente ejecuta enseña la interfaz Putty y permite al usuario utilizarlo como cualquier otro tipo de utilidad en windows estática.

Ahora para crear un túnel SSH desde putty es necesario ir hacia Connection → SSH → Tunnels una vez allí es necesario indicar el host o la ruta a la cual debe redireccionar el puerto, luego elegir el tipo de túnel y el tipo de dirección IP (Auto, IPV4 o IPV6)

Aquí se ha definido un túnel local apuntando al puerto 4545 el cual redireccionará al servidor SSH de la maquina 192.168.1.35. Ahora se debe establecer la conexión propiamente dicha, en este caso se realizará contra el host 192.168.1.34.

Finalmente, una vez establecida la conexión con el host remoto, el puerto local se ha creado satisfactoriamente, esperando recibir conexiones, si se abre una nueva sesión con Putty, pero esta vez especificando como host 127.0.0.1 y el puerto 4545, se podrá apreciar que automáticamente se ejecuta la redirección una vez se establezca la conexión. Por otro lado, si se abre un navegador y se indica localhost:4545 aparecerá la versión de ssh que se ejecuta en la maquina remota.

Copia remota de ficheros y Fuse FileSystem con SSH.

Otra de las características más interesantes con SSH, es precisamente la copia de ficheros y el establecimiento de directorios compartidos entre maquinas utilizando Fuse FileSystem. Desde los inicios de SSH, la copia de ficheros entre dos maquinas siempre ha sido una característica a la que se le ha prestado muchísima atención, actualmente para este tipo de tareas se utiliza SFTP que permite realizar copias de ficheros entre dos maquinas utilizando un protocolo seguro (SSH) en lugar de utilizar el clásico FTP, el cual puede ser vulnerable a ataques de reconocimiento básicos como Sniffing.

Del mismo modo que SFTP mejora al protocolo FTP adicionando una capa segura de cifrado de datos, existe otra utilidad llamada SCP, la cual permite la copia remota de ficheros entre dos maquinas utilizando un canal seguro SSH, se trata de una mejora sustancial del protocolo RCP, el cual sufría de las mismas vulnerabilidades que FTP, a saber, la información entre ambos host viaja sin cifrar lo que permite a cualquier atacante capturar dicha información fácilmente con cualquier herramienta de captura de paquetes. SCP es muy similar al comando CP, la diferencia radica en sus capacidades distribuidas, que no solamente pueden afectar al sistema de archivos local, sino que también afectan a un sistema de archivos remoto.

Por otro lado, también es posible “montar” un sistema de ficheros de forma distribuida utilizando SSHFS, que permite compartir directorios entre distintos puntos de un mismo segmento de red de una forma sencilla y segura, nuevamente utilizando SSH como protocolo de cifrado subyacente.

A continuación se indicará brevemente el uso de SCP y SFTP desde linea de comandos:

Uso de SCP:

La sintaxis del comando SCP es muy simple, solamente es necesario especificar el conjunto de opciones que se desea aplicar al comando, la especificación de la maquina origen y la especificación en la maquina destino, donde cada una de las especificaciones consta de usuario y clave de la maquina, así como del directorio remoto, por ejemplo para copiar un fichero simple desde una maquina local a una maquina remota, basta con ejecutar el siguiente comando:

>scp puerta root@192.168.1.34:/home/adastra
root@192.168.1.34’s password:
puerta 100% 11 0.0KB/s 00:00

Como se puede apreciar, se ha transferido el fichero “puerta” desde la maquina local a la maquina remota (192.168.1.34) en el directorio /home/adastra

Si se desea transferir directorios completos, es posible hacerlo utilizando la opción -r de la siguiente forma:

>scp -r Descargas/ root@192.168.1.34:/home/adastra/ root@192.168.1.34’s password:

nmap-5.51.tar.bz2 100% 16MB 16.1MB/s 00:01

xampp-linux-1.7.4.tar.gz 100% 74MB 10.6MB/s 00:07

nmap-5.59BETA1.tar.bz2 100% 20MB 6.8MB/s 00:03

nikto-2.1.4.tar.bz2 100% 281KB 281.4KB/s 00:00

framework-3.7.2.tar.bz2 100% 47MB 11.8MB/s 00:04

DVWA-1.0.7.zip 100% 1331KB 1.3MB/s 00:00

firefox-5.0.tar.bz2 100% 15MB 14.8MB/s 00:01

Ahora bien, en los casos anteriores el sentido de la copia ha sido siempre desde la maquina local hacia una maquina remota, sin embargo, también se pueden copiar ficheros y/o directorios que se encuentran en una maquina remota hacia la maquina local, simplemente indicando en la especificación de origen la ruta de la maquina remota y en el destino el directorio local donde se desea que se almacenen los ficheros remotos.

>scp -r root@192.168.1.34:/home/adastra/Descargas/ /home/adastra/Subidoroot@192.168.1.34’s password:
firefox-5.0.tar.bz2 100% 15MB 14.8MB/s 00:01

xampp-linux-1.7.4.tar.gz 100% 74MB 10.6MB/s 00:07

DVWA-1.0.7.zip 100% 1331KB 1.3MB/s 00:00

nikto-2.1.4.tar.bz2 100% 281KB 281.4KB/s 00:00

framework-3.7.2.tar.bz2 100% 47MB 11.8MB/s 00:04

nmap-5.59BETA1.tar.bz2 100% 20MB 10.2MB/s 00:02

nmap-5.51.tar.bz2 100% 16MB 16.1MB/s 00:01

Como se puede apreciar, la especificación de origen es la maquina remota, mientras que la especificación de destino es la maquina local, el funcionamiento de la copia de ficheros ha sido justo en sentido contrario, de servidor SSH a cliente.

Uso de SFTP:

Con SFTP como se ha indicado anteriormente es posible transferir ficheros entre dos maquinas de forma segura utilizando FTP y SSH como protocolos de transporte y canal seguro respectivamente, su uso desde linea de comandos es muy sencillo, aunque cabe resaltar que también es posible utilizar herramientas gráficas que permiten conseguir los mismos resultados como WinSCP, FileZilla, etc. En dichos casos, los conocimientos sobre los protocolos subyacentes no son tan necesarios, por este motivo, se omitirá su uso, ya que es mas interesante conocer a fondo como funciona SFTP y esto se consigue mejor utilizándoló desde consola.

El comando SFTP contiene muchas opciones que permiten definir operaciones relacionadas con la transferencia de datos entre servidores, algunas de estas opciones tienen relacion directa con SSH, es decir, son opciones que se especifican en el establecimiento de la conexión con el servicio SSH. Por ejemplo para utilizar SFTP:

>sftp root@192.168.1.34
root@192.168.1.34’s password:
Connected to 192.168.1.34.
sftp>

Como se puede apreciar la forma más sencilla del comando es indicando usuario y servidor, posteriormente se entra en modo interactivo donde se pueden utilizar varios comandos que permiten la interacción con la maquina remota, por ejemplo:

sftp> pwd
Remote working directory: /root
sftp> lpwd Local working directory: /home/adastra

sftp> version

SFTP protocol version 3

sftp> cd /home/adastra/

sftp> ls

Descargas Documentos Escritorio Imágenes Música Plantillas

Público Vídeos puerta

sftp> dir

Descargas Documentos Escritorio Imágenes Música Plantillas

Público Vídeos puerta

sftp> lls

amsn_received Documentos Escritorio Música Público Vídeos

Descargas Downloads Imágenes Plantillas Subido

sftp> get puerta

Fetching /home/adastra/puerta to puerta

/home/adastra/puerta 100% 11 0.0KB/s 00:00

sftp> lls

amsn_received Documentos Escritorio Música Público Subido

Descargas Downloads Imágenes Plantillas puerta Vídeos

sftp> lcd /opt/JDownloader/

sftp> lpwd

Local working directory: /opt/JDownloader

sftp> put license.txt

Uploading license.txt to /home/adastra/Documentos/license.txt

license.txt 100% 31KB 31.3KB/s 00:00

sftp> ls

license.txt

sftp> bye

En modo interactivo se pueden ejecutar los comandos anteriormente indicados y algunos otros adicionales, para conocer todas las opciones disponibles ingresar el comando “help”.

Ahora bien, todos los comandos en modo interactivo funcionan del mismo modo, a saber, solamente navegan por la estructura de archivos local y remota, como puede verse, comandos como lls, lpwd y lcd enseñan y navegan por la estructura de directorios local, mientras que comandos como ls,pwd y cd lo hacen en la estructura de directorios remoto.

Por otro lado, los comandos utilizados para descargar y subir ficheros son get y put respectivamente, tal y como se muestra en el ejemplo anterior, el comando get espera como parámetro un fichero en el sistema de archivos remoto, mientras que el comando put espera como parámetro un fichero en el sistema de archivos local.

Una vez comprendidas las opciones disponibles en el modo interactivo, se indicarán algunas de las opciones de ejecución del comando sftp:


>sftp -C root@192.168.1.34

La opción -C en SFTP tiene el mismo efecto que en SSH, es decir, habilita la compresión de los datos transmitidos entre cliente y servidor.


>sftp -C -b /home/adastra/ficherobatch root@192.168.1.34

Lee un fichero que contiene una serie de comandos que se ejecutaran de forma secuencial en el servidor una vez se establece la conexión, de esta forma, no se enseña una sesión interactiva como se ha indicado anteriormente, en lugar de esto el proceso es ejecutado de forma automática. Para utilizar esta opción es necesario configurar la autenticación no interactiva, esto se vera en próximas entradas.

>sftp -F /etc/ssh/ssh_config root@192.168.1.34

La opción -F permite especificar un fichero de configuración SSH concreto.

>sftp -o «TCPKeepAlive=yes» root@192.168.1.34

La opción “-o” permite indicar de forma manual opciones de configuración que habitualmente se encuentran definidas en el fichero de configuración del cliente SSH, esta opción también se utiliza en el comando “ssh” no solamente en el comando sftp, sin embargo se verán casos mas concretos en una próxima entrada.

>sftp -R 128 root@192.168.1.34

La opción -R indica el número de peticiones que un servidor SFTP puede atender al mismo tiempo, entre mas grande sea este valor, la velocidad de transferencia mejora un poco, pero el uso de memoria también es mayor. Por defecto el valor es 64.

>sftp -r 128 root@192.168.1.34

La opción -r indica la copia recursiva de subida y descarga de directorios cuando se utilice el comando put o get.

Uso de SSHFS

Con sshfs es posible montar un sistema de archivos remoto haciendo uso del protocolo SSH, como resultará obvio es necesario tener instalado SSH Fuse FileSystem y cargar el modulo “fuse” correspondiente, aunque en algunas distribuciones Debian y derivados dicho modulo ya se encuentra cargado al inicio del sistema, para verificarlo solamente es necesario listar los módulos cargados y posteriormente buscar el modulo fuse:

>lsmod | grep fuse
fuse 50892 5

En este caso se encuentra instanciado en el listado de módulos cargados, sin embargo, en el caso de que no se encuentre cargado por algún motivo es necesario hacerlo de forma manual.

>sudo modprobe fuse

posteriormente instalar sshfs sino se encuentra ya instalado.

>sudo apt-get install sshfs

Luego es necesario asignar al usuario que podrá conectarse con el sistema de ficheros remoto el grupo “fuse”, por medio del comando:

>sudo adduser adastra fuse

Siendo “adastra” el usuario, también es posible adicionar el usuario manualmente editando el fichero /etc/group
Ahora para montar un sistema de archivos se puede utilizar un comando como el siguiente:

>sshfs root@192.168.1.34:/home/adastra/ /home/Subido/
root@192.168.1.34’s password:

Con el comando anterior se ha montado el sistema de archivos de la maquina 192.168.1.34 desde el directorio /home/adastra/ cuyo punto de montaje es “Subido/”.

Muy bien, hasta este punto no parece haber nada nuevo con el uso de SSHFS, sin embargo tiene una característica bastante interesante y es precisamente que como se trata de que en realidad es un directorio compartido con la maquina remota, cuando dicho directorio sufra algún cambio (modificación, adición o borrado de ficheros/directorios) este cambio se verá automáticamente reflejado en el punto de montaje de la maquina que ha establecido la conexión, por ejemplo:

>ssh root@192.168.1.34 «echo «Hola…» > /home/adastra/ficheronuevo»

Con el comando anterior, simplemente se ha creado un nuevo fichero de texto en el directorio compartido, luego al consultar si realmente se ha creado en la maquina remota:

>ssh root@192.168.1.34 «ls /home/adastra»
root@192.168.1.34’s password:

Descargas

Documentos

Escritorio

ficheronuevo

Imágenes

Música

Plantillas

Público

puerta

Vídeos

Como puede verse se ha creado el fichero remoto, luego, sin realizar ningún tipo de acción adicional, se consulta el contenido del directorio “/home/Subido/” para verificar su contenido.

>ls /home/Subido/
Descargas Escritorio Imágenes Plantillas puerta Documentos ficheronuevo Música Público Vídeos

El fichero se ha actualizado correctamente, la razón de esto es sencilla, cuando se ejecuta el comando “ls” contra el directorio “Subido” en realidad se esta consultando el directorio remoto, ya que la conexión permanece activa hasta que se elimine el punto de montaje.

Ahora bien, el acto de modificar la estructura de un directorio compartido con SSHFS en la maquina remota, no solamente se ve reflejado en el directorio local de un cliente, sino que también obviamente en el sentido contrario, cuando se modifica la estructura del directorio compartido en local, este cambio se ve reflejado automáticamente en la maquina remota, como ya se ha mencionado anteriormente, se trata en realidad del mismo directorio.

>echo «Hola desde 33» > /home/Subido/ficherodesde33

Se crea un fichero en el directorio compartido.

ssh root@192.168.1.34 «ls /home/adastra»
root@192.168.1.34’s password:DescargasDocumentos

Escritorio

ficherodesde33

ficheronuevo

Imágenes

Música

Plantillas

Público

puerta

Vídeos

Se consulta el contenido del directorio en la maquina remota y como se puede ver automáticamente se ven reflejados los cambios.

Finalmente, para desmontar un punto de montaje, es necesario utilizar el comando fusermount. Del mismo modo que cualquier dispositivo de almacenamiento (como un dispositivo USB o un disco duro extraíble) es necesario desmontarlo para poder extraerlo adecuadamente, en este caso siempre es necesario desmontar el punto de montaje para que todas las transacciones y modificaciones que se han realizado en la estructura del directorio finalicen de forma ordenada garantizando la consistencia de los datos.

>fusermount -u /home/Subido/

Con el comando anterior se ha desmontado correctamente el directorio remoto, en la maquina local aun existe el directorio “/home/Subido/” sin embargo este ya no tiene ningún contenido.

En la próxima entrada, se indicarán más características propias y extendidas de SSH/OpenSSH.