まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Fail2Ban, ça marche !!

Que faire lorsqu'en matant nonchalamment ses logs apache ou mail, on aperçoit des activités suspectes et inquiétantes ?

Apr  1 03:59:06 debianbox postfix/smtpd[23214]: warning: 112.104.64.66: hostname 112-104-64-66.adsl.dynamic.seed.net.tw verification failed: Name or service not known
Apr  1 03:59:06 debianbox postfix/smtpd[23214]: connect from unknown[112.104.64.66]
Apr  1 03:59:07 debianbox postfix/smtpd[23214]: NOQUEUE: reject: RCPT from unknown[112.104.64.66] 554 5.7.1 <vbibiorm@gmail.com>: Relay access denied; from=<wendy67510@gmail.com> to=<vbibiorm@gmail.com> proto=SMTP helo=<212.198.153.217>
Apr  1 03:59:07 debianbox postfix/smtpd[23214]: lost connection after RCPT from unknown[112.104.64.66]
Apr  1 03:59:07 debianbox postfix/smtpd[23214]: disconnect from unknown[112.104.64.66]
Apr  1 04:02:27 debianbox postfix/anvil[23217]: statistics: max connection rate 1/60s for (smtp:112.104.64.66) at Apr  1 03:59:06
Apr  1 04:02:27 debianbox postfix/anvil[23217]: statistics: max connection count 1 for (smtp:112.104.64.66) at Apr  1 03:59:06
Apr  6 13:53:43 debianbox postfix/smtpd[11331]: warning: 117.93.116.180: hostname 180.116.93.117.broad.yc.js.dynamic.163data.com.cn verification failed: Name or service not known
Apr  6 13:53:43 debianbox postfix/smtpd[11331]: connect from unknown[117.93.116.180]
Apr  6 13:53:44 debianbox postfix/smtpd[11331]: lost connection after AUTH from unknown[117.93.116.180]
Apr  6 13:53:44 debianbox postfix/smtpd[11331]: disconnect from unknown[117.93.116.180]
Apr  7 17:02:13 debianbox postfix/smtpd[19164]: connect from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194]
Apr  7 17:02:14 debianbox postfix/smtpd[19164]: NOQUEUE: reject: RCPT from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194] 554 5.7.1 <vbibiorm@gmail.com>: Relay access denied; from=<wendy67510@gmail.com> to=<vbibiorm@gmail.com> proto=SMTP helo=<212.198.153.217>
Apr  7 17:02:14 debianbox postfix/smtpd[19164]: lost connection after RCPT from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194]
Apr  7 17:02:14 debianbox postfix/smtpd[19164]: disconnect from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194]
Apr  8 13:08:00 debianbox postfix/smtpd[10575]: connect from 118-166-210-124.dynamic.hinet.net[118.166.210.124]
Apr  8 13:08:00 debianbox postfix/smtpd[10575]: lost connection after CONNECT from 118-166-210-124.dynamic.hinet.net[118.166.210.124]
Apr  8 13:08:00 debianbox postfix/smtpd[10575]: disconnect from 118-166-210-124.dynamic.hinet.net[118.166.210.124]
Apr  9 22:56:46 debianbox postfix/smtpd[8262]: connect from 118-166-208-126.dynamic.hinet.net[118.166.208.126]
Apr  9 22:56:47 debianbox postfix/smtpd[8262]: NOQUEUE: reject: RCPT from 118-166-208-126.dynamic.hinet.net[118.166.208.126] 554 5.7.1 <vkihwpdh@yahoo.com.tw>: Relay access denied; from=<z2007tw@yahoo.com.tw> to=<vkihwpdh@yahoo.com.tw> proto=SMTP helo=<212.198.153.217>
Apr  9 22:56:47 debianbox postfix/smtpd[8262]: lost connection after RCPT from 118-166-208-126.dynamic.hinet.net[118.166.208.126]
Apr  9 22:56:47 debianbox postfix/smtpd[8262]: disconnect from 118-166-208-126.dynamic.hinet.net[118.166.208.126]

Rien pourrait'-on se dire, «les ports sont ouverts» :(
Et pourtant il est possible de bannir pour un temps donné ces malotrus !!

«yaka» installer Fail2Ban (nécessite iptables pour NetFilter)

#apt-get install fail2ban


