0

Fail2Ban : IPv6 & rootless-mode

Posted by Division-par-zero on 23 mai 2013 in Réseau, Sécurité, Technique |

Aujourd’hui (Hier soir plus exactement), je me suis attaché à la sécurité de Grumpy. Ce billet est fait un peu vite car, je manque de temps, et je voudrais ne pas oublier ce que j’ai mis en place !

Premier constat

Grumpy, est ipv6 friendly, et il aime tous le monde (C’est un vrai bisounours ce nain :)), bon, ipv6 étant activé, très bien, mais après investigation avec un petit ip6tables -L, tout était ouvert :(((

Du coup Sekoia, c’est attelé à refaire le script des iptables, pour y inclure proprement les ip6tables qui vont bien !

Pour ma part je me suis intéressé à Fail2Ban en IPv6 !

Dans un deuxième temps, un ami m’a appris, il y a plusieurs mois, que l’on pouvait lancer Fail2Ban en mode utilisateur (rootless-mode).

 

Je viens de trouver un message d’un certains « mazarini » qui résume bien m’a pensé sur ce qui m’arrive :

Apparemment en 2013, SSH en IPv6 est activé par défaut, mais Fail2Ban ne le protège toujours pas par défaut. Comme quoi, on met plein de verrous sur une porte blindée et on laisse la fenêtre ouverte.

(source : http://www.debian-fr.org/fail2ban-et-ipv6-t38368.html#p423586)

À laquelle Sekoia répond tout succinctement :

La sécurité d’un système dépend de son maillon le plus faible.

Je pense qu’il parle de moi :p

Configurations

  • OS : Debian 7.0 (Wheezy)
  • Version de Fail2Ban (0.8.9 : Depuis le dépôt SID)

Fail2Ban en IPv6

Beaucoup de monde le demande, mais rien d’officiel à l’horizon, c’est pour cela qu’un certains Thanatos, à mis en place un patch, dont voici un très bon tuto pour sa mise en place « https://www.isalo.org/wiki.debian-fr/Fail2ban#Fail2ban_et_ipv6_.28EXPERIMENTAL.29 » repris sur au moins 5 ou 6 sites (Ce n’est probablement pas la version originale).

Bien sûr, il est compatible avec la version 0.8.6 de Fail2Ban, et pas avec la version que j’ai installé, alors j’ai du repatcher à la main (je ferais ptet un patch un jour :)), là manque curel de temps (comme toujours) :

/usr/share/fail2ban/server/failregex.py

1
regex = regex.replace("", "(?:::f{4,6}:)?(?P[\w\-.^_:]+)")

Il faut juste ajouter les deux points (:) dans la classe perso de la regexp [\w\-.^_:]

/usr/share/fail2ban/server/filter.py

Je met ici en bloc les méthodes de la classe « DNSUtils » (fin de fichier) modifié :

1
2
3
class DNSUtils:
.IP_CRE = re.compile("^(?:\d{1,3}\.){3}\d{1,3}$")
.IP_CRE6 = re.compile("^(?:[0-9:A-Fa-f]{3,})$")
1
2
3
4
5
6
7
8
9
10
11
12
13
.#@staticmethod
.def searchIP(text):
..""" Search if an IP address if directly available and return it.
.."""

..match = DNSUtils.IP_CRE.match(text)
..match6 = DNSUtils.IP_CRE6.match(text)
..if match:
...return match
..elif match6:
...return match6
..else:
...return None
.searchIP = staticmethod(searchIP)
1
2
3
4
5
6
7
.#@staticmethod
.def isValidIP(string):
..""" Return true if str is a valid IP
...PATCH v6: We Consider that logfiles didn't make errors ;)
.."""

..return True
.isValidIP = staticmethod(isValidIP)

(Note : Les points sont des tabulations… je hais les interfaces graphiques qui vire les espaces et les tabulations).
Il faudrait vraiment refaire cette méthode isValiddIP, mais là je reprend ce que Thanatos à fait, et je suppose qu’il ne l’a pas fait inutilement 🙂

/usr/bin/ip46tables.sh [NEW FILE]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
# Iptable multiplexeur (c) 2012 Jupa
# Modified by Olivier LONZI <olivier@lonzi.fr>
LINE=$*

# Note:
# -----
# Use sudo, only if you run fail2ban in rootless mode, with good right
# /etc/default/fail2ban for more information about rootless mode
IP4="/sbin/iptables"
IP6="/sbin/ip6tables"

RESULT=`echo  $LINE | egrep " ([0-9]{1,3}\.){3}[0-9]{1,3}" | wc -l`
RESULT6=`echo $LINE | egrep "(::[A-Fa-f0-9])|((:[A-Fa-f0-9]{1,4}){2,})" | wc -l `

# Some params is for IP4 only, so we try to replace, or delete it for IP6
LINE6=`echo $LINE | sed -e "s/REJECT --reject-with icmp-port-unreachable/REJECT/"`

if [ $RESULT -eq "1" ]; then
.# Action IPv4
.$IP4 $LINE
.ERRCODE=$?

elif  [ $RESULT6 -eq "1" ]; then
.# Action IPv6
.$IP6 $LINE6
.ERRCODE=$?

else
.# Action for both of them
.$IP4 $LINE
.ERRCODE=$?

.$IP6 $LINE6
.if [ $? -ge "1" ]; then
..ERRCODE=$?
.fi
fi
exit $ERRCODE

/etc/fail2ban/action.d/iptables46-multiport.conf [NEW FILE]

1
# sed -e "s/iptables/ip46tables.sh/" iptables-multiport.conf > iptables46-multiport.conf

/etc/fail2ban/action.d/iptables46-allports.conf [NEW FILE]

1
# sed -e "s/iptables/ip46tables.sh/" iptables-allports.conf > iptables46-allports.conf

/etc/fail2ban/jail.*

Il faut changer les banaction et action, pour utiliser les fichiers .conf d’actions avec iptables46*, suivant vos besoins, et à adapter.

 

Tous ça fait que l’IPv6 devrait maintenant être géré correctement, après un reboot du service évidement !

1
# service fail2ban restart

Pour desactiver l’IPv6, il suffit de virer le : de la regexp dans le fichier « /usr/share/fail2ban/server/failregex.py » !

 

Fail2Ban en rootless-mode

Je ne reviens pas sur le pourquoi !

Modifier le fichier « /etc/default/fail2ban », décommenter ou ajouter « FAIL2BAN_USER= »fail2ban » ».

 

Ensuite on va ajouter ce nouvel utilisateur système « fail2ban », directement dans le groupe « adm » en sus du groupe « fail2ban » ; ceci afin qu’il puisse lire les log de tous le monde !

1
# useradd --system --no-create-home --home-dir / --groups adm fail2ban

 

Pour la suite, il faudrait que fail2ban puisse exécuter iptables (et ip6tables, au besoin), la doc sur ce point est pas protubérante, elle parle d’un module kernel xt_recent… j’ai abandonné cette idée, car pas assez documenté, et manque de temps (toujours la même excuse), et vu que je venais de mettre en place un script temporaire pour l’IPv6, j’avais une solution toute simple :

1
# apt-get install sudo

Modifier « /etc/sudoers.d/fail2ban », et ajouter la ligne
« fail2ban ALL=NOPASSWD: SETENV: /sbin/iptables, /sbin/ip6tables ».

 

Si vous avez suivis le patch pour l’IPv6, modifier « /usr/bin/ip46tables.sh », et ajouter sudo devant les commandes qui vont bien :

IP4= »sudo /sbin/iptables »
IP6= »sudo /sbin/ip6tables »

(Dans le patch de Thanatos, il faut le changer plusieurs fois directement dans le script)

Si vous n’avez pas le patch IPv6, il faut rajouter sudo directement dans les fichiers « /etc/fail2ban/actions.d/iptables46-*.conf »

1
# service fail2ban restart

 

Root-less et Logrotate

Après plusieurs jours/semaines/mois de fonctionnement, et peu de temps pour tester, Sekoia c’est aperçu qu’il y avait un soucis avec la règle des récidivistes, cette règle regarde si une même adresse IP à été ban plusieurs fois dans la semaine, et lui interdit l’accès au serveur pour 1 mois !!! Au niveau de la règle, pas de soucis, mais depuis que j’ais mis fail2ban en mode rootless, lors du logrotate, fail2ban n’avais plus le droit de loguer ses infos….

 

Pour résoudre cela, on commence par donner les bon droits au fichier :

1
# chown fail2ban:adm /var/log/fail2ban.log

puis, on va expliquer à logrotate de faire le boulot que l’on souhaite, dans le fichier « /etc/logrotate.d/fail2ban », on cherche ou ajoute la ligne « create 640 fail2ban adm »

 

 

Si vous êtes croyant, priez ; sinon priez quand même, mais dans tous les cas n’oubliez pas de tester tous ça 🙂

 

J’espère que ça servira !

Laisser un commentaire

Copyright © 2010-2017 Le blog de Grumpy All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.