SSH

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar

SSH (Secure SHell, en español: intérprete de órdenes seguro) es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a máquinas remotas a través de una red, ya sea local o pública.

Permite manejar por completo el ordenador mediante un intérprete de comandos, y también puede redirigir el tráfico de aplicaciones gráficas si tenemos un Servidor X (en sistemas tipo Unix y Windows) corriendo.

Seguridad

SSH funciona de manera similar a Telnet con la diferencia de que aquí la información viaja cifrada, lo cual hace inútil la intercepción de un paquete al ser éste ilegible.

Además de conectarnos a otros dispositivos para manejarlos remotamente, SSH también nos permite crear túneles a través de los cuales podemos redirigir tráfico, o enviar y recibir ficheros de forma totalmente segura, fiable y simple gracias a su gestión de claves RSA, como si se tratase de un servidor FTP.

Por lo tanto, podemos concluir que la seguridad está presente en todo momento.

Tunneling

Esquema Tunneling

Por lo general, los protocolos envían sus datos «en claro» (sin encriptar), por lo que cualquier persona con acceso físico a nuestra red y un sniffer (programa de captura de tramas de red) es capaz de interceptar nuestros paquetes y verlos libremente. Si tenemos información sensible en circulación, la seguridad estará seriamente comprometida, obviando usuarios y contraseñas como en los casos de Telnet o FTP.

El tunneling nos permitirá salvar este problema fácilmente sin dejar de usar los protocolos que necesitemos. Esta técnica consiste en abrir conexiones entre dos máquinas por medio de un protocolo seguro, como puede ser el SSH, a través de las cuales realizaremos las transferencias inseguras, que pasarán de este modo a ser seguras.

Aplicaciones del SSH

Resumiendo, las principales aplicaciones del SSH que en esta página se van a explicar son:

  • Redirigir el tráfico de algunos puertos, por ejemplo de un cliente de correo (Thunderbird). Es decir, encriptar nuestras conexiones para evitar miradas «ajenas» gracias a que creamos un túnel seguro entre el puerto del servidor de correo (ej. 110) y uno local (ej. 1110).
  • Saltarse un cortafuegos.
  • Enviar y descargar archivos de manera segura.
  • Acceso total a una computadora remota por Terminal.

Todo lo vamos a hacer desde el punto de vista de una distribución Linux, en nuestro caso y por ser la más extendida a nivel de usuario, Ubuntu.

Instalando y Configurando SSH

Abrimos un terminal de Ubuntu y escribimos:

 sudo apt-get install openssh-server

Seguidamente, pasamos a configurar nuestro servidor ya instalado. Para ello usaremos el editor de textos nano, aunque también podríamos usar gedit o vim:

 sudo nano /etc/ssh/sshd_config

Claves para aumentar la seguridad de nuestro servidor:

  • Cambiar el puerto estándar de conexión (22) a otro cualquiera para evitar ataques es una buena forma de permanecer invisibles a los molestos bots que, a pesar de no representar una amenaza sin tener nuestra contraseña de acceso, es mejor evitar. Para ello, en la quinta línea, cambiamos el puerto a, por ejemplo:
  Port 443 (Estándar HTTPS)
  • No permitir el logueo como Root es algo básico y esencial para la seguridad de nuestro sistema. Así que buscamos la línea siguiente y cambiamos el valor de "yes" a "no":
  PermitRootLogin no
  • Imponer un número máximo de intentos fallidos de autentificación es una buena estrategia, sobre todo si nuestro servidor está escuchando en una red pública. De ésta forma podremos evitar que un posible atacante intente averiguar una contraseña por un método de fuerza bruta. En este caso, crearemos una nueva instrucción dentro del archivo, de la siguiente forma:
  MaxAuthTries 2 (si fallamos dos veces la contraseña, el servidor nos desconecta y hay que volver a establecer la conexión)
  • Definir exactamente quién puede o no acceder a nuestro servidor puede ser útil especialmente si trabajamos a nivel local, aunque es extensible a la red externa. Para ello, basta con configurar los archivos hosts.allow (permitir) y hosts.deny (denegar) añadiendo las IP's que nos interese administrar (un buen paranoico, denegaría todas las conexiones y configuraría solo las que fueran absolutamente necesarias):
 sudo nano /etc/hosts.allow
 sudo nano /etc/hosts.deny

Arranque y parada del servidor

  • Arrancar el servidor SSH:
 sudo service ssh start
  • Detener el servicio:
 sudo service ssh stop
  • Reiniciar el servicio:
 sudo service ssh restart

