Blog

SSH y configuración de túneles

Aunque seguro que a muchos ya os suena, en el artículo de hoy hablaremos sobre una herramienta básica y fundamental para la administración de sistemas que es la base de muchos de los recursos que utilizamos a día de hoy.

¿Qué es SSH?

SSH, o secure shell, es un protocolo TCP que permite la administración remota de equipos mediante terminales, utilizando una arquitectura cliente-servidor (donde el cliente es el administrador y el servidor el administrado) y poniendo un especial énfasis en la seguridad.
Pero, ¿a qué nos referimos con ese énfasis en la seguridad? Para empezar, el tráfico SSH está encriptado, por lo que garantiza la confidencialidad de las comunicaciones. Además, nos permite autentificar tanto al servidor como al cliente:

  • Servidor: cuando establecemos por primera vez una conexión SSH con una IP concreta, el servidor nos enviará una fingerprint que se almacenará en nuestro equipo de manera que en futuras conexiones SSH comprobará si la identidad del servidor ha cambiado y nos advertirá en caso de que no coincida la fingerprint. Esto, a la hora de administrar, tiene sus pros y sus contras. Por un lado, te permite detectar suplantaciones del lado del servidor pero, en sistemas como los autoscaling, puede suponer un problema ya que al regenerarse máquinas cambia su fingerprint, teniendo que borrarla manualmente de nuestro equipo.
  • Cliente: Por supuesto el cliente también debe autentificarse, y para ello SSH nos permite varias opciones. Las más comunes son: 
    • El acceso mediante contraseña: de manera predeterminada está habilitado el acceso con contraseña, lo que nos permite acceder desde cualquier cliente sin necesidad de otras gestiones. A día de hoy, en la administración de sistemas, no es la forma más común por las vulnerabilidades típicas de las mismas (ataques de diccionario, mala gestión…)
    • El acceso mediante claves asimétricas: A día de hoy es el más común de los accesos, ya que evita muchos de los problemas de las contraseñas y, además, nos permite acceder de manera automática (sin tener que introducir nada manualmente una vez está configurado) lo que es muy útil para las herramientas basadas en SSH que comentaremos más adelante. Este sistema consiste en un par de claves, una pública y otra privada, que permiten la encriptación de mensajes. El equipo administrador genera un par de claves, quedándose él con la privada y enviando la pública al home del usuario remoto al que se planea acceder. Posteriormente, SSH hará un intercambio de mensajes utilizando las claves del cliente y del servidor para comprobar que son de un mismo par, autenticando al usuario.

login.png

Por último, SSH también nos deja configurar qué usuarios y privilegios permitimos que se puedan autenticar y cómo se pueden autentificar los mismos. Por ejemplo, de manera predeterminada no es posible acceder con root en sistemas Linux. 

Por tanto, para utilizar SSH solamente tendremos que instalar un servidor SSH en el equipo a administrar (es habitual usar opensssh, que es la opción más extendida en distribuciones Linux y windows) y contar con un cliente en él (cosa que ya suele venir integrada en cualquier distribución de Linux). Una vez contemos con eso, solamente tendremos que introducir el siguiente comando:


> ssh [<usuario>@]<ipservidor>

Por defecto, SSH escucha en el puerto 22, y si no le indicamos un usuario, intentará loguearse con el nombre del usuario del cliente. Una vez autenticados, podremos lanzar comandos o acceder a archivos con el usuario con el que nos hayamos logueado desde la comodidad de nuestro propio equipo.

ATENCIÓN: a la hora de realizar procesos mediante SSH, hay que tener en cuenta que los procesos en curso (salvo los demonios) se matan al cerrarse la sesión SSH, sea de manera voluntaria o involuntaria. Existen varias formas de evitar estos inconvenientes como utilizar nohub o screen.

Pero SSH no solo se puede utilizar para entrar simplemente en una consola y realizar un par de órdenes, SSH además nos abre otras posibilidades, vamos a ver una de ellas: los túneles SSH.

Túneles SSH

Una de las cosas que nos permite realizar SSH es el encapsulado de tráfico tcp a través de un servidor. Poniendo este paso intermedio conseguimos disfrutar de varias ventajas como contar con una capa de seguridad adicional en nuestras comunicaciones o limitar la exposición de nuestros servicios a agentes externos. Por ejemplo, si nuestra infraestructura cuenta con unas bases de datos alojadas en una red privada a la que solo tiene acceso un único equipo de la oficina, podemos utilizarlo como puerta temporal, de manera que sirva una conexión para el equipo sin necesidad de cambiar las configuraciones de los servidores de bases de datos. Otro uso habitual es utilizarlo para blindar servicios no encriptados como http, telnet o vnc. 

Existen dos clases de túneles:

  • Directos: se lanzan desde el equipo que estamos utilizando, apuntando hacia el equipo que hará de túnel y que, por lo tanto, necesita tener el servidor SSH instalado. De esta manera, le indicaremos que nos sirva en un puerto lo que él reciba en otro. Volviendo al caso de las bases de datos utilizaríamos el siguiente comando:

> ssh -L [<ip_local>:]<puerto_local>:<ip_bbdd>:<puerto_bbdd> <usuario>@<ip_servidor_salto>

En la parte local podemos, opcionalmente, poner la IP de nuestra tarjeta de loopback o la IP de la tarjeta que deseemos, en caso contrario escuchará en todos los interfaces.

tuneles_directos.png

En este ejemplo tenemos un cliente que necesita acceder a una base de datos que se encuentra en una red privada. Afortunadamente, puede acceder a un bastión con servidor SSH que tiene una interfaz en la misma red en la que está la BBDD, por lo que realiza una petición de túnel. Gracias a eso, ahora tiene acceso a la base de datos de manera rápida y segura.

  • Reversos: Estos túneles funcionan, como su nombre indica, al contrario. Se lanzan desde el servidor SSH hacia nuestro dispositivo local, de manera que en equipo destino se deja un puerto escuchando que reenvía el tráfico al servicio local. Estos túneles se suelen utilizar cuando el equipo intermedio se encuentra inaccesible para el destinatario (por ejemplo estando tras un router NAT o un firewall). La sintaxis es la siguiente:

> ssh -R[<ip_bind_servidor_remoto>:]<puerto_servidor_remotol>:<ip_local>:<puerto_local> <usuario>@<ip_servidor_remoto>

tuneles_reversos.png

En este caso la situación cambia. Ahora nuestro bastión se encuentra dentro de una red NAT gestionada por un router que no podemos configurar. El bastión, por tanto, puede comunicarse con el exterior, pero ahora nuestro cliente ya no sabe cómo llegar hasta él, impidiendo que montemos un túnel directo. Para acceder a la base de datos esta vez, vamos a necesitar crear un túnel reverso. Desde el propio bastión, le hacemos una petición al cliente para dejar abierta una conexión SSH. De esta manera, ahora el cliente puede acceder a la  BBDD.

Hay que tener en cuenta que en ambos casos, todo el que pueda conectarse a la IP/puerto que ha levantado el túnel podrá conectarse al servicio tunelizado.

Herramientas basadas en SSH

herramientas_ssh.png

Gracias a estas cualidades, SSH se convirtió en la base de multitud de recursos que se utilizan a día de hoy en el desarrollo y la administración. Algunos ejemplos notables son:

  • Git: en git podemos utilizar SSH para interactuar con un repositorio remoto de manera segura para realizar operaciones como el clonado. Las principales plataformas para almacenar y compartir repositorios (Github, Gitlab, Bitbucket…) permiten utilizar SSH mediante claves.
  • Ansible: desde que se estrenó en 2012, Ansible revolucionó la configuración de sistemas de manera automatizada gracias al uso masivo de SSH. Te recomendamos que sigas nuestro blog para encontrar más información sobre esta herramienta.
  • SCP: scp es un comando derivado de SSH que permite la copia de archivos desde o hacia un equipo remoto de manera segura y rápida.
  • Rsync: este comando permite, como su nombre indica, realizar una sincronización de ficheros entre dos máquinas utilizando SSH. Rsync compara el tamaño y edad de los mismos para rastrear cambios. Se utiliza, por ejemplo, para mantener igualados un entorno de producción y un DR.
  • Herramientas de CI/CD: Son varias las herramientas de CI/CD que permiten integrar en sus pipelines SSH para realizar despliegues en servidores remotos, como Github o Jenkins.

 

Como hemos podido ver en este artículo, aunque SSH parece una herramienta básica, su funcionamiento y usos nos ofrecen ciertas cualidades en el ámbito de la seguridad que permiten administrar tanto los propios servidores como acceder a servicios que, por la naturaleza de su protocolo o de la arquitectura de nuestra red, serían inaccesibles de manera segura y sencilla para los clientes sin necesidad de tocar nuestros firewalls y routers más de lo necesario.

Estas ventajas además han permitido la aparición de otras múltiples herramientas que han revolucionado varios ámbitos tanto de la administración como del desarrollo, por lo que siempre vale la pena darle un repaso y el crédito que se merece este protocolo.

 

Newsletter de STR Sistemas

Suscríbete a nuestra newsletter para recibir contenido interesante del mundo DevOps y artículos escritos por nuestros técnicos

¡Usamos cookies propias y de terceros para mejorar tu experiencia en esta web! Si sigues navegando, consientes y aceptas estas cookies en tu ordenador, móvil o tablet.

Más información sobre las cookies y cómo cambiar su configuración en tu navegador aquí.

x