Sécuriser son serveur dédié avec Iptables, fail2ban et Rkhunter

parefeu serveur

Dans ce tutoriel vidéo, nous allons voir comment sécuriser son serveur dédié (sommaire des tutos ici) en configurant 3 logiciels incontournables :

  • Iptables : c’est le Firewall des systèmes Linux, il est difficile à manier la première fois mais on peut faire des réglages très fin. Dans ce tutoriel je vous propose une série de règles classiques pour un serveur web.
  • Fail2ban : c’est un système qui ban automatiquement tous les utilisateurs qui essayent de se connecter plusieurs fois de suites sans succès sur notre serveur. Ça permet d’éviter les attaques de type brute force.
  • Rkhunter : c’est un logiciel qui nous prévient dés que des fichiers sensibles sont modifiés. Autrement dit, un bon détecteur de Backdoor et Rootkit.

Et en bonus, je vous donnerais une astuces pour être prévenue par email dés que quelqu’un se connecte en SSH sur votre serveur. À la fin du tutoriel vous aurez un serveur Web déjà bien sécurisé, mais pas assez à mon goût, d’où la seconde vidéo qui sécurise un peu plus les scripts php avec 2 modules pour apache.

Mise en place du Firewall : Iptables

Sans doute la partie la plus importe du tutoriel, la mise en place du Firewall. Normalement il est installé par défaut mais si vous avez des problèmes avec les règles, ça vient sans doute du noyau modifié d’OVH, mais je l’ai déjà expliqué dans la première vidéo.

Fonctionnement de Iptables

Je pense qu’un mini tutoriel sur Iptables, avec les arguments les plus utilisés et ces principes de bases ne fera pas de mal. Je vais faire ça sous forme de liste pour que cela soit plus simple, le but n’étant pas d’être exhaustif.

Si vous faites un iptables -L, vous verez les règles qui définissent votre firewall. En regardant le résultat de plus près, on aperçoit 3 types de chaînes :

  • INPUT : correspond aux règles sur le traffic entrant du serveur
  • OUTPUT : correspond aux règles pour le traffic sortant du serveur
  • FORWARD : les règles permettant de faire des redirections

On constate également que l’on a la politique du firewall sur « ACCEPT » pour toutes les chaînes et ce n’est pas très bon au niveau de la sécurité. Notre démarche va être de tout bloquer (DROP) pour ensuite débloquer petit à petit les ports pour les services que l’on utilise.

Voici une liste des arguments que l’on utilisent fréquemment :

  • -t : préciser sur quel table on travaille, par défaut c’est filter qui contient le input, output et forward
  • -A : ajoute une règles en fin de chaîne
  • -p : précise le protocole de la règle (généralement tcp, udp ou icmp pour le ping)
  • –dport : précise le port de destination
  • -j : précise la politique à appliquer (accept ou drop la plupart du temps)
  • -F : efface toutes les règles (F = Flush)
  • -X : efface la chaîne

Configuration des règles

Pour mettre en place un Firewall sur Linux, la plupart du temps on crée un fichier bash avec toutes les commandes iptables que l’on souhaite mettre. Dans mon cas, je remets Iptables à 0, puis je bloque tout, puis je débloque petit à petit les services que j’utilise. Par conséquent, l’ordre est important ! Voici le fichier utilisé pendant la vidéo, n’oubliez pas de modifier le numéro de port pour ssh ou sinon vous serez bloqué (un reboot hardware fera l’affaire pour vous débloquer).

#!/bin/sh
### BEGIN INIT INFO
# Provides:          Firewall maison
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive:     false
# Short-Description: Firewall maison
### END INIT INFO

# Mise à 0
iptables -t filter -F
iptables -t filter -X
echo "Mise à 0"

# On bloque tout
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
echo "Interdiction"

# Ne pas casser les connexions établies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Autorise le loopback (127.0.0.1)
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo "Loopback"

# ICMP (le ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "Ping ok"

# SSH IN/OUT
iptables -t filter -A INPUT -p tcp --dport 1337 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 1337 -j ACCEPT
echo "SSH ok"

# DNS In/Out
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo "dns ok"

