Hardening de un servidor ssh

El término hardening (endurecimiento en inglés) es utilizado en seguridad informática para referirse al proceso de hacer más seguro nuestros servidores de manera que se reduzcan las posibilidades de un ataque lo máximo posible.

En esta entrada vamos a ver algunas modificaciones que podemos hacer en nuestro servidor ssh para hacerlo más seguro que con la configuración básica por defecto.

ssh-server-hardenedVamos a basarnos en un servidor ssh dockerizado para ver cómo podemos hacer este proceso. En el siguiente enlace se puede descargar un servidor centOS con OpenSSH el cual utiliza una llave RSA para autenticación con el servidor con el usuario root. https://github.com/secdevoops/ssh-server.

Seguimos los pasos indicados en el proyecto GitHub y levantamos nuestro contenedor.

Una vez levantado, podremos acceder por el puerto 22 a través de localhost, ya que hemos mapeado el puerto 22 (por defecto, el puerto que usa un servidor ssh) del contenedor con el puerto 22 de nuestra máquina host.

Y como se indica en el proyecto, podemos acceder al contenedor por ssh mediante el siguiente comando:

ssh -i ./my_key root@localhost

Bien, ahora que tenemos nuestro servidor funcionando, vamos a realizar una serie de modificaciones en el fichero de configuración que nos ayudará a tener un servicio más securizado.

Como estamos trabajando con un contenedor docker y queremos que nuestros cambios se mantengan, vamos a coger el fichero sshd_config del contenedor para realizar los cambios y después modificaremos nuestro fichero Dockerfile para que se agrege dicho fichero a la imagen y así mantener nuestra configuración.

Para ello, vamos a crearnos una carpeta config dentro de nuestro proyecto y a continuación extraemos del contenedor docker el fichero sshd_config y lo copiaremos a dicha carpeta.

$ mkdir config

$ docker cp ssh-server:/etc/ssh/sshd_config ./config

Podemos parar y eliminar nuestro contenedor, ya que crearemos uno nuevo a partir de este.

$ docker stop ssh-server

$ docker container rm ssh-server

Modificamos el fichero Dockerfile y añadimos la siguiente línea, de manera que se copie nuestra nueva configuración en la imagen docker:

COPY config/* /etc/ssh/

Lo primero que podemos hacer es añadir un mensaje antes de que te pida el password. Es importante no poner nada que pueda revelar información sensible.

En el fichero /etc/ssh/sshd_config podemos indicar que queremos poner un banner. Nos podemos crear un fichero donde pongamos el banner que queramos mostrar (texto, ascii…) y después añadiremos al final del fichero sshd_config el banner mediante el atributo Banner.

Para poner el banner, he creado un banner en ascii y lo he copiado a un fichero llamado ssh_banner (en mi caso he querido darle un toque friki, pero podríamos poner un texto legal que sirviera para advertir al usuario que se va a conectar o a alguien que intenta acceder de manera indebida)

Ahora podemos descomentar la línea #Banner del fichero sshd_config para añadir el banner haciendo referencia al fichero que hemos creado.

$ sed -ri 's/^#?Banner\s+.*/Banner \/etc\/ssh\/ssh_banner/' sshd_config

Con esto hemos añadido un banner a nuestra configuración. Si creamos la imagen docker y la levantamos, podremos comprobar que al acceder por ssh al contenedor docker nos aparece el banner que hemos puesto.

Una vez tenemos nuestro banner, vemos también que cuando se ha accedido al servidor, nos aparece información del Last login. Podemos evitar que salga esta información cambiando el parámetro PrintLastLog y poniéndolo a no.

PrintLastLog no

Si volvemos a recrear la imagen y el contenedor, tras hacer login veremos que ya no se muestra esta información.

Existe más información que podemos eliminar. Si utilizamos la herramienta netcat para conectar con el servicio, veremos que nos muestra la siguiente información.

Debemos tener en cuenta que esto forma parte del protocolo ssh y tiene el siguiente formato:

SSH-protoversion-softwareversion SP comments CR LF

Se puede reducir la información, pero nunca eliminarla, puesto que podría provocar problema de compatibilidad y funcionalidad. Lo que sí vamos a poder hacer es eliminar los comentarios (si los tuviera) y limitar la versión del software. Para ello, necesitamos modificar el fichero ejecutable a través de un editor hexadecimal.

Lo primero que vamos a hacer es instalar hexedit.

$ sudo apt-get install hexedit

Después haremos una copia del binario sshd que hay en el contenedor docker.

$ docker cp ssh-server:/usr/sbin/sshd .

Y ejecutamos hexedit sobre el fichero para modificarlo.

$ hexedit sshd

Una vez en el editor, pulsamos el tabulador para situarnos en la zona ASCII y a continuación Ctrl+s para buscar el texto «_8.0».

Pulsamos de nuevo el tabulador para irnos a la zona hexadecimal y vamos poniendo ceros para eliminar el contenido que no deseamos que se muestre.

Con Ctrl+x podemos guardar y salir del editor. Ahora copiaremos el fichero modificado a su ruta y si ejecutamos netcat veremos que ya no nos muestra la información que salía al principio.

Modificamos el fichero Dockerfile para añadir nuestro nuevo fichero y volvemos a crear la imagen para comprobarlo.

Como vemos, hemos conseguido reducir la información que se expone.

En la siguiente entrada, veremos cómo proporcionar un servicio ssh más seguro al exterior.

Categorías