Clientes DNS

Si tenemos intención de usar nuestro servidor SSH externamente a nuestra red local, necesitaremos un cliente DNS que nos permita olvidar nuestra dirección IP; más aún en el caso de ser dinámica, y sustituirla por un nombre de dominio.

Aquí vamos a trabajar con dos servicios distintos y gratuitos: No-IP.com y DynDNS.com



No-IP

Nos registramos en su página web, y cuando hayamos accedido al menú principal, clickeamos en Add a Host.

Seguidamente, escribiremos el nombre que le queramos dar al host, que irá seguido de un subdominio obligatorio que nos impone No-IP, aunque podremos elegir entre varios.

  • El «Host Type» ha de ser siempre «DNS Host (A)» No debemos rellenar nada más, así que pulsamos en Create Host.

Una vez hecho esto, instalaremos el programa cliente en nuestro ordenador, que mandará periódicamente a nuestro dominio de No-IP la dirección IP que tengamos en ese momento.

 sudo apt-get install noip2

Durante la instalación, el programa nos hará preguntas para configurarse. No obstante, podremos reconfigurarlo sin problemas si algo ha ido mal con la siguiente instrucción:

 sudo noip2 -C


Por último, solo nos queda por saber las instrucciones para arrancar, parar y reiniciar el servicio. Cabe decir que este servicio, al igual que el propio SSH, arrancará automáticamente con el ordenador una vez instalado.

  • Arrancar el cliente noip2:
 sudo service noip2 start
  • Detener el servicio:
 sudo service noip2 stop
  • Reiniciar el servicio:
 sudo service noip2 restart



DynDNS

Nos registramos en su página web, y cuando hayamos accedido al menú principal, clickeamos en Add Host Services. Seguidamente, escribiremos el nombre que le queramos dar al host, que irá seguido de un subdominio obligatorio que nos impone DynDNS, aunque podremos elegir entre varios.

  • El «Service Type» ha de ser siempre «Host with IP adress».
  • En el apartado IP Adress, pinchamos donde veamos nuestra IP y finalmente en Add to Cart.

Una vez hecho esto, instalaremos el programa cliente en nuestro ordenador, que mandará periódicamente a nuestro dominio de DynDNS la dirección IP que tengamos en ese momento.

 sudo apt-get install ddclient

Durante la instalación, el programa nos hará preguntas para configurarse. No obstante, podremos reconfigurarlo sin problemas si algo ha ido mal con la siguiente instrucción:

 sudo dpkg-reconfigure ddclient


Si usamos ddclient, solo tendremos la opción de reiniciar el servicio, ni arrancarlo ni pararlo, y lo haremos de la siguiente forma:

 sudo service ddclient restart

Notas

  • No olvidar nunca abrir correctamente el puerto que vayamos a usar en el SSH tanto en nuestro router como en el cortafuegos.
  • Los servicios de No-Ip y DynDNS nos enviarán aproximadamente cada sesenta días un e-mail pidiéndonos que confirmemos que queremos mantener nuestros dominos activos (al usarlos como SSH no se registran visitas a los mismos y por lo tanto parece que están inactivos)

Accediendo remotamente

Lo más básico de todo consiste en realizar una conexión simple que nos permita acceder y loguearnos remotamente a nuestro ordenador con el servidor SSH ya activo. Para ello, abrimos un terminal y tecleamos:

 ssh -p puerto usuario@host

Si el puerto es el 22 (por defecto) podemos omitir la opción -p. Un ejemplo práctico del comando anterior:

 ssh -p 443 fernando@micasa.dyndns.org

Con esta simple instrucción, automáticamente el terminal pasará a tener nuestro usuario y equipo, y podremos usarlo como si estuviésemos en nuestro propio PC: instalar programas, eliminar archivos, reiniciar el sistema...

Esquema FileZilla

Una buena forma, cómoda y rápida de traspasar archivos entre el servidor y el ordenador utilizado en ese momento, es el programa FileZilla (libre y en los repositorios de Ubuntu), que nos permite conectarnos del mismo modo que si fuese una conexión FTP.

Se puede comprobar en la captura de la derecha cómo configurar correctamente el programa para acceder a nuestro sistema remotamente.

Si lo que buscamos es redireccionar puertos para aumentar la seguridad en nuestras conexiones Web o SMPT (encriptándolas), o sencillamente saltarnos un cortafuegos, podremos hacerlo de dos formas:

  • Redireccionamiento estático
  • Redireccionamiento dinámico