Vérifier le fichier de configuration : /etc/fail2ban/fail2ban.conf

      [Definition]
      loglevel = 1
      logtarget = /var/log/fail2ban.log
      socket = /var/run/fail2ban/fail2ban.sock

Et il va donc nous faire ça !! du moins c'est ce qu'on croit…

En effet des filtres sont chargés de repérer les IP des malandrins, pour ensuite les transférer à la prison.
C'est donc valable pour les filtres donnés par défaut, mais en cas d'autres activités suspectes, il va falloir créer ses propres filtres !

On crée donc un fichier «.conf» à l'emplacement prévu ! attention , ne pas utiliser de majuscules !

#vi /etc/fail2ban/filter.d/dynamicseed.conf

et on le remplit avec ça :

[Definition]
failregex = warning: <HOST>: hostname *.* verification failed
            NOQUEUE: reject: RCPT from unknown[[]<HOST>[]] *.* Relay access denied
            NOQUEUE: reject: RCPT from *.*[[]<HOST>[]] *.* Relay access denied
            connect from *.*dynamic*.*[[]<HOST>[]]
            disconnect from *.*dynamic*.*[[]<HOST>[]]
ignoreregex =

«Ça», ça tombe pas du ciel, c'est basé sur l'observation des log précédents.

Le but du jeux, c'est de copier une partie du log qui contient l'adresse IP et de la remplacer par <HOST>
Attention cependant, la syntaxe est spécifique quand l'IP est encadrée dans le log

[118.166.208.126] devient [[]<HOST>[]]

De même, si un espace est présent, il faut aussi le respecter !
La où il faut être malin, c'est qu'il faut mettre des *.* aux endroits où le texte change au fil des log.
En effet, même si le filtre fonctionne à l'instant T, il risque de ne plus rien filtrer la fois suivante, alors que la forme du log aura changé…
Donc, plus on a d'attaques, plus on peut affiner la syntaxe du filtre et petit à petit l'étau se resserre, pour que le filtre choppe à tous les coups niark!
D'autant plus qu'on peut mettre plusieurs lignes contenant l'IP…

Il faut maintenant tester ce filtre avant de l'indiquer à la prison.
Pour ce faire, on inscrit en premier le chemin du log qu'on veut filtrer et ensuite le chemin du filtre

#fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/dynamicseed.conf

Donne :

Running tests
=============

Use regex file : /etc/fail2ban/filter.d/dynamicseed.conf
Use log file   : /var/log/mail.log


Results
=======

