Se protéger contre le scan de ports avec portsentry
Votre serveur peut faire l'objet de différents scans de ports afin d'identifier, par exemple, les services qui sont en place sur votre serveur ou encore le système d’exploitation installé (ce que permet Nmap, par exemple). Ces informations pourraient être ensuite exploitées par une personne malveillante afin d’atteindre à l’intégrité de votre serveur.
Pour se protéger contre ces pratiques, vous pouvez mettre en place portsentry qui bloquera les adresses IP des connexions à l'origine de ces scans.
Portsentry peut être un complément à fail2ban si vous souhaitez renforcer la sécurité de votre serveur. En effet, fail2ban bloque les adresses IP des connexions qui effectuent des authentifications infructueuses alors que portsentry, lui, effectue un blocage des adresses IP qui cherchent à identifier les ports ouverts sur votre serveur. Les deux paquets peuvent donc être complémentaires et ainsi renforcer la sécurité de votre serveur.
Nous allons commencer par procéder à l'installation du paquet qui nous intéresse avec la commande suivante:
root@flex:~# apt-get update && apt-get install portsentry
Un message d'avertissement vous indiquera alors que portsentry ne va appliquer aucun blocage sans que vous lui indiquiez de le faire :
Une fois l’installation terminée, nous allons donc procéder à la configuration de portsentry.
Dans un premier temps, nous allons arrêter le service :
root@flex:~# /etc/init.d/portsentry stop Stopping anti portscan daemon: portsentry.
Nous allons ensuite mettre en place des exceptions afin de ne pas bloquer différentes adresses IP (à minima votre adresse IP ainsi que les adresses IP des serveurs de monitoring, etc.).
Pour connaître les plages d’adresses IP à autoriser et utilisée par nos serveur de monitoring, nous vous invitons à vous référer à l’article suivant : https://fr.ikoula.wiki/fr/Quelles_sont_les_IP_%C3%A0_autoriser_dans_mon_firewall_pour_qu%27Ikoula_ait_acc%C3%A8s_%C3%A0_mon_serveur
Pour mettre en place ces exceptions, nous allons éditer le fichier /etc/portsentry/portsentry.ignore.static
Au démarrage du service, le contenu du fichier sera ajouté au fichier /etc/portsentry/portsentry.ignore.
Pour ajouter une exception à portsentry, il suffit d'ajouter une adresse IP par ligne. Vous pouvez également et plus simplement ajouter un ou des CIDR.
Maintenant que vous avez ajouté votre/vos adresses IP en liste blanche, nous allons configurer portsentry à proprement parlé en éditant le fichier de configuration qui est accessible via /etc/portsentry/portsentry.conf.
Nous allons utiliser portsentry en mode avancé concernant les protocoles TCP et UDP. Pour ce faire, il faut modifier le fichier /etc/default/portsentry afin d'avoir :
TCP_MODE="atcp" UDP_MODE="audp"
Nous souhaitons également que portsentry effectue un blocage. Il nous faut donc l'activer en passant BLOCK_UDP et BLOCK_TCP à 1 comme ci-dessous :
################## # Ignore Options # ################## # 0 = Do not block UDP/TCP scans. # 1 = Block UDP/TCP scans. # 2 = Run external command only (KILL_RUN_CMD) BLOCK_UDP="1" BLOCK_TCP="1"
Nous allons opter pour un blocage des personnes malveillantes par le biais d'iptables. Nous allons donc commenter toutes les lignes du fichier de configuration qui commencent par KILL_ROUTE exceptée la suivante :
KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
Vous pouvez vérifier que c'est bien le cas, une fois le fichier enregistré en utilisant cat et grep :
cat portsentry.conf | grep KILL_ROUTE | grep -v "#"
Nous pouvons à présent relancer le service portsentry et celui-ci va à présent commencer à bloquer les scans de port :
root@flex:~# /etc/init.d/portsentry start Starting anti portscan daemon: portsentry in atcp & audp mode.
Portsentry journalise dans le fichier /var/log/syslog et comme vous pouvez le constater ci-dessous, suite à un scan de port réalisé pour les soins du présent tutoriel avec Nmap, l'adresse a bien été bloquée par le biais d'iptables :
Mar 17 16:59:02 sd-24527 portsentry[6557]: adminalert: PortSentry is now active and listening. Mar 17 17:00:29 sd-24527 portsentry[6553]: attackalert: Connect from host: 178.170.xxx.xxx/178.170.xxx.xxx to TCP port: 1 Mar 17 17:00:29 sd-24527 portsentry[6553]: attackalert: Host 178.170.xxx.xxx has been blocked via wrappers with string: "ALL: 178.170.xxx.xxx : DENY" Mar 17 17:00:29 sd-24527 portsentry[6553]: attackalert: Host 178.170.xxx.xxx has been blocked via dropped route using command: "/sbin/iptables -I INPUT -s 178.170.xxx.xxx -j DROP" Mar 17 17:00:29 sd-24527 portsentry[6553]: attackalert: Connect from host: 178.170.xxx.xxx/178.170.xxx.xxx to TCP port: 79 Mar 17 17:00:29 sd-24527 portsentry[6553]: attackalert: Host: 178.170.xxx.xxx is already blocked. Ignoring [...]
Si vous souhaitez lever un blocage, vous pouvez vérifier la présence des adresses IP bannies via iptables.
On y retrouve l'adresse IP qui a été bloquée suite à notre test précédent :
root@flex:~# iptables -L -n -v Chain INPUT (policy ACCEPT 52381 packets, 6428K bytes) pkts bytes target prot opt in out source destination 794 42696 DROP all -- * * 178.170.xxx.xxx 0.0.0.0/0
Nous allons donc supprimer l'entrée :
iptables -D INPUT -s 178.170.xxx.xxx -j DROP
PS : n’oubliez pas d’autoriser les adresses IP de nos serveurs de monitoring dans les exceptions de portsentry afin d’éviter les faux-positifs et provoquer des alertes inutiles.