El protocolo SSH no sólo vale para conectarse de una máquina a otra sino también para hacer ssh port forwarding, ssh port forwarding reverse, transferir archivos (SCP)… En este post daré unas pautas para securizar y optimizar el servidor SSH y explicaré algunas de las opciones mencionadas antes.
Para empezar, un poco de historia
SSH (Secure SHell), es un protocolo creado por Tatu Ylönen. En los inicios de SSH empezó siendo gratis hasta que el éxito de este fue notable y se decidió crear una empresa y hacerlo de pago para empresas y gratis para uso no comercial. Los desarrolladores de OpenSSH se dieron cuenta de que el protocolo SSH era una cosa necesaria para su sistema y ahí nació OpenSSH que es el programa que se utiliza a día de hoy.
Vale, y ahora… ¿qué es SSH?
SSH es un protocolo diseñado para crear conexiones seguras entre diferentes hosts, para esto, utiliza algoritmos de cifrado como RSA o DSA. Se puede decir que es el sustituto de telnet ya que es mucho más versátil y seguro. Este protocolo funciona bajo TCP y por defecto en el puerto 22. Con él, puedes conectarte tanto a la terminal de un host remoto como a su entorno gráfico y realizar las gestiones que uno quiera.
Características del servicio SSH
El uso del protocolo Secure Shell por parte de los usuarios, ofrece una serie de interesantes características, que lo ha llevado a convertirse en el método más utilizado por todos los usuarios que gestionan algún tipo de servidor Linux ya sea en la nube o dedicado. Algunas de estas características que podemos destacar son:
– El uso de SSH encripta la sesión de registro impidiendo que cualquier persona pueda conseguir contraseñas no encriptadas.
– Las claves de encriptación utilizadas sólo son conocidas por quien emite la información y por quien la recibe.
– Una sola alteración de la clave modifica el mensaje original, lo que permite que si por alguna razón un tercero descubre la clave no acceda al mensaje completo.
– El usuario tiene la posibilidad de verificar que sigue conectado al mismo servidor que se conectó inicialmente.
– Cuando un usuario se autentica, entre él y el servidor se crea un canal seguro cifrado por donde intercambiar la información con total garantía.
– Los datos enviados y recibidos mediante el uso de SSH se realiza por medio de algoritmos de encriptación de 128 bits, lo que hace que sea muy complicado de descifrar y de leer.
– El cliente tiene la posibilidad de utilizar de forma segura aplicaciones desde el intérprete de comandos del servidor, que permite administrar la máquina como si estuviera delante de ella.
– El uso de SSH permite convertirse en un conducto para hacer seguros aquellos protocolos que no los son mediante el uso de una técnica denominada reenvío por puerto.
Empecemos por lo básico, como instalar y configurar un servidor SSH.
Para empezar instalarlo
$ sudo aptitude install openssh-server
Cómo configurar el protocolo SSH para hacerlo más seguro
Aunque hemos estado hablando de que el uso del protocolo SSH es totalmente seguro, esto no quiere decir que esté ajeno a sufrir algún tipo de ataque que ponga en riesgo nuestra información. Por este motivo, los usuarios tienen la opción de modificar la configuración por defecto que trae este protocolo para hacerlo aún más seguro, como puede ser el cambio del puerto por defecto o el número máximo de reintentos para conectarse al servidor. Veamos cómo mejorar la seguridad de nuestro SSH.
Lo primero que debemos hacer es localizar el fichero de configuración y que lleva por nombre “sshd_config”. Este fichero suele estar en la ruta “/etc/ssh”. Si no estuviera en esa dirección, podemos hacer uso del comando “find” de Linux para localizar su ubicación.
Una vez localizado lo editamos con nuestro programa de edición de ficheros favorito, como puede ser Nano o cualquier otro que tengamos instalado. Una vez que lo abrimos, nos debemos encontrar un contenido parecido al que os dejamos a continuación (los valores pueden variar).
Entre las cosas que podemos hacer están:
Cambiar el puerto por defecto
Por defecto, SSH utiliza el puerto 22, por lo que cuando un hacker lanza un ataque lo suele hacer sobre este puerto. Si le cambiamos el número del puerto, el servicio no responderá al puerto por defecto y habremos puesto una nueva traba a quien intente conseguir nuestra información.
Para hacer este cambio, lo único que hay que hacer es en el fichero de configuración cambiar el valor del campo “port” por el valor que queramos, por ejemplo el puerto 222.
Port 222
b) Deshabilitar el acceso root
Todo servidor tiene asignado un usuario root que tiene privilegios para hacer cualquier tipo de acción sobre la máquina. Una buena práctica para mejorar la seguridad es impedir el acceso al servidor por medio de este usuario root y obligar al acceso por medio de alguno de los usuarios que hayamos creado y que no tienen privilegio root. Una vez logueados con nuestro usuario, podremos convertirnos en usuario root por medio del comando “sudo”.
Para impedir el acceso del usuario root, debemos poner a “no” la variable “PermitRootLogin”.
PermitRootLogin no
c) Deshabilitar el uso del protocolo 1 de SSH
Como hemos comentado a lo largo de este White Paper, hay dos versiones del protocolo SSH. La versión 1 que apareció primero y a la que se descubrió algunas vulnerabilidades, y la versión 2 que corregía esos problemas.
De forma general, se puede configurar para que se pueda utilizar cualquiera de las dos versiones, pero es recomendable no utilizar la primera de las versiones. Para indicar que vamos a utilizar la versión 2 hay que modificar la variable “Protocol” del siguiente modo:
Protocol 2
d) Limitar el número de reintentos
Por medio de la variable “MaxAuthTries”, podemos indicar el número de veces que nos podemos equivocar al introducir el nombre de usuario o la contraseña. Una vez superado el número que hayamos indicado, la conexión se perderá y habrá que empezar de nuevo el proceso de conexión. Con esto evitaremos ataques de persistencia de la conexión.
Si queremos poner un máximo de 3 intentos, habría que indicarlo de la siguiente manera:
MaxAuthTries 3
e) Limitar el número de pantallas de login
Otra de las acciones que podemos llevar a cabo para mejorar la seguridad es limitar el número de ventanas de logueo simultáneas que podemos tener activas desde una misma IP, para de esta forma evitar ataques divididos. Una vez logueado el usuario, no será posible tener abiertos un número superior de terminales SSH al indicado en esta variable.
Si queremos limitar a una única pantalla de logueo por IP, habría que hacerlo de la siguiente manera:
MaxStartups 1
f) Limitar el tiempo que estará disponible la pantalla de login
Por medio de la instrucción “LoginGraceTime” indicamos el tiempo en segundos que estará disponible la pantalla de login para introducir nuestras credenciales. Pasado ese tiempo, la pantalla desaparecerá y habrá que volver a iniciar el proceso. Con esto evitamos que se pueda utilizar un script para que intente acceder al sistema.
Si queremos poner una duración de 20 segundos, lo haríamos de la siguiente manera:
LoginGraceTiem 20
g) Indicar los usuarios que pueden acceder vía SSH
Por medio de la directiva “AllowUser” podemos indicar los usuarios que podrán acceder al servidor vía SSH, así como desde que dirección IP lo podrán hacer. Veamos a continuación algunos ejemplos de cómo indicarlo.
- 1. Indicar sólo el nombre de los usuarios que tendrán acceso
AllowUser armandof pedro
En este caso estamos indicando que sólo los usuarios “armandof” e “pedro” tendrán acceso al sistema vía SSH, independientemente del equipo y la dirección IP desde donde se conecten.
- 2. Acceso de un usuario desde una determinada dirección IP
AllowUser [email protected]
De esta forma lo que indicamos es que el usuario “armandof” podrá acceder vía SSH a la máquina pero sólo desde la dirección IP que indiquemos, en el ejemplo la 192.168.100.1
- 3. Acceso de un usuario desde una determinada red indicada
AllowUser [email protected].*
Con esta forma, que es muy similar al caso anterior, lo que hacemos es indicar al usuario que podrá acceder desde cualquier dirección IP que forme parte de la red indicada.
- 4. Acceso de un usuario desde un determinado equipo de una red
AllowUser [email protected]
En este caso estamos indicando que el usuario “armandof” sólo podrá acceder al servidor desde el equipo “armandofpc.empresa.cu”.
- 5. Acceso de un usuario desde cualquier equipo perteneciente a la red
AllowUser armandof@*.empresa.cu
En este caso, el usuario “pedro” podrá acceder vía SSH desde cualquier equipo que pertenezca a la red.
Al igual que hemos hecho en el punto 1, en una misma línea se puede indicar más de un usuario que tendrá acceso a la máquina vía SSH.
h) Agilizar el proceso de conexión
Evitar que el servidor haga consultas de registros inversos al DNS. Esto agiliza el proceso de conexión. Hay que añadirlo manualmente
UseDNS No
Una vez hecho esto, guardar el archivo y reiniciar el servicio ssh
$ sudo service ssh restart
Ahora nos podríamos conectar al host ejecutando el siguiente comando
$ ssh <usuario>@<IP_host> -p 222
Como he mencionado antes, SSH no sólo vale pare hacer simples conexiones sino que puede llegar a mucho más. En este post explicaré un par de trucos que pueden sacar de un apuro a más de uno. Que son, hacer un SSH Port Forwarding y un SSH Port Forwarding reverse.
SSH Port Forwarding
Primero, ¿qué es un ssh port forwarding? Vamos a explicarlo con un ejemplo:
Imaginemos que nuestra empresa tiene varias sedes repartidas por todo el mundo y, desafortunadamente, no tenemos una VPN para conectarnos entre ellas. Además, por ejemplo, en la sede de Londres tenemos un equipo con un servicio web al que queremos acceder, pero al no tener VPN y estar en una red privada no tenemos manera de acceder a él directamente desde nuestra sede. Pero contamos con que tienen un equipo con una IP pública que podemos utilizar para hacer un salto y poder llegar al servicio web que necesitamos.
Es decir, la idea es poder abrir la página web de la sede de Londres haciendo un port forwarding desde el equipo de salto hacia nuestro equipo.
Hacer esto es muy sencillo, hay que ejecutar el siguiente comandos desde el equipo “Host_cliente”
$ ssh -p222 <usuario>@80.68.95.2 -L localhost:8080:192.168.1.5:80
Una vez hecho esto, se puede ir a un navegador y escribir lo siguiente en la barra de direcciones (en este caso se ha utilizado el puerto 8080 local pero podría ser cualquier otro puerto libre)
http://localhost:8080
Y ya se podría acceder al servicio que está corriendo en “Host_Servicio“, aunque no tengamos conexión directa a el.
SSH Port Forwarding Reverse
Hacer un SSH port forwarding reverse en ciertos momentos también nos puede sacar de un apuro. Como en el caso de antes vamos a explicarlo con un ejemplo.
Vamos a imaginar que tenemos la misma estructura de antes, es decir, la sede de Londres y la nuestra que no están conectadas por VPN .Y como en el caso anterior queremos abrir una página web de Londres a la que no tenemos acceso porque está en una red privada. Pero contamos con un equipo en nuestra red que hace de router y tiene un IP pública pero por políticas de seguridad no podemos facilitar la pass de este a la sede de Londres por lo tanto el método que hemos utilizado antes no vale. Este equipo es el que se va a utilizar para poder abrir la página.
Resumiendo, el host con el servicio web va a hacer un port forwarding inverso contra el host de salto, pudiendo así abrir la página web desde el host cliente.
Primero, editar el archivo de configuración de SSH de “Host_de_salto“:
$ sudo vim /etc/ssh/sshd_config
Y añadir lo siguiente. (Sin esto, el server solo escucharía en localhost) ¡Ojo, puede ser un fallo de seguridad!
GatewayPorts clientspecified
Luego, guardar y reiniciar el servicio:
$ sudo service ssh restart
Ahora desde el “Host_Servicio” crear el túnel inverso hacia el “Host_de_salto“:
$ [email protected] -R 80.68.95.2:8080:localhost:80
Una vez hecho esto, podríamos acceder a la página web desde “Host_Cliente” de la siguiente manera:
http://80.68.95.2:8080
Como se puede ver son 2 trucos muy sencillos de realizar y que pueden servir de gran ayuda en ciertos momentos. No está demás saber exprimir herramientas como SSH, ya que pueden valer para mucho más de lo que creemos.
Esta Historia continuara….
Para agregar otra capa de seguridad podrías implementar ‘port knocking’..
http://www.hackplayers.com/2013/02/port-knocking-proteger-ssh.html