Configuración
Una vez tenemos instalados todos los paquetes, procedemos a descargarnos la versión de fail2ban que queramos, tenemos disponibles, tanto los fuentes, como un paquete para distribuciones basadas en Debian (.deb) o para distribuciones basadas en Red Hat (.rpm)..
Y los instalamos..
Ya tenemos el fail2ban instalado en /usr/bin/fail2ban si todo ha ido bien, si hacemos un fail2ban -h deberíamos ver la ayuda, algo así como:
Fail2Ban v0.5.1 reads log file that contains password failure report and bans the corresponding IP addresses using firewall rules. -b start fail2ban in background. -d start fail2ban in debug mode. -c <FILE> read configuration file FILE. -p <FILE> create PID lock in FILE. -h display this help message. -i <IP(s)> IP(s) to ignore. -k kill a currently running Fail2Ban instance. -r <VALUE> allow a max of VALUE password failure. -t <TIME> ban IP for TIME seconds. -v verbose. Use twice for greater effect. -V print software version.
Todo genial, ya tenemos que localizar el fichero de configuración y adaptarlo a nuestras necesidades, con unos pequeños retoques estaremos listos..
El fichero en cuestión es el /etc/fail2ban.conf.example lo renombramos a .conf para poder trabajar sobre él..
mv /etc/fail2ban.conf.example /etc/fail2ban.conf
Ahora lo editamos con nuestro editor favorito y vamos recorriendo las lineas que tiene y cambiaremos las que más nos interesan:..
Bien, en este apartado, se nos da la posibilidad de correr fail2ban como daemon, cosa que nos interesa, por eso le decimos que «background=true».
# Option: background. # Notes.: start fail2ban as a daemon. Output is redirect to logfile.. # Values: [true | false] Default: false. #. background = true
¿Dónde van a estar los logs?.
Tenemos dos opciones, o bien decirle que use syslog, y que todo lo que haga vaya al /var/log/messages o bien que cree su propio fichero /var/log/fail2ban.log, podeis hacer lo que creais conveniente, a mi personalmente me gusta tenerlo todo bien ordenado, por eso le digo que tenga su propio fichero de logs..
# Option: logtargets. # Notes.: log targets. Space separated list of logging targets.. # Values: STDERR SYSLOG file Default: /var/log/fail2ban.log. # logtargets = /var/log/fail2ban.log
¿Cuántos intentos vamos a dejar antes de banear la ip?.
Por defecto vienen 3, personalmente creo que es un buen número de intentos, ¿quién no se ha equivocado dos veces al meter el nombre de usuario o contraseña? Por tanto, lo dejamos tal cual viene..
# Option: maxretry. # Notes.: number of retrys before IP gets banned.. # Values: NUM Default: 3. #. maxretry = 3
¿Cuánto tiempo vamos a banear a la ip que intenta atacarnos?.
Por defecto vienen 600 segundos, que son 10 minutos, a mi juicio es poco tiempo, ya que le baneamos, que sea por un tiempo razonable y se canse, así que yo he optado por poner 36000 que son 10 horas.
# Option: bantime. # Notes.: number of seconds an IP will be banned.. # Values: NUM Default: 600. #. bantime = 36000
Esta opción es bastante interesante, nos permite hacer excepciones con quién baneamos..
Por ejemplo si conectamos siempre desde una ip o desde varias ips fijas y sabemos que somos nosotros y nadie más, podemos decirle que a estas ips no las ignore, pese a que tengamos un día torpón y fallemos más de 3 veces el login..
Podemos también ignorar a una red entera indicando su máscara..
Yo por mi parte le he dicho que no banee a nadie de mi red privada y a otras dos ips desde las que conecto, pero por seguridad no puedo listarlas aquí..
# Option: ignoreip. # Notes.: space separated list of IP's to be ignored by fail2ban.. # You can use CIDR mask in order to specify a range.. # Example: ignoreip = 192.168.0.1/24 123.45.235.65. # Values: IP Default: 192.168.0.0/24. #. ignoreip = 192.168.1.0/24
Con estas dos opciones podemos decirle a nuestro sistema de que nos informe cuando fail2ban es iniciado, por defecto no viene nada, yo por mi parte le he dicho que me mande un mail avisandome de que se ha puesto en funcionamiento..
# Option: cmdstart. # Notes.: command executed once at the start of Fail2Ban. # Values: CMD Default:. #. cmdstart = echo "Se ha iniciado fail2ban" | mail -s "Fail2ban" manuelATtodo-linux.com..
Con esta opción es igual,pero para que nos informe si se ha parado el servicio, he creido conveniente que me avise al correo igualmente..
# Option: cmdend. # Notes.: command executed once at the end of Fail2Ban. # Values: CMD Default:. #. cmdend =echo "Se ha detenido fail2ban" | mail -s "Fail2ban" manuelATtodo-linux.com<
Para esta opción debeis tener corriendo un servidor de correo en el mismo host que el fail2ban, en mi caso lo tengo, así que sacaré partido de él.
Quiero que me avise al correo cuando se banea alguna ip, así que activo esta opción.
[MAIL] # Option: enabled. # Notes.: enable mail notification when banning an IP address.. # Values: [true | false] Default: false. #. enabled = true
Ahora tenemos que meter los datos de nuestro servidor de correo, los que vienen por defecto están bien..
# Option: host. # Notes.: host running the mail server.. # Values: STR Default: localhost. #. host = localhost # Option: port. # Notes.: port of the mail server.. # Values: INT Default: 25. #. port = 25
Ahora rellenamos dos campos muy sencillos, que serán, el remitente del correo y a quién debe enviarlo, este es mi caso:.
# Option: from. # Notes.: e-mail address of the sender.. # Values: MAIL Default: fail2ban. #. from = fail2ban # Option: to. # Notes.: e-mail addresses of the receiver. Addresses are space. # separated.. # Values: MAIL Default: root. #. to = manuelATtodo-linux.com
El asunto del correo lo definimos en:.
# Option: subject. # Notes.: subject of the e-mail.. # Tags: <ip> IP address. # <failures> number of failures. # <failtime> unix timestamp of the last failure. # Values: TEXT Default: [Fail2Ban] Banned <ip>. #. subject = [Fail2Ban] Se ha baneado a <ip>..
Y ahora el cuerpo del correo que nos será enviado:.
# Option: message. # Notes.: message of the e-mail.. # Tags: <ip> IP address. # <failures> number of failures. # <failtime> unix timestamp of the last failure # <br> new line. # Values: TEXT Default: . #. message = La ip <ip> ha sido baneada por Fail2Ban despues de
<failures> intentos fallidos…
Ahora nos metemos ya en la configuración de los servicios por los que fail2ban velará en nuestro sistema, el primero es para todos aquellos que tengan un servidor web Apache corriendo en la máquina, como es mi caso, pues tendré que entrar a retocar algunos parámetros de este apartado…
Lo primero es indicarle que sí tiene que activarse para Apache, eso se lo decimos en aquí..
[Apache] # Option: enabled. # Notes.: enable monitoring for this section.. # Values: [true | false] Default: false. #. enabled = true
Ahora le decimos de dónde tiene que recoger la información, pues del access_log, se lo indicamos:.
# Option: logfile. # Notes.: logfile to monitor.. # Values: FILE Default: /var/log/httpd/access_log. #. logfile = /var/log/httpd/access_log
Ahora vienen las dos opciones que comentamos antes, si queremos que al iniciar el fail2ban para Apache se nos notifique de alguna forma, como se comentó antes, no lo vamos a volver a decir…
Siguiente paso, ¿qué ha de hacer iptables para banear una ip? ¿y cuando tenga que quitarle el ban? Pues eso lo indicamos en estas dos secciones que podemos dejar por defecto..
# Option: fwban. # Notes.: command executed when banning an IP. Take care that the # command is executed with Fail2Ban user rights.. # Tags: <ip> IP address. # <failures> number of failures. # <failtime> unix timestamp of the last failure. # <bantime> unix timestamp of the ban time. # Values: CMD. # Default: iptables -I INPUT 1 -i eth0 -s <ip> -j DROP. #. fwban = iptables -I INPUT -s <ip> -j DROP # Option: fwunban. # Notes.: command executed when unbanning an IP. Take care that the # command is executed with Fail2Ban user rights.. # Tags: <ip> IP address. # <bantime> unix timestamp of the ban time. # <unbantime> unix timestamp of the unban time. # Values: CMD. # Default: iptables -D INPUT -i eth0 -s <ip> -j DROP. #. fwunban = iptables -D INPUT -s <ip> -j DROP
¿Cómo va a reconocer fail2ban que tiene que bannear a alguien? Pues porque encuentre las determinadas palabras en los logs, eso lo definimos en:(yo he añadido la de user notfound).
# Option: failregex. # Notes.: regex to match the password failure messages in the logfile.. # Values: TEXT Default: authentication failure|user .* not found. #. failregex = authentication failure|user .* not found|*. User notfound.
Se acabó la cosa para Apache, ahora entramos en la sección de nuestro servidor Ssh.
Le decimos que queremos habilitar el fail2ban para ssh:
[SSH] # Option: enabled # Notes.: enable monitoring for this section. # Values: [true | false] Default: true # enabled = true
Ahora debemos indicarle, al igual que hicimos con Apache, donde ha de recoger los datos en los que basarse para banear ips, en mi caso, los logs del sshd están en /var/log/secure poned vuestro PATH a los logs, ¡¡no el mio!!
# Option: logfile # Notes.: logfile to monitor. # Values: FILE Default: /var/log/secure # logfile = /var/log/secure
Ahora vienen las opciones para notificarnos (si queremos) cuando se inicialice fail2ban y cuando se acabe, no las comentamos.
Pasamos directamente a las ordenes que se le pasaran a iptables tanto para banerar como para desbanear ips, las podemos dejar por defecto.
# Option: fwbanrule # Notes.: command executed when banning an IP. Take care that the # command is executed with Fail2Ban user rights. # Tags: <ip> IP address # <failures> number of failures # <failtime> unix timestamp of the last failure # <bantime> unix timestamp of the ban time # Values: CMD # Default: iptables -I INPUT 1 -i eth0 -s <ip> -j DROP # fwban = iptables -I INPUT -s <ip> -j DROP # Option: fwunbanrule # Notes.: command executed when unbanning an IP. Take care that the # command is executed with Fail2Ban user rights. # Tags: <ip> IP address # <bantime> unix timestamp of the ban time # <unbantime> unix timestamp of the unban time # Values: CMD # Default: iptables -D INPUT -i eth0 -s <ip> -j DROP # fwunban = iptables -D INPUT -s <ip> -j DROP
Y ya, solo tenemos que fijarnos en las palabras clave que ha de buscar fail2ban en los logs para determinar cuando sí y cuando no se está intentando el login
# Option: failregex # Notes.: regex to match the password failures messages in the logfile. # Values: TEXT Default: Authentication failure|Failed password|Invalid user # failregex = Authentication failure|Failed password|Invalid user
Ya tenemos el fichero listo, lo guardamos y salimos.
Ahora solo debemos arracar el fail2ban como root y esperar los resultados, que no se harán esperar, vamos a hacer una prueba.
Me loggeo en una máquina cuya ip no está en la sección ignore y me pongo a fallar contra mi máquina:
(Protego las ips, por seguridad, no serán mostradas)
Vemos que el fail2ban está corriendo:
Ahora desde la otra máquina intentamos conectar a nuestro pc, y fallamos tres veces la contraseña:
Ahora tras esto intentamos conectar de nuevo al servidor, y ponemos las opciones -v -v -v para qué pasa en la conexión.
Y como vemos, no podemos conectar, estamos baneados:
Ahora nos vamos a la máquina local, a ver qué nos dicen los logs de fail2ban
Nov 18 12:20:52 desastre python2.4: SSH: 80.59.XX.XX has 3 login failure(s). Banned.
Pues sí, hemos sido baneados.
Espero que os haya sido útil.