Paramétrer iptables, fail2ban et xt_recent

27/04/2012 - 13:37 by Adel KHALDI

Petit memo pour illustrer une configuration du pare-feu iptables avec fail2ban.

Le module "recent" d'iptables n'est utilisé que pour un ban rapide suite à un SYN, dans le cas d'un scan de port par exemple.

L'objectif est simple :
  • avoir des règles de filtrage par défaut les plus fiables possibles
  • bannir indéfiniment les adresses faisant du scan (ciblés ou pas).

1- Fail2Ban

C'est un outil permettant de générer des règles iptables en fonction du contenu des logs (apache, vsftpd, syslog, auth.log...).

Pour les puristes/minimalistes, il est possible de faire la même chose à l'aide de cron et grep.

adel@ubuntu:/$ sudo cat /etc/fail2ban/jail.conf

[DEFAULT]
ignoreip = 127.0.0.1
bantime  = -1 #ban for ever
maxretry = 1
backend = polling
destemail = root@localhost
banaction = iptables-allports
port = anyport
mta = sendmail
protocol = tcp

#
# Action shortcuts. To be used to define action parameter

# The simplest action to take: ban only
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
# ban & send an e-mail with whois report to the destemail.
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
              %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]
# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]
action = %(action_)s
#
# JAILS
#

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

[apache]
enabled = true
filter  = apache-auth
logpath = /var/log/apache2/*error.log
maxretry = 3

[f2b]
enabled = true
filter  = f2b
banaction = iptables-fxb
logpath = /var/log/apache2/*.log
maxretry = 1

[f3b]
enabled = true
filter  = f3b
banaction = iptables-fxb
logpath = /var/log/syslog
maxretry = 1

Ici nous avons la définition des expressions régulières pour le parsing des fichiers de logs :

adel@ubuntu:/$ sudo cat /etc/fail2ban/filter.d/f2b.conf
[Definition]
failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): /\S*(\.php|\.asp|\.exe|\.pl)
    [[]client <HOST>[]] script '/\S*(\.php|\.asp|\.exe|\.pl)\S*' not found or unable to stat *$
    ^<HOST> -.* /(admin|root|pma|phpmyadmin|test|manager|PycURL|json|POST|HEAD|webmail|mail|horde|template).*
            [[]client <HOST>[]].*w00tw00t.*$
            ^<HOST> -.*(w00tw00t|Googlebot|robots\.txt|facebookexternalhit).*
ignoreregex =

adel@ubuntu:/$ sudo cat /etc/fail2ban/filter.d/f3b.conf
[Definition]
failregex = ^.*f3b-tryIN=.*SRC=<HOST> DST=.*$

ignoreregex =

Les fichiers de configuration suivants servent à l'ajout d'une règle au pare-feu et la vérification si une IP est bannie ou pas uniquement. La création des chaines de filtrage sera faite dans le script iptables.

adel@ubuntu:/$ sudo cat /etc/fail2ban/action.d/iptables-allports.conf
[Definition]
actionstart =
actionstop =
actioncheck = iptables -n -L f2b | grep -q f2b
actionban = iptables -I f2b -s <ip> -j DROP
actionunban =
[Init]
name = default
protocol = all
chain = INPUT

adel@ubuntu:/$ sudo cat /etc/fail2ban/action.d/iptables-fxb.conf
[Definition]
actionstart =
actionstop =
actioncheck = iptables -n -L <chain> | grep -q <chain>
actionban = iptables -I <chain> -s <ip> -j DROP
actionunban =
[Init]
name = default
protocol = all
chain = INPUT

2- Iptables

Les règles du pare-feu sont les suivantes :

adel@ubuntu:/$ sudo cat /etc/init.d/iptables
#!/bin/bash
#/sbin/iptables configuration
/sbin/ip6tables -P INPUT DROP
/sbin/ip6tables -P OUTPUT DROP
/sbin/ip6tables -P FORWARD DROP
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT

/sbin/iptables -A INPUT -m state --state INVALID -j DROP
/sbin/iptables -A INPUT -s 123.123.123.123 -j ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
#used by fail2ban
/sbin/iptables -N f2b
/sbin/iptables -A f2b -j RETURN
/sbin/iptables -A INPUT -j f2b
#!used by fail2ban
#used by fail2ban with iptables xt_recent
/sbin/iptables -N f3b
/sbin/iptables -A f3b -j RETURN
/sbin/iptables -A INPUT -j f3b
#!used by fail2ban
/sbin/iptables -N BANME
/sbin/iptables -A BANME -j LOG --log-prefix "f3b-try"
/sbin/iptables -A INPUT -m multiport -p tcp --dport 21,22,25,110,143,3389,8080,8834 -j BANME
/sbin/iptables -A BANME -m recent --set --name banned
/sbin/iptables -A BANME -m recent --update --seconds 36000 --hitcount 1 --name banned -j DROP
/sbin/iptables -A INPUT -m multiport -p tcp --dport 80,443,7788 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A INPUT -j DROP
Voila,
Adel

Comments

comments powered by Disqus