Paramétrer iptables, fail2ban et xt_recent
27/04/2012 - 13:37 by poneyPetit 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