Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| pratique:informatique:parefeu:reaction [15/06/2026 07:41] – [Concepts] Zatalyz | pratique:informatique:parefeu:reaction [16/06/2026 12:25] (Version actuelle) – Zatalyz | ||
|---|---|---|---|
| Ligne 83: | Ligne 83: | ||
| ===== Installation et lancement automatique ===== | ===== Installation et lancement automatique ===== | ||
| - | Pour l' | + | Pour l' |
| < | < | ||
| - | wget https:// | + | wget https:// |
| - | | + | wget https:// |
| - | minisign -VP RWSpLTPfbvllNqRrXUgZzM7mFjLUA7PQioAItz80ag8uU4A2wtoT2DzX -m reaction_1.4.1-1_amd64.deb | + | minisign -VP RWSpLTPfbvllNqRrXUgZzM7mFjLUA7PQioAItz80ag8uU4A2wtoT2DzX -m reaction_1.4.1-1_amd64.deb |
| - | rm reaction_1.4.1-1_amd64.deb.minisig | + | rm reaction_1.4.1-1_amd64.deb.minisig |
| - | sudo apt install ./ | + | sudo apt install ./reaction_1.4.1-1_amd64.deb |
| + | rm reaction_1.4.1-1_amd64.deb | ||
| </ | </ | ||
| Ensuite on crée le ou les fichiers de config, et on les bidouillent. Voir plus bas la/les confs. | Ensuite on crée le ou les fichiers de config, et on les bidouillent. Voir plus bas la/les confs. | ||
| sudo mkdir / | sudo mkdir / | ||
| - | sudo nano / | + | sudo nano / |
| ==== Démarrage automatique ==== | ==== Démarrage automatique ==== | ||
| Ligne 107: | Ligne 108: | ||
| </ | </ | ||
| - | <WRAP center round info 100%> | ||
| Avec la version 2 il y a un à présent un service systemd déjà fourni. Il se trouve sur / | Avec la version 2 il y a un à présent un service systemd déjà fourni. Il se trouve sur / | ||
| - | |||
| - | Je laisse La vieille doc "pour mémoire" | ||
| - | </ | ||
| Après installation et vérification, | Après installation et vérification, | ||
| Ligne 122: | Ligne 119: | ||
| <WRAP center round alert 100%> | <WRAP center round alert 100%> | ||
| + | <WRAP center round info 100%> | ||
| + | Je laisse la vieille doc "pour mémoire" | ||
| + | </ | ||
| + | |||
| Je vais créer deux services : un pour Reaction proprement dit, un pour avertir en cas de plantage. Vu que j'ai eu des plantages muets, je lui dis de se relancer si ça lui arrive((Je précise que ça date des premières versions du logiciel, qui a bien évolué depuis.)) et sinon, j'ai une alerte. | Je vais créer deux services : un pour Reaction proprement dit, un pour avertir en cas de plantage. Vu que j'ai eu des plantages muets, je lui dis de se relancer si ça lui arrive((Je précise que ça date des premières versions du logiciel, qui a bien évolué depuis.)) et sinon, j'ai une alerte. | ||
| Ligne 188: | Ligne 189: | ||
| - | ==== Envoyer un mail en cas de plantage ==== | + | |
| Ligne 209: | Ligne 210: | ||
| === server.jsonnet === | === server.jsonnet === | ||
| Ici c'est assez classique, le seul point important étant que je tourne avec nftables. Il peut être utile de spécifier les ip à ne pas bannir avec Reaction, couplé avec un fichier [[pratique: | Ici c'est assez classique, le seul point important étant que je tourne avec nftables. Il peut être utile de spécifier les ip à ne pas bannir avec Reaction, couplé avec un fichier [[pratique: | ||
| + | |||
| + | Sur un pare-feu, l' | ||
| + | |||
| + | <code bash nftables.conf_ou_autre> | ||
| + | set reaction_v4 { | ||
| + | type ipv4_addr | ||
| + | flags interval | ||
| + | } | ||
| + | set reaction_v6 { | ||
| + | type ipv6_addr | ||
| + | flags interval | ||
| + | } | ||
| + | chain input_all { | ||
| + | # Par défaut, on rejette tout à moins de suivre une des règles ci-dessous. | ||
| + | type filter hook input priority 0; policy drop; | ||
| + | |||
| + | # Vérifie si l'IP est bloquée (du plus long au plus court) | ||
| + | # ... Durablement | ||
| + | ip saddr @blocklist_v4 drop | ||
| + | ip6 saddr @blocklist_v6 drop | ||
| + | # ... Par Reaction | ||
| + | ip saddr @reaction_v4 drop | ||
| + | ip6 saddr @reaction_v6 drop | ||
| + | # Ou dans la liste temporaire | ||
| + | ip saddr @tempblock_v4 drop | ||
| + | ip6 saddr @tempblock_v6 drop | ||
| + | # [...] | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | De ce fait, je ne crée pas les sets à la volée au démarrage de Reaction (l' | ||
| + | |||
| + | Les patterns des ip sont à présent dans le logiciel (depuis la version 2.0?) ce qui rend certaines déclarations plus rapides. Notons aussi l' | ||
| <code json server.jsonnet> | <code json server.jsonnet> | ||
| Ligne 214: | Ligne 248: | ||
| patterns: { | patterns: { | ||
| ip: { | ip: { | ||
| - | // Both IPv4 and IPv6, do not accept malformed IPs | + | // IPv4 et IPv6, et masque des ipv6. |
| - | | + | |
| + | ipv6mask: 64, | ||
| ignore: [ | ignore: [ | ||
| + | // Ne pas bannir les ip des sysadmins et sur le local | ||
| // Ne pas oublier la virgule après chaque ip, pour l' | // Ne pas oublier la virgule après chaque ip, pour l' | ||
| ' | ' | ||
| ':: | ':: | ||
| // Sous-réseau d'une box | // Sous-réseau d'une box | ||
| - | ' | + | ' |
| // Sous-réseau proxmox ? | // Sous-réseau proxmox ? | ||
| - | //' | + | //' |
| - | // Ip fixes de sysadmins | + | // Ip fixes de sysadmins |
| - | // ip de bastion | + | ], |
| + | }, | ||
| + | ipmask: { | ||
| + | | ||
| + | type: 'ip', | ||
| + | // ipv4 : 24 = tout le dernier bit, soit toute ip du type a.b.c.* (tout est dans le joker). | ||
| + | ipv4mask: 24, | ||
| + | // ipv6 : 48 = ban des datacenters. 56 est un peu moins excessif. 64 est une norme de particulier. | ||
| + | ipv6mask: 56, | ||
| + | ignore: [ | ||
| + | ' | ||
| + | ':: | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| ], | ], | ||
| }, | }, | ||
| }, | }, | ||
| - | | + | // nftables est directement paramétré avec des tables/sets pour Reaction, histoire que ce soit au bon endroit dans la chaine. |
| - | [' | + | |
| - | table inet reaction { | + | |
| - | set ipv4bans { | + | |
| - | type ipv4_addr | + | |
| - | flags interval | + | |
| - | auto-merge | + | |
| - | } | + | |
| - | set ipv6bans { | + | |
| - | type ipv6_addr | + | |
| - | flags interval | + | |
| - | auto-merge | + | |
| - | } | + | |
| - | chain input { | + | |
| - | type filter hook input priority 0 | + | |
| - | policy accept | + | |
| - | ip saddr @ipv4bans drop | + | |
| - | ip6 saddr @ipv6bans drop | + | |
| - | } | + | |
| - | } | + | |
| - | ||| ], | + | |
| - | | + | |
| stop: [ | stop: [ | ||
| - | [' | + | [' |
| + | [' | ||
| ], | ], | ||
| } | } | ||
| Ligne 264: | Ligne 296: | ||
| On peut ainsi définir des actions par défaut : combien de temps on bannit, combien de lignes dans les logs avant de bannir, etc. Cela permet par exemple de définir pour tout le monde la même durée de bannissement et de la changer à un seul endroit si besoin. | On peut ainsi définir des actions par défaut : combien de temps on bannit, combien de lignes dans les logs avant de bannir, etc. Cela permet par exemple de définir pour tout le monde la même durée de bannissement et de la changer à un seul endroit si besoin. | ||
| - | Le fait que le fichier commence par " | + | Le fait que le fichier commence par " |
| + | |||
| + | Mon " | ||
| + | |||
| + | Je n' | ||
| <code json _lib.jsonnet> | <code json _lib.jsonnet> | ||
| - | local banFor(time) = { | + | local banFor(time, name) = { |
| - | ban: { | + | |
| - | cmd: ['nft46', 'add element inet reaction ipvXbans | + | cmd: ['nft', 'add', 'element', 'inet', ' |
| - | }, | + | |
| - | unban: { | + | |
| - | cmd: ['nft46', ' | + | |
| - | after: time, | + | cmd: [' |
| - | }, | + | ipv6only: true, |
| + | | ||
| + | unban_v4: { | ||
| + | after: time, | ||
| + | | ||
| + | ipv4only: true, | ||
| + | | ||
| + | unban_v6: { | ||
| + | | ||
| + | cmd: [' | ||
| + | ipv6only: true, | ||
| + | }, | ||
| + | log: { | ||
| + | cmd: ['/ | ||
| + | oneshot: true, | ||
| + | | ||
| }; | }; | ||
| // retry et retryperiod sont quand il y a plusieurs tentatives autorisées | // retry et retryperiod sont quand il y a plusieurs tentatives autorisées | ||
| - | // juste mettre le banFor sinon... | + | // juste mettre le banFor sinon... Le ban sera alors à la première tentative. |
| // Filtre (et options) par défaut : ni trop doux, ni trop cruel. | // Filtre (et options) par défaut : ni trop doux, ni trop cruel. | ||
| local filter_default = { | local filter_default = { | ||
| retry: 3, | retry: 3, | ||
| - | retryperiod: | + | retryperiod: |
| - | actions: banFor(' | + | actions: banFor(' |
| }; | }; | ||
| - | // Filtre doux : c'est peut-être légitime. Et peut-être pas. | + | // Filtre doux : c'est peut-être légitime. Et peut-être pas. Ça délaye les attaques. |
| local filter_soft = { | local filter_soft = { | ||
| retry: 6, | retry: 6, | ||
| - | retryperiod: | + | retryperiod: |
| - | actions: banFor(' | + | actions: banFor(' |
| }; | }; | ||
| // Filtre violent : un seul essai, banni un mois. | // Filtre violent : un seul essai, banni un mois. | ||
| local filter_hard = { | local filter_hard = { | ||
| - | actions: banFor(' | + | actions: banFor(' |
| }; | }; | ||
| - | local stream_name(name) ={ | ||
| - | reason: { | ||
| - | cmd: [' | ||
| - | }, | ||
| - | }; | ||
| // Exposer les définitions précédentes pour qu' | // Exposer les définitions précédentes pour qu' | ||
| Ligne 311: | Ligne 357: | ||
| filter_soft: | filter_soft: | ||
| filter_hard: | filter_hard: | ||
| - | stream_name: | ||
| } | } | ||
| + | |||
| </ | </ | ||
| + | == Script bash de log, notif, etc == | ||
| + | Un script très basique pour " | ||
| + | * les ips bloquées en longue durée (celles qui reviennent plusieurs fois via les filtres doux et par défaut : 6 fois c'est peut-être une erreur, 12 c'est de la maladresse, 24 c'est de l' | ||
| + | * les ips en bloc (ipmask). Ce n'est pas du tout paramétré pour le moment ! | ||
| + | Le format actuel de mon log n'est sans doute pas parfait pour ça, mais s' | ||
| + | <code bash _ban.sh> | ||
| + | #!/bin/bash | ||
| + | # Envoi d'un mail ou notif ou ce qu'on veut | ||
| + | # Log des ip | ||
| + | echo "$1 banni car $2 // Date : $(date)" | ||
| + | </ | ||
| === Streams === | === Streams === | ||
| - | Je met ici une config très basique pour ssh (<wrap todo> | + | Je met ici une config très basique pour ssh (voir [[https:// |
| + | |||
| + | <WRAP center round tip 100%> | ||
| + | [[https:// | ||
| + | </ | ||
| <code json ssh.jsonnet> | <code json ssh.jsonnet> | ||
| Ligne 328: | Ligne 389: | ||
| cmd: [' | cmd: [' | ||
| filters: { | filters: { | ||
| - | | + | |
| + | regex: [ | ||
| + | @'User root from <ip> not allowed because not listed in AllowUsers', | ||
| + | ], | ||
| + | // ce filtre est peu pertinent avec sshguard et va le ralentir dans sa lutte contre les méchants. | ||
| + | failedlogin: | ||
| regex: [ | regex: [ | ||
| @' | @' | ||
| Ligne 336: | Ligne 402: | ||
| retry: 3, | retry: 3, | ||
| retryperiod: | retryperiod: | ||
| - | actions: lib.banFor(' | + | actions: lib.banFor(' |
| }, | }, | ||
| }, | }, | ||
| Ligne 360: | Ligne 426: | ||
| [...] | [...] | ||
| </ | </ | ||
| + | |||
| Ici '' | Ici '' | ||
| ==== Réaliser des actions plus compliqués ==== | ==== Réaliser des actions plus compliqués ==== | ||
| + | <WRAP center round tip 60%> | ||
| + | Ce qui suit est plus pour retrouver comment faire au besoin, mais la configuration précédente (log, sans mail en plus, intégré à banFor) me semble suffisante en général. | ||
| + | </ | ||
| + | |||
| Lorsqu' | Lorsqu' | ||
| Ligne 453: | Ligne 524: | ||
| </ | </ | ||
| - | {{tag> | + | ===== Transformer les règles de fail2ban ===== |
| + | Ça c'est du chantier... | ||
| + | |||
| + | Quand on a fail2ban installé, retrouver les regex est un sacré bazar. Il n'y a pas de solution " | ||
| + | |||
| + | fail2ban-client -d | ||
| + | Celle-ci va lister toutes les règles actives, dans un format permettant de voir quel fichier de log est surveillé et divers détails. C'est assez verbeux, mais utile. | ||
| + | |||
| + | fail2ban-client get JAIL failregex | ||
| + | Remplacer " | ||
| + | |||
| + | Jails que je tente d' | ||
| + | * Apache, error.log | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Apache access.log | ||
| + | * '' | ||
| + | * Notons cependant qu'on a des badbots repérables aux user-agents et que les ban peut réduire le trafic simplement. | ||
| + | * '' | ||
| + | |||
| + | Autres services, où en théorie on va tout reprendre (plus les notres) : | ||
| + | |||
| + | * postfix | ||
| + | * dovecot | ||
| + | * sieve | ||
| + | * sshd | ||
| + | |||
| + | {{tag> | ||
| [[https:// | [[https:// | ||