Installer votre premier Firewall grâce à UFW

Voyons comment mettre en place facilement un pare-feu (firewall) afin de sécuriser votre serveur Linux. Grâce à UFW – Uncomplicated FireWall, vous allez pouvoir configurer facilement vos règles sans passer par des utilitaires complexes comme IPtables.

Qu’est-ce qu’un firewall ?

Un pare-feu est un logiciel (ou matériel) qui contrôle les accès aux réseaux suivant des règles configurables. Le plus souvent, les règles de votre firewall se baseront sur l’origine ou la destination des paquets réseaux (flux de données). Concrètement, vous allez pouvoir autoriser/interdire des adresses IP, des protocoles, des ports, que ce soit pour des connexions entrantes ou sortantes du serveur.

Qu’est ce qu’un port, un protocole, un service ?

Un serveur est une machine qui diffuse un ou plusieurs services sur un réseau. Un serveur répond donc à d’autres machines en fonction de son rôle et ne devrait être joignables que sur les services pour lequel il est configuré.

Par exemple :

  • un serveur de communication TeamSpeak doit répondre à des connexions vocales mais ne doit pas répondre si je le sollicite pour relayer des courriers indésirables,
  • un serveur Minecraft doit répondre à des actions de joueur mais ne doit pas répondre si je tente d’établir une connexion FTP pour échanger des documents,
  • un serveur web doit répondre si mon navigateur lui demande une page web, mais ne doit pas forcement me répondre si je tente de lui ouvrir une connexion MySQL.

N’importe quel serveur sous Windows ou Linux compte quelques dizaines de service actifs en permanence et plusieurs d’entre eux sont des services réseaux qui sont à l’écoute de toutes demandes provenant de l’extérieur pour y répondre (c’est leur job après tout).

Pour être capable d’écouter en continue les sollicitation du réseau, chaque service attend devant un port qui lui est réservé. Ainsi, TeamSpeak attendra devant la port 9987, un serveur de mail écoutera le port 25 tandis qu’un serveur web se réservera par défaut le port 80 pour le protocole HTTP et 443 pour le protocole HTTPS.

Prenons le cas d’un serveur WEB + PHP + MySQL + Mail

Imaginons que vous souhaitiez installer un serveur web capable de comprendre du code PHP, d’héberger des données dans une base MySQL et d’envoyer des emails de notification à vos utilisateurs. Vous aurez également besoin de SSH pour vous connecter à distance pour administrer le serveur et de déployer votre code.

Pour chacun des services, il faut se demander s’il doit être accessible de partout (internet), depuis certaines machines (filtrage par IP), ou uniquement en interne (filtrage par protocole). Pour tous les autres services actifs sur votre serveur, il est préférable de les bloquer pour éviter des accès non désirés.

En effet, Internet est rempli de serveurs « zombie » qui exposent des services à des pirates. Sans le savoir, des services mails sont accessibles sur de nombreux serveurs et sont exploités comme relais mail par des spammeurs à votre insu. Il y a également de nombreux serveurs de bases de données exposés inutilement sur internet qui se retrouvent victime d’attaques exposants ainsi les données confidentielles qu’ils contiennent.
Enfin, même si un serveur de base de données peut être protégé par un mot de passe, des pirates peuvent saturer votre service en ouvrant des centaines de connexion simultanée.

Installation de UFW, c’est parti !

Sur Ubuntu, UFW est pré-installé. Si vous utilisez une autre distribution Linux comme Debian, il suffit d’installer le paquet ufw.

apt-get install ufw

A ce stade, IFW est installé mais n’est pas activé. Nous allons vérifier l’état du firewall grâce à la commande status :

ufw status verbose
  • status permet de savoir si le pare-feu est activé ou désactivé,
  • logging permet de connaitre le niveau de traçabilité de ce que l’on trouvera dans/var/log/ufw.log
  • default permet de savoir si par défaut (en l’absence de règle), on autorise ou refuse toutes connexions entrantes ou sortantes

La première chose à faire est de configurer les règles par défaut. Nous définissons que toutes connexions entrantes et sortantes sont bloquées. En effet, nous vous conseillons d’appliquer le principe de blacklist, c’est à dire de tout bloquer puis d’autoriser au cas par cas les services nécessaires.

ufw default deny incoming
ufw default deny outgoing

Autorisons les connexions au serveur web (que ce soit Apache ou nginx). Pour cela, nous devons autoriser les connexions entrantes (IN) vers le port 80 (HTTP) et 443 (HTTPS)

ufw allow in 80/tcp
ufw allow in 443/tcp

En plus de préciser le port acceptant les connexions entrantes, vous remarquez que nous pouvons préciser le protocole de transport des paquets. Le choix entre TCP ou UDP dépends du type de service. Un service qui accepte des pertes de données utilisera plutôt UDP (la téléphonie, la vidéo, un jeu en réseau, etc) tandis qu’un service qui doit garantir l’intégrité des données utilisera TCP (le web, les mails, etc).

