{{tag>netadmin sécurité pare-feu firewall ufw}} ====== UFW ====== **UFW** est l'acronyme de **U**ncomplicated **F**ire**W**all. 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 [[sysadmin:linux:rsyslog|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 [[sysadmin:linux:logs:rotation-des-logs-via-logrotate|logrotate]]. Si le fichier ufw.log reste vide après rotation et que le fichier archive continue a être alimenté, voir note [[sysadmin:linux:logs:rotation-des-logs-via-logrotate#ufwle_fichier_ufwlog_reste_vide_apres_rotation|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 * https://github.com/docker/for-linux/issues/690 * https://p1ngouin.com/posts/how-to-manage-iptables-rules-with-ufw-and-docker * https://github.com/chaifeng/ufw-docker#solving-ufw-and-docker-issues ===== 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 [[netadmin:linux:ufw:exemples:ufw_ipset | ipset avec UFW]]. ===== Références ===== * https://doc.ubuntu-fr.org/ufw * https://hostpresto.com/community/tutorials/install-and-configure-ufw-firewall-on-ubuntu-16-04/ * https://www.leshirondellesdunet.com/pare-feu-ufw