debian12firewallufw

Date de publication: 24 août 2024

Installer Uncomplicated FireWall - UFW

Pré-requis

Voici la liste des notions à connaitre pour mettre en place UFW:

Pour assurer la sécurité de son serveur, les premiers gestes qui sauvent c'est souvent mettre en place au minima une redirection du port SSH, Fail2Ban et LogWatch.

Le FireWall est également un élément important. Aussi, IPtables n'est pas 'simple' à aborder, UFW propose de faire office d'interface à IPtables et de simplifier les commandes. Ce qui est utile pour les débutants comme moi.

Identifier les ports ouverts légitimes

Les règles par défaut de notre FireWall, c'est de bloquer toutes les connexions entrantes et autoriser toutes les connexions sortantes.

Seulement, sur le serveur des services fonctionnent, que ce soit le serveur web (lemp), mail, le gestionnaire de secret...
Avant de tout 'bloquer' il serait bien de faire un listing des ports utilisés.

Ici on va utiliser Netstat, on peut aussi utiliser nmap (mais moi aussi je débute alors ^.^).

# si netstat n'est pas disponible
> sudo apt-get install net-tools

#lister les ports en écoute
sudo netstat -taupeln|grep LISTEN

Vous obtiendez quelques chose comme:

tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      996        13426      365/systemd-resolve
tcp        0      0 0.0.0.0:69696           0.0.0.0:*               LISTEN      0          14518      519/sshd: /usr/sbin
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      996        13424      365/systemd-resolve
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          94279      39801/nginx: master
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      996        13412      365/systemd-resolve
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      0          94278      39801/nginx: master
tcp6       0      0 :::69696                :::*                    LISTEN      0          14549      519/sshd: /usr/sbin
tcp6       0      0 :::80                   :::*                    LISTEN      0          94280      39801/nginx: master
tcp6       0      0 :::5355                 :::*                    LISTEN      996        13420      365/systemd-resolve
tcp6       0      0 :::443                  :::*                    LISTEN      0          94277      39801/nginx: master
Je ne suis pas Admin. Syst.

Ma compéhension est approximative et peut même être erronée si j'ai mal interprété certains aspects.
Prenez donc ces informations avec précaution.

Je n'ai pas compris tout de suite pour les lignes concernant systemd-resolve:
Sur le port 53, c'est lié au service DNS, il s'agit probablement d'un service qui agit come résolveur DNS, cache DNS.
Cela me fait penser un peu au fichier C:\Windows\system32\drivers\etc\hosts de Windows.
On le retrouve aussi sur le port 5355, a priori c'est du LLMNR (Link-Local Multicast Name Resolution) soit "Résolution de Noms Multicast Local"

Après, je retrouve bien nginx et ssh (oui le port est faux).

Bref, identifier bien les "connexions" à garder, voir celle qui faut supprimer.

Installation UFW

sudo apt update && sudo apt upgrade
sudo apt install ufw

Le firewall n'est pas activé par défaut.

Configuration de base

La politique de 'base' est de refuser toutes les connexions entrantes et d'autoriser toutes les connexions sortantes.


Ne fermez pas votre canal ssh en cour avant d'avoir vérifier que vous avez bien configuré, activé le firewall et que vous pouvez ouvrir une nouvelle connexion ssh. Ne vérifier pas simplement avec une requête HTTPS (un site ou autre) les connexions ne se ferment pas nécessairement immédiatement.
Assurez-vous de bien configurer, sous peine de ne plus avoir acces à votre serveur.

# bloque toutes les connexions entrantes
sudo ufw default deny incoming

# on autorise les connexions sortantes
sudo ufw default allow outgoing

# on autorise SSH port par défaut
# sudo ufw allow ssh
# ou SSH port personalisé
sudo ufw allow 2024/tcp

# on active le par-feu et ON VERIFIE QUE L'ON PEUT OUVRIR UN AUTRE TUNEL SSH
sudo ufw enable

> Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
> Firewall is active and enabled on system startup

A partir de là, vous autorisez ensuite suivant vos services/besoins.
Exemple, pour nginx:

sudo ufw allow 'Nginx Full'

Les profiles

UFW dispose de plusieurs profiles d'applications pour les services communs: web, mail, DNS...

Pour avoir la liste complète:

sudo ufw app list

Afficher les détails d'un profile:

sudo ufw app info <nom_de_l_application>

