Fail2Ban

De WikiCat IT
Dreceres ràpides: navegació, cerca

El problema principal de la nostra Raspberry Pi és si volem que estigui connectada a la xarxa tot el dia, pot donar-se el cas que qualsevol usuari malintencionat es faci amb el control de la mateixa.

El que ens interessa es que a un cert nombre d'intents erronis la IP del dispositiu que vol entrar al nostra sistema quedi bloquejada.

"Fail2Ban" és un programa que ens ajudarà a prevenir atacs de forma simple. La seva missió consisteix en filtrar un arxiu de registre amb una expressió regular el qual notifiqui una prohibició d'accés al servei del sistema. Depenent del nombre de vegades d'intents erronis, el programa generarà una regla "IPTABLES" denegant l'accés a la IP pel port del servei afectat. Una vegada transcorregut el temps de "baneo" indicat, "Fail2Ban" eliminarà aquesta regla "IPTABLES".

Per fer la instal·lació cal fer el següent:

sudo apt-get install fail2ban

Ara ens toca configurar els diferents arxius de configuració:

  • /etc/fail2ban/jail2ban.conf: arxiu general on podem definir la ruta dels logs, configurar el socket per activar el dimoni....
  • /etc/fail2ban/jail.conf: l'arxiu més important, ja que és on es configura les gàbies dels serveis, temps màxim d'intents, temps de "baneo"....
  • /etc/fail2ban/action.d/: directori on trobem els arxius amb el que es defineixen les accions que es van a utilitzar de manera predeterminada o en cadascun dels serveis definits.
  • /etc/fail2ban/filter.d/: directori que conte els arxius on es defineixen els patrons que Fail2Ban buscarà en l'arxiu log definit en cada servei per activar les accions.

Per sort per nosaltres, quan fem la instal·lació aquesta ja compte amb una configuració per defecte que només cal anar personalitzant.

Abans de començar a fer la teva configuració, caldrà que guardi's una copia de l'original, tal com fem tot seguit:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.original

En aquesta explicació, expliquem com bloquejar el servei SSH.

Obrirem l'arxiu de configuració:

sudo nano /etc/fail2ban/jail.conf

Modifiquem les següents línies generals:

ignoreip = 127.0.0.1/8 # Ignoramos los intentos fallidos desde localhost.
bantime  = 18000 # Tiempo de baneo por defecto en segundos.
maxretry = 3 # Máximo de intentos fallidos por defecto.
action = %(action_mwl)s # acción por defecto con la opción "wl" que enviará un mail de #alerta.
destemail = usuario@gmail.com # Email al que se mandará las notificaciones de alerta.

Gàbia per SSH

Dintre de les gàbies protegirem el servei SSH:

[ssh] # Nombre de la jaula

enabled  = true # Activación por booleano.
port     = 22 # Puerto de escucha de "SSH".
filter   = sshd # Archivo de filtro que está ubicado en /etc/fail2ban/filter.d.
logpath  = /var/log/auth.log # Archivo log donde se aplicará el filtro.

Un cop fet això només cal reiniciar el servei i provar el seu funcionament:

sudo /etc/init.d/fail2ban restart

Per veure en temps real el fitxer log, cal fer el següent:

sudo tail -f /var/log/fail2ban.log

Gàbia per HTTP/HTTPS

Primer de tot, sinó volem perdre temps buscant errors, cal haver instal·lat el servei o la gàbia no funcionarà i el programa no es reiniciarà.

Dintre de les gàbies protegirem el servei HTTP/HTTPS. Seguint amb el document obert abans cal buscar les línies següents i modificar-les i deixar-les tal com estan aquestes que hi ha tot seguit:

# detect password authentication failures
[apache]
enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 2
 
# detect potential search for exploits and php vulnerabilities
[apache-noscript]
enabled  = true
port     = http,https
filter   = apache-noscript
logpath  = /var/log/apache*/*error.log
maxretry = 2
 
# detect Apache overflow attempts
[apache-overflows]
enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2
 
# detect failures to find a home directory on a server
[apache-nohome]
enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/apache*/*error.log
maxretry = 2

Per fer que els canvis tinguin efecte cal reiniciar el servei:

sudo service fail2ban restart

Tenir en compte que triga una estona en reiniciar el servei i funcionar correctament.

Com fer una Blacklist

Per realitzar una blacklist haurem de fer el següent:

Primer generar un fitxer ip.blacklist tal com s'indica a continuació. Cal tenir en compte, que es poden insertar IP manualment però podria ser que deixes de funcionar si troba un retorn de carro al final de línia.

sudo touch /etc/fail2ban/ip.blacklist

Un exemple, del format que pot tenir aquest arxiu, s'ha d'anar amb compte totes les IP's que estiguin en aquest llistat estaran bloquejades pel programa:

103.207.37.0/24
116.31.116.45

Tot seguit haurem de fer una copia o editar l'arxiu iptables-multiport.conf, tal com es mostra a continuació.

nano /etc/fail2ban/action.d/iptables-multiport.conf

En aquest arxiu cal insertar dues línies de codi en dos punts de l'arxiu.

En l'etiqueta actionban, cal deixar-ho com segueix:

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
            echo <ip> >> /etc/fail2ban/ip.blacklist

En l'etiqueta actionstart, cal deixar-ho com segueix:

actionstart = iptables -N fail2ban-<name>
              iptables -A fail2ban-<name> -j RETURN
              iptables -I INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
              cat /etc/fail2ban/ip.blacklist | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j DROP; done

Amb la primera etiqueta el que fem es de forma automàtica fer un baneo de la IP i insertar-la en la nostra llista negra. En la segona el que li diem es que miri el llistat d'IPs baneades i bloquegi totes les IP's que hi han en el mateix.

Errors i possibles solucions

A mi m'hna aparegut dos errors que passo a explicar i donar la solució que a mi m'ha funcionat.

El primer l'error deia una cosa semblant això: "fail2ban error returned 100". La solució ha estat la següent:

Primer editem l'arxiu: "/usr/bin/fail2ban-client"

Busquem la funció següent:

def __processCmd(self, cmd, showRet = True):
          beautifier = Beautifier()
          for c in cmd:
               beautifier.setInputCmd(c)

Un cop l'hem trobada només ens cal afegir la línia "time.sleep(0.1)" per posar en marxa la gàbia del programa una dècima de segon després de que hàgim establert la nostra configuració IPTables. Hauria de quedar com es pot veure tot seguit:

def __processCmd(self, cmd, showRet = True):
          beautifier = Beautifier()
          for c in cmd:
               time.sleep(0.1)
               beautifier.setInputCmd(c)

Per solucionar el segon error, que ens deia una cosa semblant això: "ssh -j fail2ban-ssh returned 200".

Per començar comentar que aquest error el dona perquè hem modificat el port del SSH i no es troba per defecte al port 22. Per solucionar-ho caldrà fer el següent:

Editem l'arxiu que es troba en "/etc/services" i on aparegui "22/tcp" posar el numero del port que hem definit en la configuració.

Eines de l'usuari
Espais de noms

Variants
Navegació
Eines