# NTP Out
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "ntp ok"

# HTTP + HTTPS Out
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

# HTTP + HTTPS In
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
echo "http ok"

# FTP Out
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT

# FTP In
# imodprobe ip_conntrack_ftp # ligne facultative avec les serveurs OVH
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "ftp ok"

# Mail SMTP:25
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

# Mail POP3:110
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT

# Mail IMAP:143
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT

# Mail POP3S:995
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
echo "mail ok"

# Monit
iptables -t filter -A INPUT -p tcp --dport 4598 -j ACCEPT

# Webmin
iptables -t filter -A INPUT -p tcp --dport 10000 -j ACCEPT
echo "monitoring ok"

La partie supérieure (le gros bloque de commentaire, à l’exception du shebang qui est obligatoire) est optionnelle mais ça permet d’éviter des warnings dans les fichiers de logs. Au niveau de la difficulté, une fois qu’on à compris une ligne le reste vient tout seul. N’oubliez pas de donner les droits d’exécutions à ce fichier (chmod +x firewall) et de la placer dans le répertoire /etc/init.d/ et de l’activer au démarrage du serveur avec update-rc.d firewall defaults (mais assurez vous bien que le fichier fonctionne correctement avant !!)

J’en profite au passage pour vous donner mon script qui permet de bien remettre à 0 iptables en cas de soucis :

#!/bin/sh
echo "Flushing iptables rules..."
sleep 1
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

C’est tout du côté du Firewall. Si un jour vous installez des services supplémentaires et que ça ne fonctionne pas, n’oubliez pas de regarder du côté du Firewall, on a tendance à l’oublier lorsque la configuration est finie.

Ban automatique des kikoolol avec fail2ban

La plupart du temps, lorsqu’on essaye de pirater votre serveur, les pirates utilisent la méthode du brute force. C’est-à-dire qu’ils testent tous les mots de passe possible, en partant du plus probable (comme les mots du dictionnaire) au plus improbable (les suites de caractères aléatoires). Avec la puissance de calcul des ordinateurs actuels, ça fonctionne pas trop mal si votre mot de passe est simple. Heureusement on peut facilement le contrer en installant un système qui ban automatiquement les gens qui essayent de se connecter à mainte reprise sans y parvenir.

Configuration simple de fail2ban

Pour commencer, vous devez installer fail2ban avec la ligne de commande apt-get install fail2ban. Ensuite il est recommandé de laisser le fichier de configuration intacte et d’en faire une copie pour le modifier, donc cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.local et puis vi etc/fail2ban/jail.conf.local.

Pour activer un filtre, vous devez placer le champ enabled à true et éventuellement changer le maxretry (nombre de tentative avant le ban) , le bantime (temps de ban) et le port (surtout pour ssh).

Je vous recommande d’activer les filtres suivants : [ssh], [ssh-dos], [apache], [apache-multiport], [apache-noscript], [apache-overflows], [proftpd], [postfix], [couriersmtp] et [courierauth]. Ces filtres sont activés par défaut, vous n’avez rien d’autre à faire à par changer le enabled = false à true.

Ajouter des filtres personnalisés

Les filtres par défaut sont très bien, mais voici quelques filtres personnalisés que vous pouvez retrouver sur internet. Vous n’êtes pas obligé de les activer, c’est du bonus.

Le filtre « apache-404″ permet de bannir les utilisateurs qui font trop d’erreurs 404. Généralement ce sont ceux qui recherchent des pages d’administration à l’arrache en modifiant l’url. En revanche, faites très attention ! Si il manque un élement sur votre site, comme par exemple une image, ça va générer une erreur 404 et ça risque de bannir vos visiteurs.

Le filtre « apache-admin » permet de protéger votre espace d’administration si vous en avez un. Dans mon cas non mais je préfère vous le donner quand même.

Et le dernier, « apache-w00tw00t » permet de bannir un scanner de faille « w00tw00t » fréquemment utilisé, on en retrouve la trace dans les logs.

À ajouter dans le fichier /etc/fail2ban/jail.conf.local :

[apache-404]
enabled = true
port = http
filter = apache-404
logpath = /var/log/apache*/error*.log
maxretry = 10

