5 jun 2010

Seguridad en SSH (3)

Ahora ya hemos configurado nuestro servidor SSH y estamos bastante seguros que un ataque por fuerza bruta no tendría éxito contra él. ¿Entonces ya no podemos hacer más que esperar y resistir a las hordas de malévolos atacantes que intentan acceder a nuestro equipo? Obviamente la respuesta es no y veremos como configurar nuestro sistema para tener una mejor defensa ante los atacantes que campan por la red.

Para aumentar nuestro nivel de seguridad vamos usar DenyHosts, un script escrito en Python que se encarga de revisar nuestro log buscando atacantes y añade estos al fichero /etc/hosts.deny. Este fichero no es más que una lista negra con la dirección de las máquinas a las que se ha bloqueado el acceso al sistema. Con lo que una vez identificados los atacantes, y añadidos a la lista negra, evitamos que estos puedan intentar conectarse de nuevo a nuestro sistema.



Para instalar denyhosts basta con ejecutar desde la consola sudo apt-get install denyhosts pues el programa ya se encuentra en los repositorios de Ubuntu. Una vez instalado pasamos a configurarlo editando el fichero /etc/denyhosts.conf. Veamos como siempre las opciones más interesantes:

  • SECURE_LOG = /var/log/auth.log : ruta del fichero de log donde se almacena la información del servidor SSH. Como vimos en otro artículo esta ruta en Ubuntu por defecto es /var/log/auth.
  • HOSTS_DENY = /etc/hosts.deny: ruta del fichero hosts.deny.
  • PURGE_DENY =: periodo de tiempo tras el cual se eliminarán las IPs baneadas del fichero hosts.deny. Si no establecemos ningún valor esta limpieza no se producirá nunca. Si queremos establecer un periodo especificaremos un numero seguido de una letra para indicar el tipo ('m' minutos,'h' horas,'d' días,'w' semanas e 'y' años), por ejemplo cinco días 5d.
  • PURGE_THRESHOLD = 0: número de veces que una IP puede ser eliminada de la lista negra, si se supera el número establecido esta no sera eliminada aunque se cumpla el periodo de PURGE_DENY. El valor 0 desactiva esta opción.
  • BLOCK_SERVICE = sshd: servicio bloqueados al atacante. En el fichero hosts.deny es posible bloquear solo ciertos servicios a las máquinas baneadas por lo que si usamos la opción sshd se bloqueara solo el acceso al servidor SSH. Para bloquear todos los servicios usaremos la opción ALL.
  • DENY_THRESHOLD_INVALID = 5 : número de intentos fallidos para nombres de usuario no válidos (usuarios que no existen en nuestra máquina) tras lo cual se baneará la IP.
  • DENY_THRESHOLD_VALID = 510: número de intentos fallidos para nombres de usuario válidos (usuarios que existen en nuestra máquina excepto el usuario root) tras lo cual se baneará la IP.
  • DENY_THRESHOLD_RESTRICTED = 1 : número de intentos fallidos para nombres de usuario restringidos (usuarios definidos en el fichero WORK_DIR/restricted-usernames) tras lo cual se baneará la IP.
  • WORK_DIR = /var/lib/denyhosts: ruta donde se guardan los fichero del programa.
  • SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES: indica si se informará de la actividad sospechosa de las máquinas en el fichero hosts.allow (del resto siempre se informa). El fichero hosts.allow es una lista blanca con las máquinas que tienen el acceso permitido a nuestra máquina.
  • ADMIN_EMAIL = root@localhost
    SMTP_HOST = localhost
    SMTP_PORT = 25
    : si queremos que el programa nos envíe los informes a nuestra cuenta de correo debemos configurar estas opciones con nuestra dirección y un servidor SMTP válido.
  • PLUGIN_DENY=/usr/bin/true: apunta a un programa que será ejecutado cada vez que se bloquee el acceso a una máquina, pasándole como argumento la IP de esta. Esta opción puede resultar interesante para jugar con Iptables y un par de scripts, por ejemplo podríamos redirigir los atacantes a un honeypot.
  • DAEMON_LOG = /var/log/denyhosts: ubicación del fichero de log donde se guardará la información de Denyhosts.
  • SYNC_SERVER = http://xmlrpc.denyhosts.net:9911: podemos permitir que Denyhosts sincronice sus datos con los del servidor de la aplicación, consiguiendo así una lista mucho más completa.
  • SYNC_UPLOAD = yes: permite que nuestra máquina envíe los hosts baneados al servidor de Denyhosts.
  • AGE_RESET_VALID=5d: establece el periodo de tiempo tras el cual se reiniciará el contador de intentos para los usuarios validos. El resto de opciones AGE_RESET_* son similares para los otros tipos de usuarios.

Una vez configurado Denyhosts procederemos a reiniciar el servicio para aplicar los cambios realizados con la orden sudo /etc/init.d/denyhosts restart

Una de las opciones más interesantes de Denyhosts para jugar con ella es la opción PLUGIN_DENY. Usando esta opción y un script resulta muy fácil redirigir a nuestros atacantes a otro puerto o a otra máquina con un honeypot. Un sencillo script como este sería suficiente para ello:


#!/bin/bash
iptables -t nat -A PREROUTING -s $1 -p tcp --dport 22 -j REDIRECT --to-port 60000

Si queremos que los atacantes no noten nuestro pequeño truco es necesario que la claves privada y pública en el honeypot sean la misma que en nuestro servidor SSH. En caso contrario el cliente SSH detectará que el servidor SSH ha cambiado y alertaría al usuario de un posible ataque de MITM (man in the middle).

No hay comentarios: