En el momento en que dejemos una máquina en Internet con el servicio SSH activado, empezaremos a recibir ataques por diccionario sobre nuestro servicio. Una manera de combatir dicho ataque es solo permitiendo a ciertas IPs acceder al servicio (solo a la vlan de gestión, ips confiables, etc…) pero si esta máquina tiene que ser accesibe siempre desde varias ubicaciones y por varios usuarios tendremos que asegurar todo lo que podamos el servicio.

A continuación os dejo lo que suelo modificar del servicio ssh para asegurarlo un poco.

vi /etc/ssh/sshd_config

protocol 2

Existen dos versiones de SSH, la versión 1 está en desuso pero todavía se mantiene por compatibilidad, así que solo permitiremos el protocol v2.

LoginGraceTime 30

Solo vamos a permitir que la pantalla de login esté presenta durante 30 segundos, pasados estos 30 segundos la sesión ssh se cerrará.

PermitRootLogin no

Esta es la más importante de todas las que hemos utilizado hasta ahora. No permitimos acceder a root a través de ssh. Sabemos que en todos los sistemas GNU/Unix existe un supeusuario llamado root, por lo que los scripts de ataque por diccionario podrían intentarlo contra este usuario que saben que si que existe por defecto en el sistema.

MaxAuthtries 2

Indica la cantidad de veces que podemos equivocarnos al ingresar el usuario y la contraseña para acceder a la máquina.

MaxStartUps 5

Le indicamos el número de conexiones simultáneas de login por dirección IP, con esto limitamos mucho los ataques que lanzan miles de threads contra nuestro servidor.

AllowUsers xxxx yyyy

De todos los usuarios que tenemos en el sistema, lo más normal es que solo entren unos pocos. Con esto reducimos los usuarios que pueden acceder mediante el servicio de ssh, restringiéndolo solo a los que van a administrar la máquina.

Port xxxx

Otra opción a tener en cuenta es cambiar el puerto en el que corre el servicio, pero esto no nos defenderá de un ataque, puesto que con un simple escaneo de puertos podremos descubrir en qué nuevo puerto está corriendo el servicio y el script de ataque realizará su esfuerzo contra ese puerto.

Otras alternativas

Pero existen más soluciones que podemos adoptar. Podemos utilizar un script en python llamado denyhosts que leyendo el fichero de log en busca de fallos de autenticación, irá creando reglas de iptables para denegar el acceso a las direcciones IP que presuntamente estén realizando un ataque por diccionario.

Los pasos para realizar la instalación de denyhosts en sistemas basados en RedHat / Fedora / CentOS es la siguiente:

Descargamos el software Denyhosts para sistemas con versión python 2.3

# wget http://belnet.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6-python2.3.noarch.rpm

Instalamos el software:

# rpm -ivh DenyHosts-2.6-python2.3.noarch.rpm

Preparing… ########################################### [100%]
DenyHosts ########################################### [100%]


DenyHosts se instala en /usr/share/denyhosts Y ahora tenemos que crear el fichero de confguración, lo haremos basándonos en el que trae de ejemplo la instalación:

cd /usr/share/denyhosts
cp denyhosts.cfg-dist denyhosts.cfg

Editamos el archivo denyhost.cfg y vamos ajustando los parámetros que se observan a continuación:

SECURE_LOG = /var/log/secure //lugar donde se encuentra el log
HOSTS_DENY = /etc/hosts.deny //fichero donde negaremos el acceso
PURGE_DENY = 4w //tiempo en el que tendremos la IP baneada
BLOCK_SERVICE = ALL //baneamos todos los servicios, no solo SSH
ADMIN_EMAIL = administrador@dominio.tld //correo del administrador para recibir notificaciones

Ahora vamos a crear el enlace simbólico para arrancar el daemon cada vez que se inicie la máquina.

# cd /usr/share/denyhosts/
# cp daemon-control-dist daemon-control

# cd /etc/init.d
# ln -s /usr/share/denyhosts/daemon-control denyhosts
# chkconfig –add denyhosts

Editamos el archivo daemon-control para verificar que está apuntando al lugar donde se encuentran los binarios y el fichero de configuración:

DENYHOSTS_BIN = “/usr/bin/denyhosts.py”
DENYHOSTS_LOCK = “/var/lock/subsys/denyhosts”
DENYHOSTS_CFG = “/usr/share/denyhosts/denyhosts.cfg”

El archivo solo debe ser ejecutable para root:

chown root daemon-control
chmod 700 daemon-control
Arrancamos denyhosts

cd /etc/init.d/
./daemon-control start

Ahora ya tenemos a denyhosts corriendo cada vez que se inicie la máquina:

chkconfig --list denyhosts
denyhosts 0:desactivado 1:desactivado 2:activo 3:activo 4:activo 5:activo 6:desactivado