[apache-admin]
enabled = true
port = http
filter = apache-admin
logpath = /var/log/apache*/error*.log
maxretry = 6

[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
logpath = /var/log/apache2/access*.log
maxretry = 1

Maintenant vous devez créer 3 fichiers, qui sont des filtres à base d’expression régulière (Regex), dans /etc/fail2ban/filter.d/ :

(Apparement dans la vidéo, j’ai oublié les « .conf » à la fin des fichiers, pensez y donc)

# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
# $Revision: 471 $
#

[Definition]

# Option: failregex
# Notes.: regex to match the password failure messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching.
# Values: TEXT
# [client x.x.x.x] File does not exist: /home/www/admin/admin,
failregex = [[]client []] File does not exist: .*
#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
# $Revision: 471 $
#

[Definition]

# Option: failregex
# Notes.: regex to match the password failure messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching.
# Values: TEXT
# [client x.x.x.x] File does not exist: /home/www/admin/admin,
failregex = [[]client []] File does not exist: .*admin|PMA|mysql

#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
# $Revision: 471 $
#

[Definition]

# Option: failregex
# Notes.: regex to match the password failure messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching.
# Values: TEXT
# [client x.x.x.x] File does not exist: /home/www/admin/admin,
failregex = [[]client []] File does not exist: .*admin|PMA|mysql

#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
[email protected]:/etc/fail2ban/filter.d# cat apache-w00tw00t.conf
[Definition]

failregex = ^ -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*

ignoreregex =

Ensuite, vous pouvez faire un restart de fail2ban avec /etc/init.d/fail2ban restart et c’est terminé.

Détecteur de backdoor

Le dernier logiciel à installer est un détecteur de Backdoor. Pour l’installer, faites un apt-get install rkhunter et vérifier dans son fichier de configuration /etc/default/rkhunter que report_email est sur root et cron_daily_run à yes.

Vous recevrez des emails en cas si des fichiers sensibles sont modifiées. Attention toutefois, car il peut générer des faux positifs.

Recevoir un email lors d’une connexion ssh

Cette fois-ci c’est plus une astuce qu’un logiciel. Si vous souhaitez recevoir un email dés que quelqu’un se connecte sur un compte d’un utilisateurs système, vous pouvez modifier son fichier ~user/.bashrc et ajouter la ligne suivante : echo ‘Acces SheLL Root’ `who` `date` | mail -s `hostname` Shell Root [email protected]

À chaque connexion, ce bout de code sera exécuté et vous serez avertie. Plutôt pratique si vous êtes parano et souhaitez détecter des intrusions facilement.

En conclusion, avec ces quelques principes de bases vous devriez avoir un serveur sécurisé. N’oubliez pas qu’aucun serveur n’est infaillible et gardez toujours un système à jour pour limiter les risques. Dans la prochaine vidéo, nous verrons comment augmenter la sécurité d’apache et dans une autre vidéo comment mettre en place un système de backup.

Si vous voulez en apprendre plus sur Iptables, je vous recommande ce tutoriel sur le site du zéro.

Si vous avez aimé l’article, n’hésitez pas à le diffuser sur Facebook/Twitter via les boutons ci-dessous. Je vous invite également sur la page facebook du blog (merci d’avance).

(Image à la une : No entry sign)

95 commentaires ont été ajoutés, ajoutez le vôtre.

Vous pouvez laisser un commentaire, cependant je ne peux pas vous garantir qu'il sera modéré rapidement ou qu'il aura une réponse, faute de temps pour m'occuper du site.

  1. Booba06

    Pour ceux qui à cette date (avril 2018) aurait un pb avec leur ftp après suivi de ce très bon tuto, j’ai pour ma part résolu le soucis en mettant les règles en output pour le ftp comme suit: –sport à la place de –dport

    # FTP Out
    iptables -t filter -A OUTPUT -p tcp –sport 21 -j ACCEPT
    iptables -t filter -A OUTPUT -p tcp –sport 20 -j ACCEPT

    J’utilise FilleZilla en mode Actif et mon serveur est un Debian 8 hébergé chez OVH
    Cordialement