Redireccionamiento estático

Este tipo de redireccionamiento nos permite conectarnos a un puerto de un servidor, a través de un puerto local que le ordenemos. Especialmente útil para clientes de correo por ejemplo, como se ha dicho anteriormente.

La sintaxis es la siguiente:

 ssh -L puerto.local:servidor:puerto.remoto usuario@host

Un ejemplo práctico, en el caso de querer conectarnos a Gmail por ejemplo:

 ssh -L 10993:imap.googlemail.com:993 fernando@micasa.dyndns.org
Configuración de Thunderbird para redireccionamiento de puertos estático

Lo que estamos haciendo con la sintaxis anterior es decirle al ordenador: «cuando me conecte en local al puerto 10993 (debemos poner siempre un valor por encima de 1024, que son los puertos reservados), quiero que me devuelvas la información que hay en imap.googlemail.com por el puerto 993 a través del servidor de SSH fernando@micasa.dyndns.org»

Seguidamente, debemos configurar nuestra cuenta de Thunderbird por ejemplo, tal y como aparece en la captura de la derecha (en Editar → Configuración de las cuentas).



Redireccionamiento dinámico

Este tipo de redireccionamiento nos permite conectarnos a cualquier puerto de cualquier servidor a través de un puerto local que le ordenemos.

A esto se le denomina túneles dinámicos, ya que se crean y se destruyen conforme los vamos necesitando, automáticamente.

La sintaxis es la siguiente:

 ssh -D puerto.local usuario@host

Muy útil para saltarnos cortafuegos y capados:

 ssh -D 10000 fernando@micasa.dyndns.org

Podemos ver un esquema de lo que ocurre cuando se establece un túnel SSH en la siguiente imagen:

Cortafuegos.png
Configuración de Firefox para redireccionamiento de puertos dinámico

Lo que estamos haciendo con la sintaxis anterior

 ssh -D 10000 fernando@micasa.dyndns.org

es decirle al ordenador: «quiero que todas mis conexiones pasen por el puerto 10000 a través del servidor de SSH fernando@micasa.dyndns.org (que es el ordenador que tiene acceso a la red sin restricciones)».

Seguidamente, debemos configurar el programa que queremos que se conecte a la red con un proxy SOCKS del siguiente modo. Tenemos una captura de pantalla a la derecha a modo de ejemplo con Mozilla Firefox (en Preferencias → Avanzadas → Red → Configuración)

También podemos colocar la misma configuración de conexión en nuestro cliente de correo, de modo que no sería ya necesario hacer túneles «manualmente». Este proceso de creación de túneles está especialmente recomendado en entornos de redes no fiables, como puede ser una cafetería o un aeropuerto.

Algunas opciones de utilidad

Las opciones con las que podemos conectarnos a nuestro servidor SSH son múltiples y muy variadas. Aquí una pequeña lista de las más reseñables:

  • -C Comprime los datos para ahorrar ancho de banda.
  • -f Manda todo el SSH a un segundo plano tras ejecutarse.
  • -n Evita que muestre output; todo lo que sale lo manda a /dev/null.
  • -N Evita que se ejecute una shell, útil si lo único que queremos es redireccionar puertos.
  • -v Muestra en pantalla todas las operaciones realizadas por el SSH. Muy útil para identificar problemas de conexión.
  • -X Activa la posibilidad de ejecutar aplicaciones gráficas remotamente (X11). Con esto es posible ejecutar un programa que no se tiene instalado en la máquina cliente pero sí en el servidor, aunque la velocidad no es muy elevada.

Como curiosidad extra, cabe destacar que si al realizar la conexión SSH está activada la opción -X, al escribir la siguiente instrucción una vez logueados en el ordenador remoto:

 DISPLAY=:0.0

si tratamos de ejecutar un programa cualquiera, éste lo hará en el ordenador remoto y no en el que estemos utilizando en ese momento, como sería de esperar.

Esto ocurre porque estamos modificando una variable llamada «de entorno», que altera el normal funcionamiento de la impresión en pantalla. La variable dejará de funcionar en el momento en que finalicemos la conexión al sistema remoto. No obstante, si se desea volver a la opción por defecto sin reiniciar la conexión, basta con escribir esto:

 DISPLAY=localhost:10.0

Para preguntar en cualquier momento por el estado de la display, haremos:

 $echo DISPLAY

Enlaces externos