From Mageia wiki
Jump to: navigation, search


Drakconf multiflag.png
Autres langues
English ; français ;

Pare-feu Mageia

Configuration de Drakfirewall

L’interface graphique du pare-feu dans le centre de contrôle Mageia (drakfirewall) est une interface utilisateur pour le pare-feu Shoreline plus connu sous le nom Shorewall

Shorewall une interface utilisateur pour iptables, le pare-feu du noyau Linux. Shorewall permet de configurer des pare-feu très complexes en utilisant des fichiers textes de configuration (relativement) faciles à comprendre qui se trouvent dans /etc/shorewall.

La configuration de l’interface graphique du pare-feu dans le centre de contrôle Mageia crée un fichier /etc/shorewall/rules.drakx qui est inclus dans les fichiers de configuration du pare-feu et permet de bloquer et d’autoriser simplement les ports de votre ordinateur.

Le pare-feu est-il vraiment nécessaire ?

Dans un réseau domestique typique, votre routeur Internet est généralement doté d’un pare-feu parfaitement efficace. Ce pare-feu est normalement configuré pour bloquer tous les paquets entrants en provenance de l’internet, à moins que des règles spécifiques aient été définies pour transférer des ports désignés vers des périphériques précis du réseau local. Si vous faites confiance au pare-feu du routeur, et si vous faites confiance à tous les dispositifs de votre sous-réseau local, alors il est inutile d’avoir également un pare-feu sur votre ordinateur Linux. Si vous décidez d’utiliser un pare-feu, vous devez savoir qu’à moins d’ouvrir certains ports sur celui-ci, vous risquez d’avoir des difficultés avec des fonctions telles que l’impression ou la navigation sur d’autres ordinateurs.

Notifications sur le bureau

L’interface graphique du pare-feu Mageia vous permet de configurer des notifications sur le bureau, de sorte que vous êtes alerté chaque fois qu’un autre ordinateur accède au port en question. Par défaut, vous recevrez des notifications pour tous les services ouverts. Les nouveaux utilisateurs sont parfois perturbés lorsqu’ils voient des alertes pour des services comme le port 601 (cups) ou le port 5353 (mdns). Ces services bavardent en permanence entre les périphériques et ne sont pas inquiétant. Désactiver l’alerte du bureau pour le service vous évitera d’être dérangé par ces derniers. Cependant, tout trafic sur le port 22 (ssh) par exemple qui proviendrait d’une autre source que la vôtre pourrait constituer une attaque.

Astuces avancées pour le pare-feu

En éditant manuellement les fichiers de shorewall, il est possible de créer des pare-feu beaucoup plus sophistiqués en plus du simple pare-feu fourni par drakfirewall.

Pays sur liste noire

Malheureusement, beaucoup d’attaques sur les ordinateurs proviennent de lieux bien précis de par le monde. Si vous avez un serveur dont vous savez où se trouvent ses utilisateurs, il est alors possible de recourir à un pare-feu pour bloquer l’accès en provenance de ces sites.

Ces instructions supposent que vous utilisez Mageia 4 ou plus.

Attention !
Depuis la rédaction de ce paragraphe, un compte sur https://www.maxmind.com est nécessaire pour télécharger la base de données. Le lien sur le script ci-dessous devra également être vérifié.

Cette astuce fait appel à une fonctionnalité du pare-feu appelée ipsets, qui est une liste dynamique de plages d’adresses IP. Ipsets dépend d’un paquet appelé xtables, nous devons donc commencer par installer quelques paquets. Ouvrez un terminal et entrer la commande /bin/sudo -i pour devenir utilisateur root.

# urpmi xtables-addons xtables-geoip xtables-addons-kernel-desktop-latest

ou

# urpmi xtables-addons xtables-geoip xtables-addons-kernel-server-latest

si vous utilisez le « kernel-server-latest ».

Après avoir installé les paquets, nous pouvons constater que les Ipsets sont disponibles dans shorewall avec la commande

# shorewall show capabilities | grep Ipset Ipset Match (IPSET_MATCH): Available

Ensuite, nous créons un script qui téléchargera une liste de plages d’adresses IP de pays et les mettra dans un ipset.

Utilisez un éditeur de texte pour créer un fichier appelé /usr/local/bin/ipset-geoblock-country.sh

#!/bin/bash ipset -exist create geoblock hash:net ipset flush geoblock wget -O /tmp/GeoIPCountryCSV.zip -T 5 -t 1 http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip unzip -p /tmp/GeoIPCountryCSV.zip | tr -d '"' | cut -d"," -f5,1-2 | awk -F, '\ BEGIN { #Define list of countries to block Countries = "CN BR"; split(Countries, countries, " "); } \ { for (i in countries) { if (countries[i] == $3) { system("ipset -A geoblock " $1 "-" $2 " -exist"); } } } \ ' ipset save geoblock > /etc/shorewall/geoblock rm -f /tmp/GeoIPCountryCSV.zip

Ici, l’accès de la Chine et du Brésil est bloqué. Une liste des codes de pays est disponible sur le site Blocage des téléchargements par pays Une fois l’ipset créé, il est enregistré sous le fichier /etc/shorewall/geoblock.

Rendre le script exécutable

# chmod +x /usr/local/bin/ipset-geoblock-country.sh

et mettre en place un « cron job » pour le faire fonctionner une fois par mois

# cd /etc/cron.monthly && ln -s /usr/local/bin/ipset-geoblock-country.sh

Exécutez maintenant le script manuellement et visualisez le contenu de l’ipset que vous avez créé.

# /usr/local/bin/ipset-geoblock-country.sh && ipset list | more

Maintenant, pour configurer shorewall afin de bloquer ces plages d’adresses IP, modifiez le fichier /etc/shorewall/blrules

# # Shorewall version 4 - Blacklist Rules File # # For information about entries in this file, type "man shorewall-blrules" # # Please see http://shorewall.net/blacklisting_support.htm for additional # information. # ################################################################################################################################################## ################################################# #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS SWITCH # PORT PORT(S) DEST LIMIT GROUP DROP net:+geoblock all

La dernière ligne signifie que tous les paquets provenant d’internet avec l’adresse IP source contenue dans l’ipset appelé geoblock doivent être supprimés.

Enfin, nous devons configurer shorewall pour charger l’ipset à partir du fichier sauvegardé au démarrage. (Shorewall ne démarrera pas si l’ipset est absent).

Ajouter ce texte au fichier /etc/shorewall/init

# restore geographical blacklist if present if [ -f /etc/shorewall/geoblock ]; then ipset destroy geoblock ipset -file /etc/shorewall/geoblock restore fi

Pour activer la nouvelle configuration, exécuter la commande

# shorewall safe-restart

Celui-ci compile les règles du pare-feu, met en évidence les erreurs de configuration et demande votre confirmation avant de les activer.

Pays sur liste blanche

Les pays peuvent être inscrits sur une liste blanche, tout comme sur la liste noire ci-dessus. On crée d’abord un script pour créer un ipset. Dans cet exemple, un ipset pour le Royaume-Uni (gb) est créé.

/usr/local/bin/ipset-whitelist-country.sh

#!/bin/bash ipset -exist create geowhitelist hash:net ipset flush geowhitelist wget -O /tmp/GeoIPCountryCSV.zip -T 5 -t 1 http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip unzip -p /tmp/GeoIPCountryCSV.zip | tr -d '"' | cut -d"," -f5,1-2 | awk -F, '\ BEGIN { #Define list of countries to whitelist Countries = "GB"; split(Countries, countries, " "); } \ { for (i in countries) { if (countries[i] == $3) { system("ipset -A geowhitelist " $1 "-" $2 " -exist"); } } } \ ' ipset save geowhitelist > /etc/shorewall/geowhitelist rm -f /tmp/GeoIPCountryCSV.zip

Rendez-le exécutable, et mettez en place un cron job hebdomadaire pour le mettre à jour comme ci-dessus.

Au lieu de modifier shorewall/blrules, nous modifions /etc/shorewall/rules comme suit

# # Shorewall version 4 - Rules File # # For information on the settings in this file, type "man shorewall-rules" # # The manpage is also online at # http://www.shorewall.net/manpages/shorewall-rules.html # ################################################################################################################################################## ################## #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS # PORT PORT(S) DEST LIMIT GROUP ACCEPT net:+geowhitelist fw tcp 80,443 ACCEPT net:192.168.1.0/24 fw tcp 22,80,443 Ping(ACCEPT) net:192.168.1.0/24 fw #SECTION ALL #SECTION ESTABLISHED #SECTION RELATED #INCLUDE rules.drakx

La ligne ACCEPT net:+geowhitelist fw tcp 80,443 ouvre les ports 80 et 443 (http et https) uniquement aux utilisateurs de l’ipset geowhitelist.

Remarque :
La dernière ligne à inclure la configuration de drakfirewall est commentée pour empêcher drakfirewall d’ouvrir des ports sans utiliser la liste blanche. Avec cette ligne commentée, l’ouverture de ports dans l’interface graphique de drakfirewall n’aura aucun effet, vous devez donc éditer le fichier de règles manuellement pour ouvrir les ports dont vous avez besoin comme vous pouvez le voir dans les lignes suivantes.

La ligne ACCEPT net:192.168.1.0/24 fw tcp 22 ouvre le port 22 (ssh) ainsi que les ports 80 et 443 aux utilisateurs du sous-réseau local. La ligne Ping(ACCEPT) net:192.168.1.0/24 fw permet au système de répondre aux demandes de ping uniquement depuis le sous-réseau local.

Configurez maintenant shorewall pour charger l’ipset au démarrage. Ajoutez ce texte au fichier /etc/shorewall/init

# Restore whitelist from file if [ -f /etc/shorewall/geowhitelist ]; then ipset destroy geowhitelist ipset -file /etc/shorewall/geowhitelist restore geowhitelist fi

Activez la nouvelle configuration avec

# shorewall safe-restart

Liste noire des méchants de la propriété intellectuelle signalés par la communauté

De nos jours, de nombreuses organisations (à but non lucratif ou commerciales) tiennent des listes d'IP connues comme étant des menaces potentielles. Les robots peuvent scanner internet en utilisant ces IP ou les cybercriminels peuvent utiliser ces IP pour lancer des attaques. Ces listes peuvent être téléchargées et peuvent alimenter le pare-feu pour les bloquer dès le départ.

Dans ce paragraphe, j’ai choisi d’utiliser les listes de spamhaus.org et abuseipdb.com

D’après mes lectures et ma pratique quotidienne, je fais confiance à ces fournisseurs ; d’autres peuvent en proposer davantage.

Il est inutile d’avoir un compte au sein du projet Spamhaus pour obtenir leur liste. Cependant, un compte gratuit est nécessaire pour obtenir la liste de Abuseipdb.com

Vous pouvez vous inscrire pour un compte gratuit ici : [1]

Si vous utilisez un serveur sur lequel est installé fail2ban, vous pouvez également signaler l’IP bloquée à Abuseipd.com

Si vous ne souhaitez pas ouvrir un compte sur abuseipdb.com, vous pouvez simplement supprimer sur les scripts ci-dessous les blocs liés à abuseipdb et ne garder que les parties liées au projet spamhaus. Juste pour partager mon expérience, je n’ai pas remarqué de pression commerciale ou de spam de la part d’abuseipdb.com pour passer à un plan commercial.

Comme pour les pays de la liste noire, la fonction ipset est requise et les mêmes paquets doivent être installés, en tant que root :

# urpmi xtables-addons xtables-geoip xtables-addons-kernel-desktop-latest

ou

# urpmi xtables-addons xtables-geoip xtables-addons-kernel-server-latest

Si vous utilisez le « kernel-server-latest »

Ensuite, l’approche est la même :

  1. Créer un script pour télécharger les listes d’IP à bloquer, pour paramétrer les iptables par ipset et pour les sauvegarder.
  2. Demandez au pare-feu de bloquer ces ipsets
  3. Rendre cette règle persistante.
  4. Créer un cron job pour mettre à jour la liste des IP afin de bloquer les nouvelles menaces et d’éviter de bloquer les menaces obsolètes.

Script pour télécharger les listes d’IP et pour initialiser les iptables

En tant que root, créez avec votre éditeur de texte préféré (nano, vi…) le fichier /usr/local/bin/shorewall-vilains.sh

Ensuite, copiez et collez le bloc suivant :

