Skip to content


Sécurisation d'une machine avec Portsentry et Fail2ban plus libapache2-mod-evasive

Introduction

La sécurité est quelque chose de difficile à atteindre et souvent peu génératrice de satisfaction, en effet nous ne sommes jamais satisfait à 100%. Comment se protéger et quoi mettre en place afin de repousser les tentatives d'attaque ou leurs mises en œuvre ?

Pourquoi cette question ? Et bien mon petit routeur, serveur web, mail, etc... a subit un rash disque il y a trois semaines (4 peut-être). J'ai remonté la machine sur un OS identique Mandriva2008.1 en trois jours... celui-ci à été compromis....(je n'avais pas eu le temps de mettre des protections) Aille ! 🙁

J'ai voulu voir alors si sous une Debian et avec les mêmes services et les protections cela était mieux ?

  • Un load average 3 ou 4 fois moindre
  • Un temps de réponse 3 ou 4 moins long !
  • Tout cela avec plus de processus de protection ( rkhunter, chkrootkit, portsentry, fail2ban, le mod évasif de Apache, etc...)

Mise en place d'une attaque

Cette méthode très générique est expliquée plus particulièrement sur http://www.commentcamarche.net/contents/attaques/methodologie.php3, la question qui est posée dans l'article que j'écris est celle-ci : Comment évité le plus possible se genre d'attaque ?

Les deux réponses sont :

  1. diminuez la surface d'attaque (le moins de service possible, pas de service = port fermé)
  2. simplement, évitez l'analyse de votre réseau de l’extérieure si ce n'est pas attendu !

Les outils contre les analyses ou balayages de réseaux

L'analyse de votre réseau depuis l’extérieure peut-être réduite par la mise en place d'outils simples et efficaces !

  • Portsentry : qui analyse les balayages de ports et prend la décision appropriée en fonction de vos réglages.
  • Fail2ban : qui analyse les journaux des applications que vous voulez surveiller afin de bannir les adresses IP ayant tenté quelques exploits.
  • Bien d'autres existent encore... A vous d'en évaluer le plus possible !

Installation de Portsentry et Fail2ban

# apt-get install portsentry fail2ban

Configuration de Portsentry

Le premier fichier à éditer est : /etc/portsentry/portsentry.ignore.static , il contient les adresses IP à ne pas considérer comme dangereuses. Celles-ci ne seront jamais bloquées.

# Vous même
127.0.0.1/32
# Votre réseau
10.1.1.0/24
# Votre adresse publique
X.Y.Z.T
0.0.0.0
# Google inc pour le référencement
66.249.64.0/19
# Netcraft
194.72.238.62

Le deuxième fichier est /etc/portsentry/portsentry.conf , celui-ci indique quoi regarder, comment agir... Il est primordial. Voici un exemple :

# These port bindings are *ignored* for Advanced Stealth Scan Detection Mode.
# Use these if you just want to be aware:
TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,32773,32774,40421,49724,54320"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"
ADVANCED_PORTS_TCP="1024"
ADVANCED_PORTS_UDP="1024"
# By specifying ports here PortSentry will simply not respond to
# incoming requests, in effect PortSentry treats them as if they are
# actual bound daemons. The default ports are ones reported as
# problematic false alarms and should probably be left alone for
# all but the most isolated systems/networks.
ADVANCED_EXCLUDE_TCP="113,139"
ADVANCED_EXCLUDE_UDP="520,138,137,67"
# This file is made from /etc/portsentry/portsentry.ignore.static
IGNORE_FILE="/etc/portsentry/portsentry.ignore"
HISTORY_FILE="/var/lib/portsentry/portsentry.history"
BLOCKED_FILE="/var/lib/portsentry/portsentry.blocked"
RESOLVE_HOST = "0"
BLOCK_UDP="1"
BLOCK_TCP="1"
KILL_ROUTE="/sbin/route add -host $TARGET$ reject"
KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP && /sbin/iptables -I INPUT -s $TARGET$ -m limit --limit 3/minute --limit-burst 5 -j LOG --log-level DEBUG --log-prefix 'Portsentry: dropping: '"
KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
SCAN_TRIGGER="0"
PORT_BANNER="** UNAUTHORIZED ACCESS PROHIBITED *** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED. GO AWAY."
Maintenant il faut indiquer à portsentry comme il écoutera sur les protocoles TCP/UDP. Pour cela éditez /etc/default/portsentry
TCP_MODE="atcp"
UDP_MODE="audp"
Suite au paramétrage de ces fichiers, vous devez redémarrer portsentry :
# /etc/init.d/portsentry restart

