Impostare il firewall con fail2ban

6 ottobre 2015 Roberto Puzzanghera0 commenti

Fail2ban ispeziona i log file (ad es. /var/log/apache/error_log) e banna IPs che mostrano un comportamento sospetto -- troppe password sbagliate, tentativi di  exploits, etc. Generalmente Fail2Ban è quindi usato per aggiornare le regole del  firewall al fine di rigettare gli indirizzi IP durante un intervallo di tempo settabile, benchè ogni altra azione (come l'invio di una mail di notifica) può anche altresì essere impostata. Tra le altre cose Fail2Ban mette a disposizione dei filtri per diversi servizi come apache, courier, ssh, etc.

Mostrerò brevemente come installare e configurare fail2ban per rigettare le connessioni di IP sospetti, specialmente quelli riguardanti la patch qmail-dnsrbl. Ciò evita di essere bannati noi stessi da spamhaus, che è gratuito solo fino a 100.000 query al giorno.

fail2banrichiede che si abbia un firewall come iptables attivo.

Scaricare e installare

cd /usr/local/src
wget https://codeload.github.com/fail2ban/fail2ban/tar.gz/x.x.x --output-document=fail2ban-x.x.x.tar.gz
tar xvjf fail2ban-x.x.x.tar.bz2
cd fail2ban-x-x-x
chown -R root.root .
./setup.py install

Script di avvio

Al fine di avviare il server si può usare uno script reperibile nella cartella files/ della directory sorgente, dove se ne potrà trovare uno adatto alla propria distribuzione linux. Io uso questo (scarica qui) che non ricordo più dove ho trovato:

#!/bin/sh
#
# Copyright (c) 2008-2013, Nishant Limbachia, Hoffman Estates, IL, USA
# 
# /etc/rc.d/rc.fail2ban
#
# start|stop|restart|reload|status|ping fail2ban server
#
# To start fail2ban automatically at boot, make this file executable:
# chmod 755 /etc/rc.d/rc.fail2ban
# you must also add this to rc.local for fail2ban to start during boot.

# default socket file is /var/run/fail2ban/fail2ban.sock which can be
# changed via the config file: /etc/fail2ban/fail2ban.conf

fail2ban_start() {
  if [ -x /etc/rc.d/rc.fail2ban ]; then
        echo "Starting fail2ban: "
        ### using -x option to remove any stale socket file.
        /usr/bin/fail2ban-client -x start
  fi
}

fail2ban_stop() {
        echo "Stopping fail2ban"
        /usr/bin/fail2ban-client stop
}

fail2ban_reload() {
        echo "Reloading fail2ban"
        /usr/bin/fail2ban-client reload
}

fail2ban_status() {
        echo "Status: fail2ban"
        /usr/bin/fail2ban-client status
}

fail2ban_ping() {
        echo "Pinging fail2ban"
        /usr/bin/fail2ban-client ping
}

case "$1" in
'start')
        fail2ban_start
  ;;
'stop')
        fail2ban_stop
  ;;
'restart')
        fail2ban_stop
        sleep 5
        fail2ban_start
;;
'reload')
        fail2ban_reload
  ;;
'status')
        fail2ban_status
  ;;
'ping')
        fail2ban_ping
  ;;
*)
        echo "USAGE: $0 start|stop|restart|reload|status|ping"
        exit 1
  ;;
esac

Copiamo questo script in /etc/rc.d/ o dove meglio si ritiene opportuno in funzione della distribuzione usata, lanciamolo e ricordiamoci di lanciarlo anche all'avvio della macchina:

/etc/rc.d/rc.fail2ban start

logrotate script

Copiare il logrotate script dalla cartella di installazione citata sopra come segue:

cd /etc/logrotate.d
cp /usr/local/src/fail2ban-x.x.x/files/fail2ban-logrotate fail2ban

Configurazione dei jails

Per comprendere la terminologia e come veramente funziona fail2ban è consigliabile almeno la lettura del manuale ufficiale, che è conciso e di facile lettura.

E' una buona regola non modificare mai i file /etc/fail2ban/*.conf, ma editare un file personalizzato con estensione .local, che sarà letto dal server dopo ogni file .conf per sovrascrivere eventualmente le righe di codice modificate.

cd /etc/fail2ban
cp jail.conf jail.local

Abilitare i jails secondo le proprie intenzioni.

Questo è ciò che ho io nel mio jail.local, per quanto riguarda la parte qmail/dovecot:

# nano /etc/fail2ban/jail.local

[qmail-smtp]
enabled  = true
filter   = qmail-smtp
action   = iptables[name=SMTP, port=25, protocol=tcp]
           sendmail-whois[name=SMTP, sendername="Fail2Ban SMTP"]
logpath  = /var/log/qmail/smtpd/current
maxretry = 2
bantime  = 86400
findtime = 3600


[qmail-submission]
enabled  = true
filter   = qmail-smtp
action   = iptables[name=SUBMISSION, port=587, protocol=tcp]
           sendmail-whois[name=SUBMISSION, sendername="Fail2Ban SUBMISSION"]