Vous vous en doutez surement mais votre serveur a également besoin d’accéder à internet en HTTP ou HTTPS. Il peut avoir besoin de contacter un webservice, de télécharger des fichiers ou simplement de se mettre à jour. Il faut donc autoriser le serveur à sortir (OUT) vers Internet :

ufw allow out 80/tcp
ufw allow out 443/tcp

Il y a de forte chance que vous soyez actuellement connecté à votre serveur en SSH. Un connexion SSH vous permet d’exécuter des commandes à distance, de monter des tunnels ou d’envoyer des fichier en SFTP. Nous pouvons donc autoriser le SSH(22) en entrant

ufw allow in 22/tcp

Précisons que si vous avez configuré SSH sur un autre port que le 22 pour brouiller les pistes, n’oubliez pas d’adapter la commande avec le bon numéro de port

Votre serveur aura également besoin d’envoyer des emails. Il ne pourra toutefois pas recevoir de mails ou être utilisé comme relai. Nous pouvons donc autoriser les connexions SMTP (25) sortantes uniquement

ufw allow out 25/tcp

Comme tous les serveurs, votre serveur va avoir besoin de résoudre des noms de domaine, c’est à dire de convertir un nom de domaine en adresse IP. Pour cela, il doit interroger le serveur DNS que vous avez configuré à son installation. Nous devons donc autoriser le connexions sortante en DNS (53)

ufw allow out 53/udp

Vous aurez remarqué que nous n’avons pas ouvert le port de MySQL. En effet, notre serveur de base de données doit être joignable localement par PHP qui est sur le même serveur mais ne doit pas être exposé sur internet. Étant donné que nous avons bloqué tous les ports par défaut, il se retrouve protégé sans règle particulière. Vous pourrez toutefois vous connecter à votre serveur MySQL depuis votre ordinateur en utilisant votre connexion SSH pour monter la connexions MySQL (L’outil MySQL WorkBench propose par défaut la connexion standard TCP/IP over SSH).

Notre configuration initiale étant terminée, nous pouvons maintenant activer le firewall

ufw enable

Vérifions maintenant notre paramétrage

ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp ALLOW IN Anywhere

80/tcp ALLOW OUT Anywhere
443/tcp ALLOW OUT Anywhere
25/tcp ALLOW OUT Anywhere
53/udp ALLOW OUT Anywhere

Comment protéger les ports ouverts ?

A ce niveau, nous avons réussi à fermer tous les ports pouvant donner accès à des services ne nécessitant d’être exposés sur internet. Maintenant, regardons comment améliorer la sécurité des ports ouverts.

UFW permet de limiter les tentatives de connexion, prenons l’exemple du SSH. De manière très simple, nous pouvons activer un quota de connexion SSH.

ufw limit 22/tcp comment 'Autorise 6 connexions sur 30 secondes'

UFW permet également de restreindre un port à certaines IPs. Nous pouvons donc imaginer que seulement quelques adresses IP aient accès à la connexion SSH. Supprimons la règle qui ouvrait SSH pour tout le monde et spécifions une adresse IP autorisée.

ufw delete allow in 22/tcp
ufw allow from <MON_IP> to any port 22

Nous pouvons également permettre au serveur de sortir vers une adresse spécifique sur un port spécifique

ufw allow out to <MON_IP> port <NUM_PORT>

Comment supprimer une règle de firewall UFW ?

Précédemment, nous avons supprimé une règle globale pour en créer une plus précise. Il existe deux manières de supprimer une règle :

  • En reprenant la commande d’ajout de règle, préfixé par delete (voir l’exemple précédent)
ufw delete allow from <MON_IP> to any port 22
  • En listant les règles de manière numérotée, puis en supprimant par numéro
ufw status numbered
Status: active
To Action From -- ------ ----
[ 1] 80/tcp ALLOW IN Anywhere
[ 2] 443/tcp ALLOW IN Anywhere
[ 3] 80/tcp ALLOW OUT Anywhere (out)
[ 4] 443/tcp ALLOW OUT Anywhere (out)
[ 5] 22/tcp ALLOW OUT Anywhere (out)
[ 6] 25/tcp ALLOW OUT Anywhere (out)
[ 7] 53/udp ALLOW OUT Anywhere (out)
[ 8] 10022 ALLOW IN 123.123.123.123

Il suffit ensuite de lancer la commande delete avec l’ID de la ligne. Par exemple :

ufw delete 2

UFW – Ce n’est pas si compliqué ?

Vous avez bien vu que UFW – Uncomplicated FireWall, ce n’est pas si compliqué ?

N’hésitez pas à partager cet article sur vos réseaux sociaux et à venir en parler avec nous sur Twitter 😉

Ressources récentes