#!/bin/bash # Thanks to many # To be stored in /usr/local/bin ############################# # Set script variables SPAMHAUS_DROP="/usr/local/src/drop.txt" SPAMHAUS_eDROP="/usr/local/src/edrop.txt" ABUSE_DROP="/usr/local/src/abuseip.txt" SPAMURL="https://www.spamhaus.org/drop/drop.txt" eSPAMURL="https://www.spamhaus.org/drop/edrop.txt" DROP_ADD_TO_FW="/usr/local/src/DROP2.txt" eDROP_ADD_TO_FW="/usr/local/src/eDROP2.txt" ABUSE_ADD_TO_FW="/usr/local/src/abuseipv4.txt" SAVE_SPAM="/etc/shorewall/spamhaus" SAVE_SPAME="/etc/shorewall/espamhaus" SAVE_ABUSE="/etc/shorewall/abuseipdb" # Firewall list names ABUSE="abusedrop"; SPAM="spamhausdrop"; SPAME="spamhausedrop"; # echo ">>" echo "Start: $(date)" echo ">" # # Purge previous IP # echo "Create ipset DROP rules" /usr/sbin/ipset -exist create $ABUSE hash:net counters /usr/sbin/ipset -exist create $SPAM hash:net counters /usr/sbin/ipset -exist create $SPAME hash:net counters echo "Purge former ipset DROP rules" /usr/sbin/ipset flush $ABUSE /usr/sbin/ipset flush $SPAM /usr/sbin/ipset flush $SPAME # # ABUSEIPDB.com # echo ">" echo "Download ABUSEIP list and extract IP" curl -G https://api.abuseipdb.com/api/v2/blacklist -d confidenceMinimum=90 -H "Key: your_key_from_abuseipdb_site" -H "Accept: text/plain" > $ABUSE_DROP #remove IPv6 IP sed '/:/d' $ABUSE_DROP > $ABUSE_ADD_TO_FW echo "Update ipset avec ABUSEIP list" while read IP; do /usr/sbin/ipset -exist add $ABUSE $IP done < "$ABUSE_ADD_TO_FW" echo "Save ipset ABUSEIP list" ipset save $ABUSE > $SAVE_ABUSE # # "The Spamhaus Project" - https://www.spamhaus.org # echo ">" echo "Download SPAMHAUS DROP list and extract IP" wget -q -O - "$SPAMURL" > $SPAMHAUS_DROP grep -v '^;' $SPAMHAUS_DROP | cut -d ' ' -f 1 > $DROP_ADD_TO_FW echo "Update ipset with SPAMHAUS DROP list" while read IP; do /usr/sbin/ipset -exist add $SPAM $IP done < "$DROP_ADD_TO_FW" echo "Save ipset SPAMHAUS list" ipset save $SPAM > $SAVE_SPAM # # "The Spamhaus Project" - https://www.spamhaus.org # echo ">" echo "Download SPAMHAUS eDROP list and extract IP" wget -q -O - "$eSPAMURL" > $SPAMHAUS_eDROP grep -v '^;' $SPAMHAUS_eDROP | cut -d ' ' -f 1 > $eDROP_ADD_TO_FW echo "Update ipset with SPAMHAUS eDROP list" while read IP; do /usr/sbin/ipset -exist add $SPAME $IP done < "$eDROP_ADD_TO_FW" echo "Save ipset eSPAMHAUS list" ipset save $SPAME > $SAVE_SPAME # #make new list active in memory # echo ">" echo "Reload firewall" echo "--------------- " shorewall restart # # Controls # echo " " systemctl status --no-pager shorewall echo " " shorewall show bl echo " " echo "spamhausDrop size" /usr/sbin/ipset list "$SPAM" | wc -l echo "spamhauseDrop size" /usr/sbin/ipset list "$SPAME" | wc -l echo "abusedrop size" /usr/sbin/ipset list "$ABUSE" | wc -l echo ">" echo Fin: $(date) echo ">>"

En tant que root, rendez ce script exécutable :

# chmod u+x /usr/local/bin/shorewall-vilains.sh

Demandez à Shorewall de bloquer ces listes d’IP

Pour configurer shorewall afin de mettre en liste noire ces plages d’adresses IP, modifiez le fichier /etc/shorewall/blrules et ajoutez les lignes suivantes en bas :

DROP:info:abuseip net:+abusedrop all DROP:info:spamhaus net:+spamhausdrop all DROP:info:spamhausE net:+spamhausedrop all

Rendre cette liste noire persistante

Comme l’ipset créé disparaîtra après le redémarrage, pour les rendre persistants, vous devez demander à shorewall de les restaurer au démarrage ou après un redémarrage. Rappelons que ces ipsets ont été sauvegardés dans le dossier /etc/shorewall grâce au script ci-dessus. Donc, en tant que root, éditons le fichier /etc/shorewall/init et ajoutons le bloc suivant en bas :

# restore Abuseipdb and Spamhauss blacklists if present if [ -f /etc/shorewall/abuseipdb ]; then ipset destroy abusedrop ipset -file /etc/shorewall/abuseipdb restore fi if [ -f /etc/shorewall/spamhaus ]; then ipset destroy spamhausdrop ipset -file /etc/shorewall/spamhaus restore fi if [ -f /etc/shorewall/espamhaus ]; then ipset destroy spamhausedrop ipset -file /etc/shorewall/espamhaus restore fi