Configuration de Fail2ban

Les trois fichiers suivants sont à modifier : /etc/default/fail2ban  /etc/fail2ban/fail2ban.conf  /etc/fail2ban/jail.conf

Personnellement je n'ai rien modifié dans /etc/default/fail2ban

Voici un exemple de /etc/fail2ban/fail2ban.conf

loglevel = 3
logtarget = /var/log/fail2ban.log

Un exemple sans les commentaire de /etc/fail2ban/jail.conf

[DEFAULT]
# Vos adresse IP
ignoreip = 127.0.0.1 10.1.1.0/24
bantime  = 600
maxretry = 3
backend = polling
destemail = votreCourriel
banaction = iptables-multiport
mta = sendmail
protocol = tcp
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
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]
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
[ssh]
enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 6
[ssh-ddos]
enabled = true
port    = ssh
filter  = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 6
[apache]
enabled = true
port    = http,https
filter  = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
[apache-multiport]
enabled   = true
port      = http,https
filter    = apache-auth
logpath   = /var/log/apache*/*error.log
maxretry  = 6
[apache-noscript]
enabled = true
port    = http,https
filter  = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 6
[apache-overflows]
enabled = true
port    = http,https
filter  = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
Il faut redémarrer fail2ban :
# /etc/init.d/fail2ban restart

Fonctionnement des protections

Si portsentry a été correctement configuré, celui-ci devrait mettre quelques adresses IP en blocage... Vous pouvez vous en convaincre en utilisant ces "scanners" de ports dans le but que portsentry les bloque ! http://www.t1shopper.com/tools/port-scan/
http://www.inoculer.com/scannerdeports.php ...
En ce qui concerne http://www.t1shopper.com/tools/port-scan/ celui-ci a été bloqué en moins de 3 secondes....
May  8 13:07:49 helios portsentry[31315]: attackalert: TCP SYN/Normal scan from host: 208.64.252.230/208.64.252.230 to TCP port: 110
May  8 13:07:49 helios portsentry[31315]: attackalert: Host 208.64.252.230 has been blocked via wrappers with string: "ALL: 208.64.252.230 : DENY"
May  8 13:07:49 helios portsentry[31315]: attackalert: Host 208.64.252.230 has been blocked via dropped route using command: "/sbin/route add -host 208.64.252.230 reject"
Et http://www.inoculer.com/scannerdeports.php de la même façon en 2 ou 3 secondes :
May  8 13:10:31 helios portsentry[31315]: attackalert: TCP SYN/Normal scan from host: 193.25.197.121/193.25.197.121 to TCP port: 110
May  8 13:10:31 helios portsentry[31315]: attackalert: Host 193.25.197.121 has been blocked via wrappers with string: "ALL: 193.25.197.121 : DENY"
May  8 13:10:31 helios portsentry[31315]: attackalert: Host 193.25.197.121 has been blocked via dropped route using command: "/sbin/route add -host 193.25.197.121 reject"
Si on fait un "Whois" :

[...]

route:        122.225.192.0/18
descr:        China Telecom Zhejiang Province
origin:       AS4809
mnt-by:       MAINT-CHINANET-ZJ

[...]

Intéressant n'est-ce pas ?

Pour enlever les routes ajoutées par portsentry :

# /sbin/route del -host $target reject
Voici une trace non provoquée par moi :
portsentry[7572]: attackalert: TCP SYN/Normal scan from host: 122.225.218.234/122.225.218.234 to TCP port: 443
portsentry[7572]: attackalert: Host 122.225.218.234 has been blocked via wrappers with string: "ALL: 122.225.218.234 : DENY"
portsentry[7572]: attackalert: Host 122.225.218.234 has been blocked via dropped route using command: "/sbin/route add -host 122.225.218.234 reject"

Comment ? Un abonné Orange qui depuis Dijon tente quelque chose !? 🙂

Une zolie commande pour connaitre "qui" a été dérouté lorsque vous utilisez KILL_ROUTE="/sbin/route add -host $TARGET$ reject"

# route -n | grep "-" | cut -d " " -f1-1 | nslookup | grep "name =" | cut -d "=" -f2-2 | sort -u
> > > > > > > > > > > >
173.192.67.196-static.reverse.softlayer.com.
dslb-094-216-213-086.pools.arcor-ip.net.
empty.examedia.ch.
infos-stuttgart-vvpn.vpn-gw.net.
static-83.pol.net.in.
www121.celeonet.fr.
www122.celeonet.fr.
zeus.ipserver.eu.

A propos de fail2ban

Fail12ban bannit les adresses IP ayant provoqué des erreur dans les journaux. Ce qui implique que quelqu'un en face à découvert un port et une faille et qu'il tente quelque chose.

Si Fail2ban lance une action sur un autre port que celui-ci par défaut du SSH (22), c'est que portsentry c'est laissé faire et à laissé un scan de ports qu'il aurait dû bloquer !

Je n'ai pas eu (encore) de log de fail2ban... Espérons ! 😉

Evitez les DDOS par Apache

Installez : libapache2-mod-evasive

# apt-get install libapache2-mod-evasive

Des log de ce type pourront apparaitre :

mod_evasive[24613]: Blacklisting address 86.218.181.207: possible DoS attack.

Les modules de sécurité de Apache feront l'objet d'un autre article... :)à savoir : libapache2-mod-evasive ; libapache-mod-security ; libapache2-mod-defensible

Pour ne pas utiliser les valeurs par défaut du mod-evasive, vous pouvez par exemple créer un fichier de configuration /etc/apache2/conf.d/evasive

# mod_evasive

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 3
DOSSiteCount 50
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 300
DOSEmailNotify "votreadresseMail"
DOSLogDir "/var/log/mod_evasive/"
#DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"
DOSSystemCommand "/bin/echo %s >> /var/log/mod_evasive/dos_evasive.log && /bin/date >> /var/log/mod_evasive/dos_evasive.log"
DOSWhiteList 127.0.0.1
#DOSWhitelist *
</IfModule>

Merci à Gals ! http://blog.galsungen.net/

Conclusion

Vous êtes un peu plus protégés.... Si vous êtes sensibles et que vous pensez pouvoir être compromis, installez : rkhunter et chkrootkit pour vous rassurer ! 🙂

De plus rkhunter sous Debian squeeze se lance à chaque installation d'un paquet afin de voir si celui-ci n'est pas compromis ! 😉

C'est à vous de jouer !

- Fin -

Print Friendly, PDF & Email

Posted in Debian, Important, Linux, Sécurité, Technique, Toutes. Tagged with , , , , , .

6 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Bonjour,

    Merci, ce tutoriel vient de m'aider à mieux sécuriser mon nouveau serveur. J'ai un peu passé du temps sur le site de scan, je pensais qu'il devait y avoir un message d'erreur quand il allait être bloqué mais le scan se poursuit alors qu'il sont banni...

    Aussi, j'ai testé depuis ma machine perso, je me suis fais virer de ma connexion ssh, je me suis connecté depuis un autre serveur mais j'ai pas reussi à retrouver la connexion ssh depuis ma machine perso. pourtant la ligne a bien disparu de la commande route et rien dans iptables...

    Bonne soirée.
    Nicolas.

  2. admin said

    Bonjour,

    Il faudrait voir quel processus te jette....
    Si tu es jeté et que tu n'as plus une route bidon ni un iptables DROP, alors peut-être ton IP est dans ton hosts.deny !?

    A voir

  3. Bingo, c'était bien dans hosts.deny, merci 🙂

  4. admin said

    Je t'en prie ! 😉

  5. thierrybo said

    Tu as deux KILL_ROUTE dans ton fichier :

    "ONLY ONE KILL_ROUTE OPTION
    CAN BE USED AT A TIME SO DON'T UNCOMMENT MULTIPLE LINES."

  6. @thierrybo j'avais également froncé les sourcils puis j'ai vu que c'était une règle iptables. c'est en fait la valeur de KILL_RUN_CMD 😉

Some HTML is OK

(required)

(required, but never shared)

or, reply to this post via trackback.

Time limit is exhausted. Please reload CAPTCHA.


/* */
Creative Commons License
Cette création par Laurent Besson est mise à disposition selon les termes de la licence Creative Commons Paternité-Partage des Conditions Initiales à l'Identique 2.0 France.