Par exemple on peut autoriser Nginw sur le port 80 (http) ou le port 443 (https) voir les deux:

#autoriser Nginx pour HTTP
sudo ufw allow 'Nginx HTTP'

#autoriser Nginx pour HTTPS
sudo ufw allow 'Nginx HTTPS'

#autoriser Nginx pour HTTP et HTTPS
sudo ufw allow 'Nginx Full'

Cela peut être pratique pour mettre en place rapidement les premières mesures.

Les profiles se trouvent ici /etc/ufw/applications.d/
Vous pouvez même créer vos propres profils, pratique si vous avez des règles identiques qui reviennent souvent.

Exemple de profile type

[Apache]
title=Web Server
description=Apache c'est bien aussi
ports=80,443/tcp

Les règles

Pour configurer le firewall on lui indique des règles, soit pour autoriser allow, soit pour interdire deny
Ensuite, on peut choisir si on autorise/block

  • une plage de ports ou des ports spécifiques sur un protocole donné
  • une IP
  • une plage d'adresse IP - sous-réseau
  • une interface réseau
Aussi on peut spécifier un port spécifique ou non: to any port

Voici quelques exemples en allow, c'est le même principe pour deny:

# autoriser une plage de ports
sudo ufw allow 5800:6000/tcp

# autoriser des ports
sudo ufw allow 8100, 8105, 8106, 9000/udp

# autoriser une adresse IP
sudo ufw allow from _ADRESSE_IP

#autoriser une IP sur un port en particulier
sudo ufw allow from _ADRESSE_IP to any port _PORT

#autoriser une plage IP sur un port spécifique
sudo ufw allow from _ADRESSE_IP/24 to any port _PORT

#autoriser une interface réseau: exemple pour eth2
sudo ufw allow in on eth2 to any port _PORT
Pourquoi /24 pour une plage d'IPs

Exemple: 158.47.28.112/24 soit les IPs (hôtes) allant de 158.47.28.0 à 158.47.28.255

Une IPv4 c'est quatre octects séparé pars des points et chaque partie peut prendre une valeur entre 0 et 255.
La notion de sous-réseau permet de diviser une adresse IP en deux parties: IP (identifiant) correspond au réseau et l'identifiant de l'hôte dans ce réseau.
Pour l'exprimer la notation CIDR (Classless Inter-Domain Routing) est utilisé, exemple: /24
24 pour les 24 premiers bits de l'adresse IP sont utilisés pour identifier le réseau, soit 8bits (32-24=8) pour les adresses hôtes du sous-réseau.
C'est peut être plus claire avec cet

Une règle ne fonctionne pas?

Parfois on pense avoir mis en place une règle pour autoriser une connexion mais rien à faire la connexion ne passe pas.
Le premier reflexe, regarder vos règles à nouveau, sinon les logs en temps réel, histoire de voir le comportement du firewall.

# liste les règles
sudo ufw status verbose

# regarde les logs en temps réel
# exemple si le firewall block
sudo grep 'BLOCK' /var/log/ufw.log | tail -f

# on peut rechercher un port spécifique exemple:
sudo tail -f /var/log/ufw.log | grep 'DPT=443'

Infos, commandes utiles

Editer le fichier de config. de ufw

sudo nano /etc/default/ufw

Activation ufw en tant que service:

sudo systemctl enable ufw --now

Checker l'état du service, le redémarrer:

# état du service
systemctl status ufw

# restart 
sudo systemctl restart ufw

Lister les règles:

# lister les règles
sudo ufw status verbose

# lister les règles de manière concise
sudo ufw status numbered

# supprimer une règle
sudo ufw delete _numéro_de_la_règle

Activer/Désactiver, recharger les règles:

# activer le firewall
sudo ufw enable

# le désactiver
sudo ufw disable

# recharger les règles
sudo ufw reload

Autoriser une IP sur un port spécifique:

# remplacer _IP_SOURCE et _PORT
sudo ufw allow from _IP_SOURCE to any port _PORT

Conclusion

Voilà avec ça normalement on a en place un firewall, c'est du basique mais mieux que rien!.

Vous pouvez 'tester' un scan des ports ouverts: port-scan- ipvoid.com

On peut pousser plus loin les règles personalisées via les user.rules. ou appliquer des règles avant ou après les commandes ufw.
Je n'ai pas cette expertise pour le moment , je vous laisse faire vos recherches

Voici les principales sources utilisées qui m'ont aidé à mettre en place ufw: