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 [11/06/2025 09:13] – Zatalyz | pratique:informatique:parefeu:reaction [16/06/2026 12:25] (Version actuelle) – Zatalyz | ||
|---|---|---|---|
| Ligne 7: | Ligne 7: | ||
| Et autres qualités que l' | Et autres qualités que l' | ||
| - | Faudra que je participe au wiki officiel mais en attendant je met mes idées en place ici. | + | Faudra que je participe au [[https:// |
| <WRAP center round tip 60%> | <WRAP center round tip 60%> | ||
| J' | J' | ||
| </ | </ | ||
| + | |||
| + | ===== Commandes de base ===== | ||
| + | Commandes: | ||
| + | * **'' | ||
| + | * '' | ||
| + | * Options possibles : '' | ||
| + | * Par exemple, pour un fichier '' | ||
| + | * Et un dossier : '' | ||
| + | * Dans le cas des dossiers, les seuls fichiers du dossier qui seront lus automatiquement | ||
| + | * Doivent se terminer par les extensions '' | ||
| + | * Ne doivent pas démarrer par '' | ||
| + | * **'' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Options possibles : '' | ||
| + | * **'' | ||
| + | * '' | ||
| + | * Options possibles : '' | ||
| + | * Débannir quelqu' | ||
| + | * **'' | ||
| + | * reaction test-regex --config < | ||
| + | * Arguments: | ||
| + | * < | ||
| + | * [LINE] | ||
| + | * Options possibles : '' | ||
| + | * **'' | ||
| + | * '' | ||
| + | * Options possibles : '' | ||
| + | * **'' | ||
| + | * **'' | ||
| + | |||
| + | Pour les options possibles (suivant les commandes) : | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ==== Les plus fréquement utilisées ==== | ||
| + | |||
| + | Voir qui est banni : | ||
| + | |||
| + | reaction show | ||
| + | |||
| + | Débannir quelqu' | ||
| + | |||
| + | reaction flush IP | ||
| + | |||
| + | Tester le dossier de configuration : | ||
| + | reaction test-config -c / | ||
| + | |||
| + | Démarrer (sans systemd) : | ||
| + | reaction start -c / | ||
| + | |||
| + | ==== Base de donnée ==== | ||
| + | |||
| + | Par défaut les bases de données sont dans ''/ | ||
| + | |||
| + | Si on lance avec la commande dans le terminal, ces deux fichiers sont là où on lance la commande (je crois, j'ai un doute... en tout cas j' | ||
| + | ===== Concepts ===== | ||
| + | * Patterns : mots-clés utilisés ensuite au sein des expressions régulières pour " | ||
| + | * Streams : équivalent des jails de fail2ban. On va par exemple déclarer " | ||
| + | * Filters : groupe d' | ||
| + | * Trigger : conditions, quand l' | ||
| + | * Actions : ce qui est exécuté quand le filter est déclenché. Par exemple, bannir. Le cœur du logiciel ! | ||
| + | * Start/Stop : commandes qui seront exécuté au démarrage et à l' | ||
| + | |||
| + | La syntaxe est en jsonnet, ce qui permet d' | ||
| ===== 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 un fichier | + | Ensuite on crée le ou les fichiers |
| sudo mkdir / | sudo mkdir / | ||
| - | sudo nano / | + | sudo nano / |
| - | (voir plus bas la/les confs). | + | |
| - | | + | ==== Démarrage automatique ==== |
| + | |||
| + | <WRAP center round tip 100%> | ||
| + | Avant de démarrer | ||
| + | | ||
| + | |||
| + | On peut aussi vérifier la syntaxe avec : | ||
| + | sudo reaction test-config -c / | ||
| + | </ | ||
| + | |||
| + | Avec la version 2 il y a un à présent un service systemd déjà fourni. Il se trouve sur /lib/ | ||
| + | |||
| + | Après installation et vérification, | ||
| + | |||
| + | < | ||
| + | sudo systemctl enable --now reaction@reaction | ||
| + | </ | ||
| + | |||
| + | Ce qui suit après le @ est le chemin vers la configuration dans /etc/ ; comme je lui fais lire le dossier, c'est donc juste " | ||
| + | |||
| + | <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. | ||
| + | |||
| + | |||
| + | <code bash / | ||
| + | [Unit] | ||
| + | Description=Reaction to ban bad ip | ||
| + | After=network.target | ||
| + | # Alerte si ça " | ||
| + | OnFailure=reaction-alert.service | ||
| - | < | ||
| [Install] | [Install] | ||
| WantedBy=multi-user.target | WantedBy=multi-user.target | ||
| + | |||
| [Service] | [Service] | ||
| - | ExecStart=/ | + | ExecStart=/ |
| StateDirectory=reaction | StateDirectory=reaction | ||
| RuntimeDirectory=reaction | RuntimeDirectory=reaction | ||
| - | WorkingDirectory=/ | + | WorkingDirectory=/ |
| Restart=on-failure | Restart=on-failure | ||
| RestartSec=3 | RestartSec=3 | ||
| + | # Anti-flood de redémarrage en boucle | ||
| + | StartLimitIntervalSec=400 | ||
| + | StartLimitBurst=3 | ||
| </ | </ | ||
| - | Vu que j'ai eu des plantages muets, je lui dis de se relancer si ça lui arrive. | + | <code bash / |
| + | [Unit] | ||
| + | Description=Envoie une alerte si Reaction plante | ||
| - | Et puis on y lance : | + | [Service] |
| - | < | + | Type=oneshot |
| - | sudo service reaction start</ | + | ExecStart=/ |
| + | </ | ||
| - | <WRAP center round tip 100%> | + | Et le script pour envoyer un mail (ça aurait pu être autre chose, mais j'aime bien les mails). |
| - | Mais avant de démarrer | + | < |
| - | sudo reaction start -c /etc/reaction/server.jsonnet | + | #!/bin/bash |
| - | </ | + | LOCKFILE="/ |
| + | # Délai en minutes, donc 3 h = 180 | ||
| + | DELAY=180 | ||
| - | ===== Commandes | + | # Si une alerte a déjà été envoyée il y a moins de $DELAY, on quitte |
| - | Voir qui est banni : | + | if [ -e " |
| - | reaction | + | |
| + | exit 0 | ||
| + | fi | ||
| - | Débannir quelqu' | + | touch " |
| - | reaction | + | |
| + | SUBJECT=" | ||
| + | TO=" | ||
| + | BODY=" | ||
| + | Arrêt à $(date). | ||
| + | " | ||
| + | |||
| + | echo " | ||
| + | logger -t reaction-alert " | ||
| + | |||
| + | </ | ||
| + | |||
| + | On démarre le service | ||
| + | < | ||
| + | sudo service reaction start</ | ||
| + | </ | ||
| - | Consulter l'aide : | ||
| - | reaction --help | ||
| - | Par défaut les bases de données sont dans ''/ | ||
| Ligne 73: | Ligne 197: | ||
| * Découpage de la configuration par services (pour faciliter certaines automatisations) | * Découpage de la configuration par services (pour faciliter certaines automatisations) | ||
| * Analyse des ip bannies pour en déduire des plages et bannir ces dernières ? | * Analyse des ip bannies pour en déduire des plages et bannir ces dernières ? | ||
| - | * Rapport (journalier ?) sur les ip bannies (histoire de pouvoir suivre ce qui se passe et la charge) | + | * Rapport (journalier ?) sur les ip bannies (histoire de pouvoir suivre ce qui se passe et la charge) |
| - | <WRAP center round todo 100%> | + | Point côté syntaxe : dans les noms, on peut utiliser le tiret bas, mais pas de tiret classique, ça va faire des erreurs car jsonnet l' |
| - | Ce qui est ici date des premières versions | + | ==== Découpage |
| + | Il s' | ||
| + | * Définitions : ce qu'est l' | ||
| + | * '' | ||
| + | * Les fichiers de stream ('' | ||
| - | ==== Envoyer des mails quand il y a une action ==== | + | On paramètre évidement le lancement de Reaction (avec service ou direct en ligne de commande) pour lire tout le contenu du dossier (ici / |
| - | J'ai une commande qui va envoyer un mail via un script, en ayant en paramètre deux variables : '' | + | |
| - | < | + | === 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: |
| - | | + | |
| + | Sur un pare-feu, l'ordre des règles a une importance((Même si la façon dont ça s'applique est parfois complexe à comprendre.)), | ||
| + | |||
| + | <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 | ||
| + | |||
| + | Les patterns des ip sont à présent dans le logiciel | ||
| + | |||
| + | < | ||
| + | { | ||
| + | | ||
| + | | ||
| + | // IPv4 et IPv6, et masque des ipv6. | ||
| + | type: ' | ||
| + | ipv6mask: 64, | ||
| + | ignore: [ | ||
| + | // Ne pas bannir les ip des sysadmins et sur le local | ||
| + | // Ne pas oublier la virgule après chaque ip, pour l'énumération ;) | ||
| + | ' | ||
| + | | ||
| + | | ||
| + | ' | ||
| + | | ||
| + | //'10.0.0.0/8', | ||
| + | // Ip fixes de sysadmins et/ou des bastions à ajouter. | ||
| + | ], | ||
| + | }, | ||
| + | ipmask: { | ||
| + | // Uniquement utilisé pour les filtres les plus aggressifs, risque de trop ban sinon ! | ||
| + | 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. | ||
| + | start: [], | ||
| + | // Je flush le set au stop, quand même. Car Reaction les renvoie au redémarrage ; évite les doublons. | ||
| + | stop: [ | ||
| + | [' | ||
| + | [' | ||
| + | ], | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | === _lib.jsonnet : actions par défaut === | ||
| + | Ce fichier sert à définir les actions telles que " | ||
| + | |||
| + | 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 " | ||
| + | |||
| + | Mon " | ||
| + | |||
| + | Je n' | ||
| + | |||
| + | <code json _lib.jsonnet> | ||
| + | local banFor(time, | ||
| + | ban_v4: { | ||
| + | cmd: [' | ||
| + | ipv4only: true, | ||
| + | }, | ||
| + | ban_v6: { | ||
| + | cmd: [' | ||
| + | ipv6only: true, | ||
| + | }, | ||
| + | unban_v4: { | ||
| + | after: time, | ||
| + | cmd: [' | ||
| + | ipv4only: true, | ||
| + | }, | ||
| + | unban_v6: { | ||
| + | after: time, | ||
| + | cmd: [' | ||
| + | ipv6only: true, | ||
| + | }, | ||
| + | log: { | ||
| + | cmd: ['/ | ||
| + | oneshot: true, | ||
| + | }, | ||
| }; | }; | ||
| + | |||
| + | // retry et retryperiod sont quand il y a plusieurs tentatives autorisées | ||
| + | // 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. | ||
| + | local filter_default = { | ||
| + | retry: 3, | ||
| + | retryperiod: | ||
| + | actions: banFor(' | ||
| + | }; | ||
| + | |||
| + | // Filtre doux : c'est peut-être légitime. Et peut-être pas. Ça délaye les attaques. | ||
| + | local filter_soft = { | ||
| + | retry: 6, | ||
| + | retryperiod: | ||
| + | actions: banFor(' | ||
| + | }; | ||
| + | |||
| + | // Filtre violent : un seul essai, banni un mois. | ||
| + | local filter_hard = { | ||
| + | actions: banFor(' | ||
| + | }; | ||
| + | |||
| + | |||
| + | // Exposer les définitions précédentes pour qu' | ||
| + | { | ||
| + | banFor: banFor, | ||
| + | filter_default: | ||
| + | filter_soft: | ||
| + | filter_hard: | ||
| + | } | ||
| + | |||
| </ | </ | ||
| - | Le script : | + | == Script |
| - | < | + | Un script très basique pour "loguer" |
| - | # Envoyer un mail | + | * les ips bloquées en longue durée (celles |
| - | dossiermail="/ | + | * les ips en bloc (ipmask). Ce n'est pas du tout paramétré pour le moment ! |
| - | titremail="$1 banni" | + | Le format actuel de mon log n'est sans doute pas parfait pour ça, mais s' |
| - | # Création du fichier du corps du mail dans un fichier temporaire | + | |
| - | corpmail=" | + | |
| - | listeip="/ | + | |
| - | # Vérifier si l'adresse a déjà été banni pour éviter de flooder lorsqu' | + | <code bash _ban.sh> |
| - | if grep -q $1 $listeip; then | + | #!/ |
| - | exit | + | # Envoi d'un mail ou notif ou ce qu' |
| - | else | + | # Log des ip |
| - | | + | echo " |
| - | echo "Méchant | + | </ |
| - | # Ajouter les logs pour les détails | + | |
| - | journalctl --since yesterday | grep $1 >> $corpmail | + | |
| - | #Envoyer le mail | + | |
| - | cat $corpmail | mail -s " | + | |
| - | # Effacer le corps du crime pour éviter d' | + | |
| - | rm $corpmail | + | |
| - | fi</ | + | |
| - | Penser évidement à créer les dossiers '' | + | === Streams === |
| + | Je met ici une config très basique pour ssh (voir [[https://port.numenaute.org/zatalyz/zscript-sysadmin/src/branch/main/files/ | ||
| - | Plus loin dans le fichier | + | <WRAP center round tip 100%> |
| - | < | + | [[https:// |
| + | </ | ||
| + | |||
| + | < | ||
| + | local lib = import ' | ||
| + | { | ||
| + | | ||
| ssh: { | ssh: { | ||
| - | cmd: [' | + | cmd: [' |
| filters: { | filters: { | ||
| + | badssh: lib.filter_default + { | ||
| + | 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: | failedlogin: | ||
| regex: [ | regex: [ | ||
| Ligne 124: | Ligne 400: | ||
| @' | @' | ||
| ], | ], | ||
| - | retry: | + | retry: |
| retryperiod: | retryperiod: | ||
| - | actions: banFor(' | + | actions: |
| }, | }, | ||
| }, | }, | ||
| }, | }, | ||
| + | }, | ||
| + | } | ||
| </ | </ | ||
| - | ==== Actions par défaut ==== | + | * '' |
| - | On peut créer des actions | + | * '' |
| + | * '' | ||
| - | Ce n'est pas forcément pertinent pour tout, par exemple | + | Concernant l'appel des diverses fonctions, il y a plein de petites subtilités. Par exemple, si on veut appliquer les actions par défaut (même durée de ban, même valeurs |
| - | On déclare la commande : | ||
| < | < | ||
| - | local filter_default | + | [...] |
| - | retry: 3, | + | apache_auth: |
| - | | + | regex: [ |
| - | | + | @'^.*client < |
| - | }; | + | ], |
| - | </ | + | |
| - | + | ||
| - | Et dans les streams, on l' | + | |
| - | < | + | |
| - | { | + | |
| - | streams: { | + | |
| - | ssh: { | + | |
| - | filters: { | + | |
| - | failedlogin: | + | |
| - | | + | |
| }, | }, | ||
| - | }, | + | [...] |
| - | }, | + | |
| - | }, | + | |
| - | } | + | |
| </ | </ | ||
| - | ==== Découper la configuration ==== | ||
| - | On peut tout mettre dans un seul fichier, moi j'aime bien séparer pour m'y retrouver. Faut avouer que je prévois max de regex à un moment, et max de services couverts aussi. | ||
| + | Ici '' | ||
| + | ==== 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' | ||
| - | Dans le fichier principal, on peut appeler un autre fichier avec cette syntaxe : | + | Bon, en vrai, ça dépend. Sur certains services, la surveillance via des mails, au début, permet d'affiner les règles et éviter les faux positifs. Ensuite, ça fait surtout du bruit. Il devient alors plus utile de loguer les ip bannies, et de vérifier s'il y a des schémas : même plages d'ip par exemple. Ou ip qui continuent d' |
| - | < | + | |
| - | streams: { | + | |
| - | ssh: import 'ssh.jsonnet', | + | |
| - | }, | + | |
| - | }</ | + | |
| - | et '' | + | Bref, tout ça va se faire via notre fichier _lib.jsonnet, |
| - | <WRAP center round todo 60%> | + | === Lancer un script === |
| - | Mais j'ai du manquer | + | Si on veut bannir ET réaliser une action autre dans la foulée (par exemple envoyer |
| - | </ | + | |
| - | ==== Mes bouts de stream et de config ==== | + | < |
| - | Fichier principal | + | #!/bin/bash |
| - | < | + | # Bannissement |
| - | // This file is using JSONNET, a complete configuration language based on JSON // See https:// | + | nft46 add element inet reaction ipvXbans { " |
| - | // action pour bannir/ | + | |
| + | # Envoi d'un mail | ||
| + | # cf le script plus bas... | ||
| + | </code> | ||
| + | |||
| + | On modifie alors _lib.jsonnet sur la partie cmd : | ||
| + | <code json _lib.jsonnet> | ||
| local banFor(time) = { | local banFor(time) = { | ||
| ban: { | ban: { | ||
| - | cmd: ['ip46tables', | + | cmd: ['nft46', 'add element inet reaction |
| - | }, | + | } |
| - | | + | </ |
| - | after: time, | + | devient |
| - | cmd: ['ip46tables', '-w', '-D', 'reaction' | + | <code json _lib.jsonnet> |
| - | }, | + | local banFor(time) = { |
| - | }; | + | |
| + | cmd: ['sh', '-c', '/ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Ce qui autorise toutes les fantaisies. | ||
| + | |||
| + | === Action : envoi de mail === | ||
| + | On peut aussi déclarer une action spéciale pour l'envoi de mail, ce qui permet de l'appeler dans les streams et de personnaliser le message en rapport avec le filtre déclenché. | ||
| + | |||
| + | Le script suivant prend deux variables : '' | ||
| - | // Envoyer un mail lors des actions et précisant ip et raison | + | <code json _lib.jsonnet> |
| - | local sendmail(ip, | + | |
| mail: { | mail: { | ||
| - | cmd: [' | + | cmd: [' |
| }, | }, | ||
| }; | }; | ||
| + | </ | ||
| - | // pourquoi ça ouvre ici ? Mais, ça marche. | + | Le script : |
| - | { | + | < |
| - | // patterns are substitued in regexes. when a filter performs an action, it replaces the found pattern. | + | # Envoyer un mail |
| - | // reaction regex syntax is defined here: https:// | + | dossiermail=" |
| - | // jsonnet' | + | titremail=" |
| - | | + | # Création du fichier du corps du mail dans un fichier temporaire qui évite toute collision |
| - | // IPs can be IPv4 or IPv6 | + | corpmail=" |
| - | | + | listeip=" |
| - | ip: { | + | |
| - | regex: @'(([0-9]{1,3}\.){3}[0-9]{1, | + | |
| - | ignore: [' | + | |
| - | }, | + | |
| - | }, | + | |
| - | // Commandes exécutées au lancement | + | # Vérifier si l'adresse a déjà été banni pour éviter de flooder lorsqu'on relance |
| - | start: [ | + | if grep -q $1 $listeip; then |
| - | ['ip46tables', | + | |
| - | | + | else |
| - | | + | # Message pour le corps du mail |
| - | ], | + | echo "Méchant $1 ! $2 \n \n" |
| - | // Commandes exécutées à l' | + | |
| - | stop: [ | + | |
| - | | + | |
| - | | + | |
| - | | + | # Effacer le corps du crime pour éviter d'encombrer sans intérêt |
| - | | + | rm $corpmail |
| - | ], | + | fi</ |
| - | // Streams : c'est là qu'on va définir les services et règles menant au bannissement | + | Penser évidement à créer le dossier '' |
| - | streams: { | + | |
| - | ssh: import 'ssh.jsonnet', | + | |
| - | kernel: import ' | + | |
| - | badguypostfix: | + | |
| - | }, | + | |
| - | } | + | |
| - | </ | + | |
| - | Pour ssh et kernel, il s'agit des configurations par défaut auxquelles j'ai ajouté mon envoi de mail : | + | Dans les streams (en ayant des fichiers modulaires), comment dire qu'il faut envoyer un mail (exemple sur ssh) : |
| - | < | + | < |
| - | { | + | |
| cmd: [' | cmd: [' | ||
| filters: { | filters: { | ||
| Ligne 250: | Ligne 518: | ||
| retry: 6, | retry: 6, | ||
| retryperiod: | retryperiod: | ||
| - | actions: banFor(' | + | actions: |
| }, | }, | ||
| }, | }, | ||
| }, | }, | ||
| - | |||
| </ | </ | ||
| - | <code jsonnet kernel.jsonnet> | + | ===== Transformer les règles de fail2ban ===== |
| - | // Ban hosts which knock on closed ports. | + | Ça c' |
| - | // It needs this iptables chain to be used to drop packets: | + | |
| - | // ip46tables -N log-refuse | + | |
| - | // ip46tables -A log-refuse -p tcp --syn -j LOG --log-level info --log-prefix ' | + | |
| - | // ip46tables -A log-refuse -m pkttype ! --pkt-type unicast -j nixos-fw-refuse | + | |
| - | // ip46tables -A log-refuse -j DROP | + | |
| - | { | + | |
| - | cmd: [' | + | |
| - | filters: { | + | |
| - | portscan: { | + | |
| - | regex: [' | + | |
| - | retry: 4, | + | |
| - | | + | |
| - | actions: banFor(' | + | |
| - | }, | + | |
| - | }, | + | |
| - | }, | + | |
| + | 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. | ||
| - | Pour postfix, pour le moment je cible certains bot cons. | + | fail2ban-client get JAIL failregex |
| - | <code jsonnet badguypostfix.jsonnet> | + | Remplacer " |
| - | { | + | |
| - | cmd: [' | + | |
| - | | + | |
| - | badguy: { | + | |
| - | | + | |
| - | @'^.* improper command pipelining after CONNECT from unknown\[< | + | |
| - | @'^.*\[<ip>\].*tiscali.it.*', | + | |
| - | @'^.* NOQUEUE: reject: RCPT from unknown\[< | + | |
| - | @'^.*connect from .*censys.*\[< | + | |
| - | @'^.*connect from .*stretchoid.*\[< | + | |
| - | @'^.*RCPT from unknown\[< | + | |
| - | @' | + | |
| - | ], | + | Jails que je tente d' |
| - | retry: 1, | + | * Apache, error.log |
| - | | + | * '' |
| - | | + | * '' |
| - | }, | + | * '' |
| - | | + | * '' |
| - | | + | * '' |
| - | </ | + | * '' |
| - | </ | + | * '' |
| + | * Apache access.log | ||
| + | * '' | ||
| + | | ||
| + | | ||
| + | |||
| + | Autres services, où en théorie on va tout reprendre (plus les notres) : | ||
| + | * postfix | ||
| + | * dovecot | ||
| + | * sieve | ||
| + | * sshd | ||
| - | {{tag> | + | {{tag> |
| [[https:// | [[https:// | ||