Vous pouvez maintenant effectuer un premier test en exécutant dans une console, en tant que root, le script shorewall-vilains.sh :

# . /usr/local/bin/shorewall-vilains.sh

Mise à jour de la liste noire

Afin de mettre à jour la liste des IP à bloquer, vous devez exécuter régulièrement le script shorewall-vilains.sh. Cependant, faites-le uniquement une fois par jour, car vous êtes limité dans le nombre de téléchargements de la liste que vous pouvez effectuer.

Quant au pays de la liste noire, en tant que root, vous pouvez créer un lien vers le script dans un dossier cron comme :

# ln -s /usr/local/bin/shorewall-vilains.sh /etc/cron.daily


Personnellement, ayant plusieurs cron job à gérer sur un serveur, je trouve plus pratique d’utiliser la fonction timer de systemd. Pour ce faire, vous devez créer 2 fichiers comme ci-dessous.

En tant que root, créer /usr/lib/systemd/system/shorewall-spamcron.service avec votre éditeur de texte préféré et copier, collez le bloc suivant :

[Unit] Description=IP spam list update for shorewall [Service] User=root ExecStart=/usr/local/bin/shorewall-vilains.sh [Unit] Description=Run shorewall-vilains.sh daily at 0:30

Faites de même pour /usr/lib/systemd/system/shorewall-spamcron.timer et avec le block suivant :

[Unit] Description=Run shorewall-vilains.sh daily at 0:30 [Timer] OnCalendar=*-*-* 00:30:00 Persistent=true Unit=shorewall-spamcron.service [Install] WantedBy=timers.target

Ensuite, en tant que root, activez et démarrez ce service :

#systemctl enable --now shorewall-spamcron.timer

La liste des méchants sera mise à jour tous les jours à 3 heures du matin

La commande suivante permet de vérifier le moment où le script a été exécuté et celui où il le sera :

#systemctl list-timers shorewall-spamcron.timer

Restreindre les tentatives de connexion

L’une des attaques les plus courantes contre un pare-feu sont les tentatives de connexion répétées contre les serveurs SSH. Un serveur SSH correctement configuré doit utiliser des connexions sans mot de passe en utilisant une authentification par clé publique, et ne risque donc pas d’être violé, mais cela n’empêche pas les scripts kiddies du monde entier d’essayer de se connecter avec des attaques par dictionnaire qui font des tentatives de connexion répétées en utilisant des mots de passe communs. Même s’il n’y a aucun danger de réussite de la connexion, cela remplit le journal du système et gaspille votre bande passante.

Une défense simple mais efficace contre ce type d’attaque consiste à utiliser le pare-feu shorewall pour restreindre le nombre de nouvelles connexions qu’il est possible d’établir sur un port dans un délai donné. Les attaques par dictionnaire ne fonctionnent que parce de nombreuses combinaisons de mots de passe peuvent être essayées dans un laps de temps très court. Si shorewall ralentit le nombre de connexions à cinq par minute par exemple, les algorithmes automatisés qui pilotent ces attaques abandonneront rapidement et passeront à une cible plus facile.

Restreindre le taux de connexion à un service est très facile avec un pare-feu. Éditez le fichier /etc/shorewall/rules et ajoutez des lignes suivantes :

Limit:none:SSHA,5,60 net $FW tcp ssh Limit:info:POP3,4,60 net $FW tcp 110 Limit:info:FTP,4,240 net $FW tcp ftp

Ces commandes limiteront les connexions à SSH à cinq tentatives en soixante secondes, ou quatre tentatives en soixante secondes pour se connecter à un serveur de courrier POP3, ou quatre tentatives en quatre heures pour se connecter à un serveur FTP. Les lignes marquées info provoqueront une entrée dans le journal lorsqu’une tentative de connexion est refusée.

Activez la nouvelle configuration avec

# shorewall safe-restart
Attention !
Vous ne devez pas utiliser l’interface graphique de Drakfirewall pour ouvrir des ports aux mêmes services. Si l’interface graphique est utilisée pour autoriser les connexions à SSH par exemple, alors le pare-feu aura deux règles pour le même service et ne limitera pas le nombre de connexions.

Une autre solution consiste à utiliser fail2ban pour mettre fin aux tentatives de connexion persistantes.

Il existe un autre moyen de bloquer les trafics et les attaques indésirables avec le pare-feu Mageia. Ces services libres peuvent être consultés à cette adresse