From Mageia wiki
Revision as of 10:56, 5 December 2021 by Cmoifp (talk | contribs) (Replacing the root console template with the template ligne de commande-fr)
Jump to: navigation, search

Template:Bandeau multi-langues-fr

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.

Template:Attention-fr

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. Template:Ligne de commande-fr ou Template:Ligne de commande-fr 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 Template:Ligne de commande-fr et mettre en place un « cron job » pour le faire fonctionner une fois par mois Template:Ligne de commande-fr Exécutez maintenant le script manuellement et visualisez le contenu de l’ipset que vous avez créé. Template:Ligne de commande-fr

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 Template:Ligne de commande-fr 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 Template:Ligne de commande-fr

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 :

Template:Ligne de commande-fr

ou

Template:Ligne de commande-fr 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 : Template:Ligne de commande-fr

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 : Template:Ligne de commande-fr

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 : Template:Ligne de commande-fr


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 Template:Ligne de commande-fr


Template:Attention-fr

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