Home > Articolo Tecnico, Networking, Voip > Sicurezza VoIP: come proteggersi con fail2ban

Sicurezza VoIP: come proteggersi con fail2ban

November 5th, 2010 Leave a comment Go to comments

Negli ultimi due/tre anni sono aumentati vertiginosamente gli attacchi verso i centralini VoIP. Il tipo di attacco più frequente è quello di eseguire uno scanning della rete per trovare i server in ascolto sulla porta di segnalazione del protocollo sip (cioè UDP 5060) e provare un l’accesso con valori di utenza e password pseudo casuali fino a trovare la combinazione corretta.

La soluzione principale è quindi quella di utilizzare delle password sicure e magari modificare la porta di ascolto su una non standard.

Per rendere il nostro centralino ancora più sicuro e quindi proteggerlo da attacchi di tipo bruteforce menzionati sopra, possiamo utilizzare fail2ban. La guida che segue è specifica per OpenSIPs e Asterisk

Che cosa è fail2ban?

E’ un applicativo che esamina i file di log relativi al servizio che vogliamo proteggere (ssh, http, sip ecc..) e nel caso in cui riscontri più di un determinato numero di tentativi falliti in un certo intervallo di tempo (configurabile)  blocca temporaneamente (tramite iptables)  l’IP che sta tentando l’accesso.

Configurazione base fail2ban

Una volta installato (“sudo apt-get install fail2ban ” su macchine Ubuntu e Debian) troviamo i file di configurazione sotto la cartella /etc/fail2ban.

In particolare nel file /etc/fail2ban/jail.local sono presenti le regole di ban per i diversi servizi. Ciascuna regola è identificata dal nome tra parentesi quadre. Esempio predefinito per ssh:

[ssh]
enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 6

dove i parametri indicano:

enabled: se la regola è attivata
port: la porta che viene bloccata, è possibile indicare il servizio che gira sulla porta o il valore della porta numerico.
filter: il filtro usato dallo script per identificare i tentativi di accesso. (NB:  i diversi filtri si trovano nella directory /etc/fail2ban/filter.d). In questo caso usiamo il filtro indicato come sshd
logpath: il percorso del file di log da  monitorare per determinare i tentativi di accesso.
maxretry: il numero di tentativi di accesso negato da trovare prima che venga bloccato l’IP che sta tentando l’accesso.
Nella cartella  /etc/fail2ban/filter.d si trovano i file che rappresentano i filtri per i vari servizi.
Configurazione fail2ban per OpenSIPs (ma anche OpenSER e Kamailio)

Prima di far interoperare opensips con fail2ban dobbiamo modificare alcuni valori del file di configurazione opensips.cfg e rsyslog.conf Di seguito le operazioni da eseguire:
– sul file opensips.cfg:

modificare  log_facility=LOG_LOCAL0 con: log_facility=LOG_LOCAL7

modificare tutte le occorrenze in cui viene richiesta l’autenticazione da

if (!www_authorize("", "subscriber")) {
	www_challenge("", "0");
	exit;
}

a

$var(auth_code) = www_authorize("", "subscriber");
if ( $var(auth_code) == -1 || $var(auth_code) == -2 ) {
		xlog("L_NOTICE","Auth error for $fU@$fd from $si cause $var(auth_code)");
}
if ( $var(auth_code) < 0 ) {
		www_challenge("", "0");
		exit;
}

– sul file rsyslog.conf:

aggiungiamo la riga: local7.* /var/log/opensips.log

Passiamo ora alla configurazione di fail2ban; aggiungiamo alla fine del file /etc/fail2ban/jail.conf il nuovo servizio:

[opensips]
enabled  = true
filter   = opensips
action   = iptables-allports[name=opensips, protocol=all]
           sendmail-whois[name=opensips, dest=destination@example.com, sender=source@example.com]
logpath  = /var/log/opensips.log
maxretry = 5
bantime = 3600

e creiamo nella cartella /etc/fail2ban/filtered.d un nuovo file opensips.conf nel seguente modo:

# Fail2Ban configuration file
#
#
# $Revision: 250 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf

[Definition]

#_daemon = opensips

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#

failregex = Auth error for .* from <HOST> cause -[0-9]

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

A questo punto facciamo ripartire il servizio con il comando: /etc/init.d/fail2ban restart

Configurazione fail2ban per Asterisk

Di seguito la configurazione di fail2ban per proteggere il nostro server Asterisk. Aggiungiamo alla fine del file /etc/fail2ban/jail.conf il nuovo servizio:

[asterisk-iptables]

enabled  = true
filter   = asterisk
action   = iptables[name=ASTERISK, port=5060, protocol=udp]
           sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@example.org]
logpath  = /var/log/asterisk/full
maxretry = 5
bantime = 259200
Con questa configurazione viene bloccato per 3 giorni l’IP che ha eseguito l’attacco. Assicurarsi di modificare l’azione sendmail-whois per inviare notifiche a un indirizzo appropriato.

Successivamente creiamo nella cartella /etc/fail2ban/filtered.d un nuovo file asterisk.conf nel seguente modo:


# Fail2Ban configuration file
#
#
# $Revision: 250 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf

[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#

failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Peer is not supposed to register
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =
Prima di far ripartire il servizio fail2ban è necessario (per motivi di compatibilità relativi al formato della data) modificare il file di logger di asterisk (/etc/asterisk/logger.conf) nel seguente modo:
[general]
dateformat=%F %T
full => notice,warning,error
A questo punto riavviare il modulo di logger di Asterisk
asterisk -rx “logger reload”
Importante: nella sezione [DEFAULT] possiamo definire gli IP che non dovranno essere MAI bannati (per non rischiare di buttare fuori uno o più host della nostra LAN), mediante il parametro ignoreip
ignoreip = 127.0.0.1 192.168.1.0/24
You must be logged in to post a comment.