Port scanning

Lorsque nous avons approvisionné notre base de données, nous avons délibérément ouvert le port 7100 pour pouvoir l'administrer à distance.

L'ouverture d'un port expose notre serveur à des vecteurs d'attaque. Des bogues ou des faiblesses de type "zero day" peuvent être exploités par des pirates informatiques s'ils détectent qu'un service X est à l'écoute sur un port.

Des Port Scanners existent en ligne et peuvent être téléchargés gratuitement, par exemple :

PenTest port scanner

Lancez une analyse de votre serveur. Y a-t-il des ports ouverts inattendus ?

Fermeture des ports : iptables et UFW

Il arrive qu'un port doive être ouvert pour un certain service, mais que nous souhaitions régler avec précision qui y a accès, et d'où (comme nous l'avons fait avec le port exposé pour MariaDB).

Les pare-feu commerciaux sont chargés de cette tâche et permettent de créer des règles pour le trafic entrant et sortant.

Chaque machine Linux dispose aussi de son propre tableau associatif d'adresses IP et ports, qui permet de définir comment accepter et router des paquets.

iptables --list

Nous pourrions par la suite configurer ce tableau pour rediriger les paquets comme on veut selon plusieurs critères :

  • la carte réseau impliquée (loopback, carte ethernet, cart wifi, etc)

  • le port

  • le protocole

  • l'adresse IP source

  • l'adresse IP destination

  • ...

iptables cheatsheet

Cet outil est puissant, mais difficile à configurer.

Une application enveloppe existe qui s'appelle UFW (Uncomplicated FireWall) qui permet de créer un pare-feu simple, basé sur iptables. Via des règles/expressions simples, nous allons préciser quels paquets accepter ou rejeter. UFW ajoute ensuite des lignes au iptables.

ufw status

Pour tester ufw, nous allons d'abord installer un serveur nginx sur une instance Ubuntu 22.04.

apt install nginx

Normalement, on pourrait faire une requête à notre serveur dans un navigateur pour avoir la page défaut de nginx.

Avant d'activer UFW, pour ne pas perdre la connexion à notre serveur, on va activer les connexions SSH :

D'abord, on va préciser les règles de base :

# On refuse TOUT paquets entrants
ufw default deny incoming
# On accepte l'envoie de tout les paquets sortants
ufw default allow outgoing

Ensuite, important, activer les règles pour SSH, sinon on perdra toute connexion avec notre serveur !

# Vérifier quels profils application existent
ufw app list
# Activer l'application OpenSSH
ufw allow OpenSSH

Maintenant activez UFW :

ufw enable

Essayez de nouveau de charger la page web servie par nginx. On ne peut pas !

Analysons les règles de UFW :

ufw status numbered

Regardons maintenant IPTables :

iptables --list

Vous remarquerez plus de règles !

Créons des règles qui permettent l'accès du monde extérieur pour nginx :

# On utilise le profil nginx
ufw allow 'Nginx Full'

Notre page fonctionne de nouveau !

Il y a d'autres scénarios de sécurisation d'un serveur :

  • Accepter des connexions SSH d'une adresse IP fixe : allow from 203.0.113.88 to any port 22

  • Accepter des connexions SSH d'une adresse IP fixe à MySQL : allow from 203.0.113.88 to any port 3306

  • Désactiver des connexions HTTP (port 80) : ufw deny http

... et bien plus. Par exemple, on peut aussi désactiver des paquets sortants, pour empêcher du malware à envoyer des secrets vers l'extérieur. En pratique, c'est difficile, surtout si notre serveur doit se mettre à jour tout seul !

Pour enlever une règle :

# Afficher les règles dans l'ordre et numéroté
ufw status numbered
# Supprimer un règle
ufw delete 4

Pour désactiver UFW (et donc enlever toutes les règles de iptables) :

ufw disable

Plus sur UFW

Mis à jour