Outils pour utilisateurs

Outils du site


netadmin:linux:ufw:gestion_pare-feu_ufw

UFW

UFW est l'acronyme de Uncomplicated FireWall. C'est un outil en ligne de commande simplifié permettant de configurer netfilter de façon plus intuitive qu' iptables.

Pour les machines bénéficiant d'un environnement de bureau, l'application Gufw est également disponible.

Installation

$ sudo apt install ufw

Juste après l' installation, UFW est inactif par défaut, pour consulter l'état du pare-feu:

ufw status verbose

Création des règles

Stratégies de sécurité par défaut

Les defaults policies sont les comportements adoptés par défaut par le pare-feu lorsque aucune règle déclarée précédemment n'a permis de traiter le paquet. On peut définir une stratégie ou politique par défaut pour:

  • Le trafic entrant
  • Le trafic sortant
  • Le transfert du trafic entre interfaces
# Définir le comportement par défaut
ufw default deny incoming
ufw default allow outgoing
ufw defaul deny routed
Pour que le routage entre interfaces fonctionne, il faut également modifier le paramétrage du noyau (autoriser l'IP forwarding).

Applications

Certaines applications fonctionnent en réseau et intègrent dans leur paquetage d'installation les fichiers de configurations permettant la définition des règles de filtrage par UFW.

Pour lister les configurations d'applications disponibles:

ufw app list

Pour afficher les détails de configuration liés à une application précédemment listée:

ufw app info "OpenSSH"

Pour activer la configuration liée à une application disponible, par exemple OpenSSH:

ufw allow "OpenSSH"

Autoriser explicitement les services locaux accessibles de l'extérieur

# Autoriser les connexions extérieures sur un port en TCP ou UDP
ufw allow 53
 
# ouverture en UDP seulement
ufw allow 53/udp
 
#ouverture en tcp seulement
ufw allow 53/tcp

A la place du port on peut spécifier un nom de service s'il est bien renseigné dans le fichier /etc/services

ufw allow smtp

Par défaut UFW applique la règle à toutes les interfaces disponibles. Pour restreindre l'application de la règle on peut désigner une interface:

# Autorise le traffic sortant de l'interface Ethernet enp0s31f6 à destination de la machine 192.168.0.35 sur le port 8000
ufw allow out on enp0s31f6 proto tcp to 192.168.0.35 port 8000

Blocage global d'une IP

Si l'on souhaite refuser une IP sur tous les services, il faut introduire une règle “avant” les autorisations existantes. On utilise alors insert 1 qui place cette règle “DENY” avant toutes les autorisations.

ufw insert 1 deny from [ip_address]

ICMP

Si la politique par défaut refuse les connexions sortantes, la commande ping (basée sur ICMP) ne sera plus autorisée. le CLI ufw ne permet pas de définir des règles pour le protocole icmp. Pour y remédier, on peut éditer le fichier /etc/ufw/before.rules (en root) et ajoutez ces lignes:

# icmp codes allowed for output
-A ufw-before-output -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-output -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-output -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-output -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-output -p icmp --icmp-type echo-request -j ACCEPT 

Si l'on souhaite journaliser le trafic sortant:

# icmp logged and allowed for output
-A ufw-before-output -p icmp -m state --state NEW -j ufw-logging-allow
-A ufw-before-output -p icmp -m state --state NEW -j ACCEPT

Pour prendre en compte les modifications apportées, recharger les règles:

ufw reload

IP Forwarding

Par défautle transfert des paquets entre interfaces (IP Forwarding) n'est pas actif. Pour permettre à l’hôte d'agir comme une passerelle ou un routeur il faut le configurer spécifiquement.

Modifier le fichier /etc/ufw/sysctl.conf et dé-commenter les lignes 10 à 12

  9 # Uncomment this to allow this host to route packets between interfaces
 10 #net/ipv4/ip_forward=1
 11 #net/ipv6/conf/default/forwarding=1
 12 #net/ipv6/conf/all/forwarding=1

Après modification du fichier, relancer le service UFW:

systemctl restart ufw.service

Journalisation

UFW supporte la journalisation par règle. Par défaut aucune journalisation n'est associée mais si l'argument log est ajouté, toute nouvelle connexion sera tracée et si l'argument log-all est utilisé, tout paquet correspondant à la règle sera journalisé.

Si la journalisation n'est pas activée, l'activer correspond à placer le niveau de journalisation à “low”

ufw logging on
 
# equivalent
ufw logging low

Les niveaux disponibles:

off Désactive la journalisation
low log des paquets bloqués ne correspondant pas à la politique par défaut et les paquets.
medium
high
full

C'est le service rsyslog qui se charge d'écrire les événements dans le fichier /var/log/ufw.log voir la configuration présente dans /etc/rsyslog.d/20-ufw.conf

20-ufw.conf
# Log kernel generated UFW log messages to file
:msg,contains,"[UFW " /var/log/ufw.log
 
# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging kernel generated UFW log messages to the file
# normally containing kern.* messages (eg, /var/log/kern.log)
& stop

La rotation des journaux est effectuées par logrotate.

Si le fichier ufw.log reste vide après rotation et que le fichier archive continue a être alimenté, voir note log vide après rotation.

Créer des règles générant des traces

On utilise pour ça le mot clé log juste après les interfaces:

# Refuser et journaliser les tentatives de connexion sur le port 80 (web)
ufw deny in log 80 comment "refus connexion sur port http"

Les événements produits le système de log d'UFW ont une priorité warning.

confère remarque https://serverfault.com/questions/978920/change-logging-priority-of-ufw

La priorité associée aux événements journalisés ne peut pas être modifiée directement via la commande ufw cependant les règles produites sont enregistrée dans les fichiers /etc/ufw/user.rules et /etc/ufw/user6.rules. On peut modifier/substituer les règles produites. Par exemple ici avec la commande de substitution sous vim:

:%s/-j LOG --log-prefix "\[UFW ALLOW\] "/-j LOG --log-level info --log-prefix "\[UFW ALLOW\] "/g

Une fois les modifications apportées au fichier, recharger

ufw reload

Spécificités liées à l'usage de Docker

Docker creates an iptables chain called DOCKER-USER, this is where users can add their own filtering logic, this gets run before port forwarding rules. The above command puts a jump rule fro, DOCKER-USER to ufw-user-input, which means anything that hits DOCKER-USER (which should be anything Docker related) will get passed along to the ufw-user-forward chain which is where ufw rules should go.

sudo iptables -I DOCKER-USER -j ufw-user-forward

Exemples

Rejeter et journaliser toute tentative de connexion entrante sur le port 21 (service ftp). Ici on souhaite insérer cette nouvelle règle en deuxième position:

ufw insert 2 reject in log ftp comment "Rejet des connexions entrantes sur port FTP"

Autoriser et journaliser les requêtes DNS sortantes:

sudo ufw insert 1 allow out log to any port 53 comment "Autorise trafic DNS sortant"

Autoriser et journaliser le trafic WEB sortant:

ufw allow out log proto tcp from any to any port 80,443 comment "Autorise le trafic WEB sortant"
# autorise imap secure
ufw allow out log imaps
 
# autorise et log le trafic VNC sortant
ufw allow out on enp0s31f6 log proto tcp from any to any port 5900 comment 'Allow remote helpdesk VNC'
 
# autorise et log trafic RDP
ufw allow out on enp0s31f6 log proto tcp from any to any port 3389 comment 'Allow remote desktop RDP'

Autoriser et journaliser l'accès au service SSH depuis l'interface wan

ufw allow in on wan log proto tcp from any to any port 22 comment "Autorise les connexions SSH depuis le WAN"

Création d'une règle de “forwarding” (transmission de paquets entre interfaces). Dans cet exemple on autorise le transfert du trafic web (ports 80/tcp et 443/tcp) provenant de la machine d'adresse IP 192.168.33.10 par l'interface “ap” (Access Point) en direction de l'interface wan (Wide Area Network):

ufw route allow in on ap out on wan log proto tcp from 192.168.33.10 to any port 80,443 comment "Autorise le trafic web pour laptop"

Intégration de règles à critères complexes

UFW est une interface simplifiée qui facilite la déclaration des règles usuelles simples mais ne permet pas la saisie de règles intégrant des critères plus complexes. Pour cela il faudra continuer d'utiliser le CLI iptables et intégrer les commandes au framework ufw.

La documentation du fonctionnement du framework ufw est disponible dans le manuel:

man ufw-framework

Le dossier /etc/ufw contient les fichiers de configuration dans lesquels les règles complexes spécifiques utilisant la syntaxe iptables pourront être définies afin d'être correctement rechargées par UFW lors de l'arrêt/redémarrage du service:

  • Le fichier /etc/ufw/before.rules contiendra la définition de règles spécifiques devant être évaluées par netfilter avant celles crées par le CLI ufw. Les commentaires présents dans ce fichier conseillent d'insérer ces règles dans une des chaînes prévues à cet effet: ufw-before-input, ufw-before-output, ou ufw-before-forward.
  • Le fichier /etc/ufw/after.rules contiendra la définition de règles spécifiques évaluées par netfilter après celles crées par le CLI ufw. Les commentaires présents dans ce fichier conseillent d'insérer ces règles dans une des chaines prévues a cet effet ufw-after-input, ufw-after-output, ou ufw-after-forward.

Un exemple de règle complexe ne pouvant pas utiliser directement le client ufw basée sur les ipsets est proposée dans le wiki ipset avec UFW.

Références

netadmin/linux/ufw/gestion_pare-feu_ufw.txt · Dernière modification : 2023/02/15 17:38 de yoann