logpath  = /var/log/qmail/submission/current
maxretry = 2
bantime  = 86400
findtime = 3600


[vpopmail]
enabled  = true
filter   = vpopmail
action   = iptables[name=VPOPMAIL, port=587, protocol=tcp]
           sendmail-whois[name=VPOPMAIL, sendername="Fail2Ban vpopmail"]
# check your syslog mail related log (mail.log in some systems)
logpath  = /var/log/maillog
maxretry = 5
bantime  = 86400
findtime = 3600


[qmailadmin]
enabled  = true
filter   = qmailadmin
action   = iptables[name=QMA, port=443, protocol=tcp]
           sendmail-whois[name=QMA, sendername="Fail2Ban qmailadmin"]
logpath  = /var/log/qma-auth.log
maxretry = 4
bantime  = 86400
findtime = 3600


[roundcube-auth]
enabled  = true
filter   = roundcube-auth
action   = iptables[name=RC, port=80, protocol=tcp]
           sendmail-whois[name=RC, sendername="Fail2Ban RoundCube"] 
logpath  = /path/to/apache/htdocs/roundcube/logs/userlogins
maxretry = 4
bantime  = 86400 findtime = 30


[dovecot]
enabled  = true
filter   = dovecot
action   = iptables-multiport[name=DOVECOT, port="143,993,110,995", protocol=tcp]
           sendmail-whois[name=DOVECOT, sendername="Fail2Ban dovecot"]
logpath  = /var/log/dovecot/dovecot.log
maxretry = 6
bantime  = 3600
findtime = 3600

Come si può notare, ci sono tre jail, quindi fail2ban andrà a leggere i file qmail-smtp.conf, vpopmail.conf e dovecot.conf sotto la directory filter.d. Mostrerò il contenuto di questi file più sotto in questa pagina.

Il jail qmail-smtp è abbinato al filtro omonimo "qmail-smtp", che combaciano (traduzione esatta di "to match"? :-) con le righe del log file qmail-smtp log che contengono respingimenti dovuti a qmail-dnsbl e chkuser. Il filtro deve essere dichiarato nel file filter.d/qmail-smtp.conf.

Allo stesso modo, il jail vpopmail cercherà di respingere i clients che cercano di indovinare le password degli utentinella porta 587, mentre il jail dovecot farà lo stesso per quanto concerne imap/pop3.

Questo è il contenuto dei file con i filtri:

qmail-smtp.conf

# nano /etc/fail2ban/filter.d/qmail-smtp.conf

# Fail2Ban filters for qmail-smtp patched for qmail-dnsbl (http://qmail-dnsbl.sourceforge.net), greetdelay chkuser (http://opensource.interazioni.it/qmail/chkuser.html)
#
# the log shows a line like this:
# @4000000052aebcd831f42f64 qmail-smtpd: message rejected (qmail-dnsbl) (74.200.210.162.zen.spamhaus.org): recappedbx@gmail.com from 162.210.200.74 to localuser@domain.xy helo Wireless_Broadband_Router
# @4000000053ce3d860e9dd04c CHKUSER rejected rcpt: from <info383642@bccsoar.it|remoteinfo/auth:|chkuser-identify:> remote <helo:www742.sakura.ne.jp|remotehostname:unknown|remotehostip:59.106.19.192> rcpt <localuser@domain.xy> : not existing recipient
# @4000000053fb43de062c21ac CHKUSER rejected rcpt: from <info@domain.xy|remoteinfo/auth:|chkuser-identify:> remote <helo:apexpowerconcepts.com|remotehostname:unknown|remotehostip:202.130.114.130> rcpt <amoomoo212133411111434@hanmtrta.net> : invalid rcpt MX domain
# @400000005357ecd40012e5e4 CHKUSER rejected relaying: from <yxqdi@yourdomain.xy|remoteinfo/auth:|chkuser-identify:> remote <helo:gruporga-f2de56|remotehostname:unknown|remotehostip:177.11.51.77> rcpt <teste3.pop3@hotmail.com> : client not allowed to relay
# @400000005450602534f65f5c GREETDELAY from 94.242.250.137: client sent data before greeting
# @40000000545076ad1de678ec GREETDELAY from 77.65.15.93: client disconnected
#
# Be aware that the following regex match only my patched chkuser at http://notes.sagredo.eu/node/82
# If you are using a standard version of chkuser you can refer to this page for the correct filter: http://wiki.qmailtoaster.com/index.php/Fail2Ban

[Definition]

failregex = qmail-smtpd: message rejected \(qmail-dnsbl\) .* from 
            CHKUSER rejected rcpt: from <.*> remote <.*remotehostip:>
            CHKUSER rejected relaying: from <.*> remote <.*remotehostip:> .* : client not allowed to relay$
            GREETDELAY from :

ignoreregex =

# DEV Notes:
#
# Author: Roberto Puzzanghera

vpopmail.conf

# nano /etc/fail2ban/filter.d/vpopmail.conf

[Definition]

# Jul 10 12:05:53 qmail vpopmail[3076]: vchkpw-submission: vpopmail user not found helpdesk@yourdomain.xy:191.233.70.140
# Jul 22 17:31:46 qmail vpopmail[6383]: vchkpw-submission: password fail (pass: 'dasdas') postmaster@yourdomain.xy:1.2.3.4

failregex = vchkpw-submission: vpopmail user not found .*:$
            vchkpw-submission: password fail .*:$

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
ignoreregex =

# DEV Notes:
#
# Author: Roberto Puzzanghera

qmailadmin.conf

# bans qmailadmin login attempts looking for lines like this
# 2015/05/27 15:45:58 user:postmaster@domain.xy ip:1.2.3.4 auth:failed [@domain.xy]
# qmailadmin must be patched with http://notes.sagredo.eu/files/qmail/patches/qmailadmin/qmailadmin-1.2.16-log.patch
# (thanks to Tony)

[INCLUDES]
before = common.conf

[Definition]
failregex = ip: auth:failed

ignoreregex =

roundcube-auth.local

Il filtro roundcube-auth.conf esiste già, quindi lo sovrascriviamo.

# Fail2Ban configuration file for roundcube webmail
#
# Author: Roberto Puzzanghera
# 29/09/2014
#
# Log line to match
# [01-Sep-2014 00:07:11 +0200]: IMAP Error: Login failed for sisgri@iol.it from 151.55.133.38. AUTHENTICATE PLAIN: Authentication failed. in /usr/local/www/htdocs/roundcubemail-1.0.2/progra$

[INCLUDES]

before = common.conf

[Definition]

failregex = IMAP Error: (FAILED login|Login failed) for .*? from \.

ignoreregex =

dovecot.local

Il filtro dovecot.conf esiste già, quindi lo sovrascriviamo

# nano /etc/fail2ban/filter.d/dovecot.local

# Fail2Ban filter Dovecot authentication and pop3/imap server
#
# Jul 22 23:33:29 auth-worker(27283): Info: sql(user@yourdomain.xy:1.2.3.4): Password mismatch
# Jul 22 23:33:31 imap-login: Info: Disconnected (auth failed, 1 attempts in 2 secs): user=<user@yourdomain.xy>, method=PLAIN, rip=1.2.3.4, lip=5.6.7.8, session=<k2t5+c7+5AAKAAAC>
# Jul 22 23:34:04 auth-worker(27283): Info: sql(adminww@yourdomain.xy:1.2.3.4): unknown user
# Jul 22 23:34:06 imap-login: Info: Disconnected (auth failed, 1 attempts in 2 secs): user=<adminww@yourdomain.xy>, method=PLAIN, rip=1.2.3.4, lip=5.6.7.8, session=<ONqY+87+7gAKAAAC>

[Definition]

failregex = Info: Disconnected \(auth failed, .* rip=,

ignoreregex =

# DEV Notes:
#
# Author: Roberto Puzzanghera

Infine sarà il caso di sovrascrivere il file /etc/fail2ban/action.d/sendmail-common.conf per impostare l'email di destinazione dove inviare gli avvisi

# nano /etc/fail2ban/action.d/sendmail-common.local

# Fail2Ban configuration file
#
# Common settings for sendmail actions

[Init]

# Recipient mail address
#
dest = postmaster@yourdomain.xy

# Sender mail address
#
sender = fail2ban@yourdomain.xy

usage

Quando si modifica un jail, bisogna ricaricare i jail in questo modo:

/etc/rc.d/rc.fail2ban reload

oppure

fail2ban-client reload

In questo modo si può ottenere la lista dei jail attivi

# fail2ban-client status
Status: fail2ban
Status
|- Number of jail:      3
`- Jail list:           vpopmail, qmail-smtp, dovecot

Prima di rendere attivo un jail è buona abitudine testare la correttezza del filtro creato utilizzando un opportuno file di log in questo modo:

# fail2ban-regex /var/log/qmail/smtpd/current /etc/fail2ban/filter.d/qmail-smtp.conf

Running tests

=============

Use   failregex file : /etc/fail2ban/filter.d/qmail-smtp.conf
Use         log file : /usr/local/vservers/qmail/usr/local/var/log/qmail/smtpd/@40000000532f677b088a7854.s

Results
=======

Failregex: 65 total
|-  #) [# of hits] regular expression
|   1) [58] qmail-smtpd: message rejected \(qmail-dnsbl\) .* from 
|   2) [3] CHKUSER rejected rcpt: from <.*> remote <.*remotehostip:> .* : not existing recipient$
|   3) [4] CHKUSER rejected relaying: from <.*> remote <.*remotehostip:> .* : client not allowed to relay$
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1596] TAI64N
`-

Lines: 1596 lines, 0 ignored, 65 matched, 1531 missed
Missed line(s): too many to print.  Use --print-all-missed to print all 1531 lines

Aggiungi un commento