Abusive HTTP Watch

Abusive HTTP Watch est un daemon OpenBSD léger qui suit en temps réel le journal d’accès du serveur web, détecte les probes HTTP malveillantes à partir d’un jeu de tokens curé, et écrit les adresses IP sources dans un fichier directement consommable par le pare-feu (par ex. pf). En production active pour protéger des boutiques en ligne.

PropriétéValeur
Version2.1.2
PlateformeOpenBSD (intégration RC script)
LangagePerl 5 (uniquement bibliothèque standard)
Cas d’usageDurcissement de boutiques en ligne
ÉtatEn production
  flowchart LR
    A[Logs serveur web] --> B[Reconnaissance de motif]
    B --> C{"Seuil atteint ?"}
    C -->|Oui| D[Règle PF de blocage]
    C -->|Non| A
    D --> E[(Table de blocage)]
    E -->|TTL expiré| F[Libération auto]

De quoi il s’agit

Les boutiques en ligne et sites web en production sont en permanence sondés automatiquement à la recherche de vulnérabilités — exploits PHP, probes de connexion WordPress, lookups /etc/passwd, traversal, SQLi, injection de null-byte. Ces probes laissent un motif de tokens clair dans l’access log, indépendamment du code HTTP retourné.

Abusive HTTP Watch suit le log en continu, évalue chaque ligne contre un jeu de tokens précis, et écrit les IP avec hits répétés dans une blocklist append-only qui s’intègre directement aux tables pf d’OpenBSD, aux directives Require d’Apache ou aux listes deny de nginx.

Catégories de détection

Le jeu de tokens cible des classes d’attaques qui apparaissent clairement dans les logs de production — délibérément conservateur pour éviter les faux positifs.

  • Exploitation PHPallow_url_include, auto_prepend_file, php://input, eval(
  • Probes WordPresswp-admin, wp-login.php et variantes
  • Path traversal../.. et encodages courants
  • Chemins sensibles.env, .git, .svn, id_rsa, /etc/passwd
  • Tentatives RCE / CGIcgi-bin, ?cmd=, =shell, eval(
  • Injection SQLor 1=1 et variantes conservatrices
  • Probes de boucle de connexion — paramètres back= cascadés, y compris URL-encodés
  • Injection null-byte%00 dans l’URI

Fonctionnalités opérationnelles

  • 🔄 Résistant à la rotation des logs — Détecte à la fois la rotation (changement d’inode) et le copytruncate (pos > size) et se rétablit sans manquer de lignes.
  • 🌍 Dual stack — Support natif IPv4 et IPv6 avec whitelisting CIDR (par ex. 203.0.113.0/24, 2001:db8::/32).
  • 🛡️ IP publiques uniquement — Les adresses privées RFC 1918, link-local, loopback, multicast et espace partagé sont automatiquement ignorées.
  • 🎯 Matching scoped — Par requête, le matching est restreint à request, user-agent et optionnellement referrer. Le scope referrer est désactivé par défaut pour éviter les blocages drive-by via des pages tierces.
  • 🔒 Mises à jour atomiques de la blocklistflock(LOCK_EX) à l’écriture, dédup en mémoire empêche les doublons après redémarrages.
  • 📋 Whitelist prioritaire/etc/abusive_http_whitelist accepte IPs uniques ou CIDR toujours laissés passer.
  • ⏳ Seuil de hits — Une IP n’entre dans la blocklist qu’après MIN_HITS hits (par défaut 3) — protège contre les singletons accidentels.
  • 📡 Intégration syslog — Événements structurés (tag, facility, prio configurables via env) pour les actions added et le diagnostic.
  • 🛑 Arrêt propre — SIGTERM est intercepté, le daemon termine son itération courante et ferme les handles dans l’ordre.

Configuration

Entièrement pilotable via variables d’environnement — aucune modification de code requise.

VariableRôleDéfaut
ABUSIVE_FAMILYFiltre de famille d’IP (v4/v6/any)any
ABUSIVE_MIN_HITSSeuil de hits avant blocage3
ABUSIVE_SCOPEChamps à matcher (request,ua,referrer)request,ua
ABUSIVE_REFERRER_DOMAINSHosts referrer autorisés
ABUSIVE_SYSLOG_TAGTag syslogabusive_http_watch
ABUSIVE_SYSLOG_FACILITYFacility syslogdaemon
ABUSIVE_SYSLOG_PRIOPriorité syslognotice
ABUSIVE_DEBUGActive le debug0

Fondation technologique

Délibérément minimal — uniquement les outils de base OpenBSD et les modules standard de Perl.

ComposantRôle
OpenBSD rc.dCycle de vie du daemon (start/stop/reload)
Perl 5Runtime — stdlib uniquement (Fcntl, IO::Handle, Sys::Syslog, Socket)
pfConsommateur firewall de la blocklist (table <abusive>)
syslogdAgrégation centrale des événements
newsyslogRotation des logs — gérée de manière transparente par le watcher

Pourquoi c’est un sujet de niveau CEO

  • 🏷️ Empreinte conformité minimale — Lit uniquement les logs serveur existants, écrit un fichier unique, aucun cloud, aucune télémétrie. Conforme RGPD out-of-the-box.
  • 💰 Coût d’exploitation ~0 € — Script en un seul fichier, sans conteneur, sans dépendance. Maintenance limitée au jeu de tokens, qui change rarement.
  • 🔐 Réduction de la surface d’attaque — Les IP répétées disparaissent du pool en quelques secondes — la majorité des attaquants essaient seulement 3 à 10 chemins avant de passer à l’IP suivante.
  • 📊 Auditable — 381 lignes de Perl, aucune dépendance externe, chaque règle de token est une regex commentée. Revue de code en une seule séance.
  • 🛠️ Personne n’est bloqué par erreur — Whitelist avec CIDR IPv4/IPv6 et seuil de 3 hits empêchent les bots de moteurs de recherche ou probes accidentelles de causer du tort.

Abusive HTTP Watch — Version 2.1.2 · Daemon rc.d OpenBSD · En production sur des boutiques en ligne · ~380 SLOC Pure Perl