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.
$ 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
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:
# Définir le comportement par défaut ufw default deny incoming ufw default allow outgoing ufw defaul deny routed
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
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]
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
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
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
# 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.
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
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
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"
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:
/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./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.