Failregex
|- Regular expressions:
|  [1] warning: <HOST>: hostname *.* verification failed
|  [2] NOQUEUE: reject: RCPT from unknown[[]<HOST>[]] *.* Relay access denied
|  [3] NOQUEUE: reject: RCPT from *.*[[]<HOST>[]] *.* Relay access denied
|  [4] connect from *.*dynamic*.*[[]<HOST>[]]
|  [5] disconnect from *.*dynamic*.*[[]<HOST>[]]
|
`- Number of matches:
   [1] 1 match(es)
   [2] 1 match(es)
   [3] 7 match(es)
   [4] 2 match(es)
   [5] 1 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    66.11.228.136 (Thu Apr 22 10:18:43 2010)
[2]
    205.209.161.50 (Thu Apr 22 12:25:27 2010)
[3]
    123.204.200.199 (Wed Apr 21 03:38:08 2010)
    205.209.161.50 (Thu Apr 22 12:25:27 2010) (already matched)
    64.57.183.77 (Sat Apr 24 14:28:37 2010)
    64.57.183.77 (Sat Apr 24 14:28:37 2010)
    64.57.183.77 (Sat Apr 24 14:28:37 2010)
    64.57.183.77 (Sat Apr 24 14:28:38 2010)
    64.57.183.77 (Sat Apr 24 14:28:38 2010)
[4]
    123.204.200.199 (Wed Apr 21 03:38:07 2010)
    123.204.200.199 (Wed Apr 21 03:38:09 2010)
[5]
    123.204.200.199 (Wed Apr 21 03:38:09 2010) (already matched)

Date template hits:
764442 hit(s): Month Day Hour:Minute:Second
0 hit(s): Weekday Month Day Hour:Minute:Second Year
0 hit(s): Weekday Month Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/Month/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-Month-Year Hour:Minute:Second[.Millisecond]
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601

Success, the total number of match is 12

Ça marche !!! les adresses ont été trouvées

Maintenant, on va ajouter le filtre au fichier prison

#vi /etc/fail2ban/jail.conf

En ajoutant ça à la fin

[dynamicseed]

enabled = true
bantime = 3600000
filter = dynamicseed
action   = iptables[name=dynamicseed, port=smtp]
          sendmail-whois[name=dynamicseed, dest=xxxx@mondomaine.net]
logpath = /var/log/mail.log
maxretry = 1

Respectivement :

  • On active le filtre.
  • Pour une durée de 41 jours (en secondes).
  • Le nom du filtre, qui correspond au nom du fichier sans .conf. ! attention , ne pas utiliser de majuscules !
  • Les deux lignes action vont permettre d'indiquer le port et l'envoie d'un mail pour prévenir en cas d'activation de la prison.
  • Donner le chemin du fichier log à surveiller.
  • Et enfin, le nombre de fois au bout duquel on coffre le suspect.


Et pour finir on va, soit recharger les prisons :

#fail2ban-client reload

Soit redémarrer fail2ban :

#/etc/init.d/fail2ban restart


Et Vérifier qu'il n'y ait pas d'erreur… parfois je ne sais pourquoi, certaines prisons ne se lancent pas, et il est nécessaire de relancer à nouveau le démon.

#tail -f /var/log/fail2ban.log


«yapuka» attendre… jusqu'au jour ou on reçoit un mail

Objet 	[Fail2Ban] dynamicseed: banned 205.209.161.50
De 	Fail2Ban         À 	xxxx@mondomaine.net
Date 	Jeu 11:25

Hi,

The IP 205.209.161.50 has just been banned by Fail2Ban after
1 attempts against dynamicseed. […]


On peut alors aller voir les adresses bloquées

#iptables -L
Chain fail2ban-dynamicseed (1 references)
target     prot opt source               destination
DROP       all  --  205.209.161.50       anywhere
DROP       all  --  66-11-228-136.managemyvps.com  anywhere
DROP       all  --  123-204-200-199.adsl.dynamic.seed.net.tw  anywhere
RETURN     all  --  anywhere             anywhere


Voici une version modifiée de la prison, pour pouvoir bloquer les adresse IP sur plusieurs port à la fois

[dynamicseed]

enabled = true
bantime = 3600000
filter = dynamicseed
action = iptables-multiport[name=dynamicseed, port="smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s"]
         sendmail-whois[name=dynamicseed, dest=xxxx@mondomaine.net]
logpath = /var/log/mail.log
maxretry = 1

Commentaires

1. Le mercredi, 22 décembre 2010, 13:35 par Miky

Bonjour,

dynamicseed ci-dessus installé sur mon serveur dédié m'a posé problème sur l'envoi de mails lorsqu'il faut que j'en envoi plusieurs en un temps limité.

J'ai dû désactivé cette fonction pour que mon serveur re fonctionne correctement car l'ensemble de règle ici est trop restrictive.

Néanmoins très bonne solution pour quelqu'un qui n'utilise pas son serveur dédié comme serveur SMTP.

Néanmoins j'ai conservé les autres règles de fail2ban qui fonctionnent à merveille.

2. Le mercredi, 5 janvier 2011, 13:55 par Fred

Salut

Je m'auto-héberge également et à dominile, est ce ton cas ? une config fail2ban m'intéresserait, peux tu me dire 2 mots de ta conf ? tu as une ip publique sur ton serveur derriere ta box en nat ? si oui comment :)
si non comment tu chopes les adresses clientes non NATées ?

Fred

3. Le mercredi, 5 janvier 2011, 14:36 par MaKoTo

Je m'auto-héberge également et à dominile, est ce ton cas ?
Oui.

une config fail2ban m'intéresserait, peux tu me dire 2 mots de ta conf ?
Tout est dit dans l'article… il y a les règles de bases proposées par l'installation, et celles qu'on fabrique soit même, au cas par cas en analysant ses logs.

tu as une ip publique sur ton serveur derriere ta box en nat ? si oui comment :)
l'ip publique c'est celle de ton FAI, routée avec les ports qui vont bien vers l'ip locale de ta machine serveur.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet