Fail2ban déporté sur reverse proxy swag (nginx)

Hello,

Je fais appel a votre aide pour un petit coup de pouce.

J’ai installé un reverse proxy swag qui fait le boulot.
Il est associé nativement à fail2ban, cela fonctionne bien avec d’autres sites hebergés mais pas jeedom :frowning:

Je veux bloquer sur mon fail2ban de mon reverse proxy et non sur jeedom.

Sur le reverse proxy fail2ban regarde dans /log/nginx/access.log les erreurs HTTP 40x qui indiquent un refus de connexion, mais je n’ai rien quand je test avec jeedom, je n’ai que des retour HTTP 200 comme quoi tout va bien meme quand je rentre des mauvais identifiants.

Immich (très bon remplacant de Google photo au passage :wink:) :

« POST /api/auth/login HTTP/1.1 » 401 81 « https://immich.xxxxxxxxx.duckdns.org/auth/login » « Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 »

Jeedom :

« POST /core/ajax/user.ajax.php HTTP/1.1 » 200 120 « - » « Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 »

La config coté reverse proxy est identique entre les 2 sites.
Ca doit pas etre grand chose mais bon je butte dessus.

Y’a bien moyen d’intercepter cela ailleurs que de jeedom ?

Merci

Bonjour

Fail2ban de Jeedom traite 4 règles:

sshd, apache-botsearch, apache-overflows et apache-noscript

La page sécurité : réglages → système–> configuration → sécurité

Les paramètres de cette page sont utilisés par un autre mécanisme qui n’a rien à voir avec fail2ban.

Source ici par Loic: https://community.jeedom.com/t/fail2ban-banissement/125459

Il est peut être possible de configurer les réponses « code erreur » dans apache mais je ne peux pas répondre ne connaissant pas Apache. Je sais aussi que le fichier d’installation Jeedom modifie les paramètres d’Apache. Voir le fichier install.sh.

Cordialement

Hello,

Merci de ta réponse.
En effet j’ai bien vu que la page que tu mentionnes, en testant un blocage suite a 3 mauvais mot de passe, les 4 jails n’ont aucun bannissement d’adresse IP. C’est donc un autre système que je comprends pas trop.

Du coup je pense que le fait que c’est un autre mécanisme ‹ empêche › la diffusion de la page d’erreur 40x… Car en lisant bien les fonctionnement d’Apache et Nginx y’a aucune raison que ça n’apparaisse pas.

@Loic tu en penses quoi ?

Merci.

Bonjour
Ce n’est pas possible avec jeedom il envoi un 200 même si l’authentification est pas bonne (car il a son propre fail2ban directement intégré dans son code)

Merci de ta réponse.

Tu viens de ruiner tous mes espoirs :frowning:.

Je vais voir si je sais intercepter le message « mot de passe ou nom utilisateur incorrect » mais c’est pas gagné. (En passant en verbose le site jeedom sur le reverse proxy ?)

On ne sait pas par hasard désactiver le fail2ban natif par x ou y moyen ?

Ben faut refaire tout le code de la connexion car au delà de ça si tu renvoi un 401 ça veut dire l’affichage de la page 401 et plus de jeedom donc pour que l’utilisateur essaye de se reconnecter (car juste erreur de mot passe) il faut qu’il retape l’adresse de son jeedom ou fasse précédent.

En gros vu que ça a jamais été prévu de faire ce que tu demande faut revoir toute la mécanique de connexion (mobile et desktop) et aussi revoir toute la partie api (et la c’est lourd car y’a plusieurs mécanismes de connexion et en plus on sortir du standard en json rpc je pense…)

L’autre service web que je parle envoie bien un 401 sans devoir faire précédent ou retaper l’adresse a chaque tentative.

Enfin bref je vois bien que c’est lourd et hors scope jeedom.

Mais je trouve ça dommage d’être lié a la sécurité native jeedom (au moins pouvoir choisir si on veut l’activer ou pas) sur un produit qui est a la base de la domotique.
Beaucoup de monde essayent de déporter certaines fonctions annexes ce qui me semble le cas ici.

Je comprends et oui on a peut être pas fait ça correctement ou dans les règles désolé…. Mais la je peux vraiment pas caler ça et tout revoir le système de connexion à jeedom juste pour ton cas. Je pense tu imagines pas avec les processus interne de validation et tout j’en ai pour 6mois…. Il y a d’autre priorités que ça. Encore désolé

Non tu n’as pas a être désolé, merci pour tes éclaircissements.

Je vais voir pour intercepter le popup comme je disais au dessus sinon je laisserai comme ça pour jeedom.

En vrai je pense tu vas perdre en sécurité en passant par ta solution car elle ne se base que sur l’ip de la personne qui se connecte, c’est pas le cas de Jeedom qui pose d’autre trace au cas ou la meme personne retenue en changeant d’ip.

1 « J'aime »

J’aimerai rajouter cette couche quand meme en tant que reverse proxy

Je creuse pour que dans les logs d’accès du reverse j’arrive à choper

Bon récupérer le message « mot de passe ou nom utilisateur incorrect », c’est mort car le reverse proxy peut pas lire les data HTTP

L’astuce que j’ai trouvé pour le moment c’est interpreter le code 200 avec une longueur de 120 avec la commande POST /core/ajax/user.ajax.php. Le POST /core/ajax/user.ajax.php apparaît quand je vais par exemple dans la partie user mais jamais la longueur est a 120 (bien plus grande).

Ça fait le taf.

Du coup autre question comment je récupère les infos de la page connexion où on voit les @ip bloquées. Vu que les IP sont pas dans les jails de fail2ban, je sais pas comment les récupérer.

Je voudrais menvoyer des notifications.

Bonjour
C’est dans la page de configuration de jeedom onglet sécurité

Oui @Loic ça j’avais compris lol mais pour me prévenir par message style jeedom connect. Sans que j’aille voir cette page.

Je vois pas comment automatiser ça. Avec fail2ban facile mais la …

Je crois qu’il y en a qui l’ont fait en mode code dans un scénario mais rien de facile non.

Si jamais tu retrouves quelque chose ne suis preneur. J’ai rien trouvé sur le forum.

Pas facile ce custom de blocage jeedom lol.

Non je t’avoue que ça sort un peu du champs de mon support la dessus j’aimerais avoir le temps mais c’est pas le cas….

Regarde avec un bloc code de scénario.

$cache = cache::byKey('security::banip');
$values = json_decode($cache->getValue('[]'), true);
if (!is_array($values)) {
  $values = array();
}

$results = print_r($cache, true);
$scenario->setLog($results);

$nbipban = count($values);
if ($nbipban != 0) {
  foreach ($values as $value) {
    $results = 'Bannissement de l\'adresse IP : '.$value['ip'].date(' \l\e d-m-Y à H:i:s',$value['datetime']);
    $scenario->setLog($results);
  }
  $ip = end($values)['ip'];
  $date = date('d-m-Y à H:i:s',end($values)['datetime']);
  $scenario->setLog('Dernière IP : '.$ip.' le '.$date);
  cmd::byString("#[monjeedom][Ban_IP][IP]#")->event(($ip));
  cmd::byString("#[monjeedom][Ban_IP][Date]#")->event(($date));
}
cmd::byString("#[monjeedom][Ban_IP][Nb dIP bannies]#")->event(($nbipban));
3 « J'aime »

Merci beaucoup ca fait le job !

On est d’accord qu’on peut pas avoir de trigger pour eviter de le lancer régulièrement ? (pour etre averti de suite en cas de beaucoup de tentatives)