MirLabs / Le blog

Bloquer un robot sans bloquer un bureau entier

· Cyril Delage

Sentinelle, mon bundle de sécurité Symfony, bloque les adresses qui cherchent vos secrets : un .env, un dossier .git, une clé. Les blocages sont progressifs : 24 heures la première fois, 7 jours la deuxième, puis définitif. Une adresse qui revient après une semaine pour chercher encore votre .env ne passe pas par hasard.

Ce choix a un angle mort, et je ne voulais pas le cacher.

Une adresse, plusieurs personnes

Derrière une seule adresse IP, il peut y avoir beaucoup de monde : un réseau d'entreprise, une école, un opérateur mobile qui partage ses adresses entre des milliers de clients. Une seule machine infectée sur ce réseau scanne votre site, et toute l'adresse finit bloquée. Avec un blocage définitif, ce sont des visiteurs réels, peut-être des clients, qui ne peuvent plus entrer, sans savoir pourquoi.

La réponse facile serait de ne plus jamais bloquer définitivement. Je ne l'ai pas prise : les scanners reviennent, et un blocage qui expire les laisse revenir.

Laisser passer les humains

Depuis la version 0.5, un navigateur dont l'adresse est bloquée ne tombe plus sur un mur. Il voit une page qui explique : « Votre réseau a été bloqué suite à des requêtes suspectes. » Avec un bouton.

En cliquant, le navigateur fait un petit calcul en JavaScript, moins d'une seconde, sans captcha ni service extérieur. Une fois le calcul fait, il reçoit un passe signé, valable 24 heures, lié à cette adresse. Le collègue innocent continue sa visite. Le robot, qui ne fait pas ce calcul, reste dehors.

Trois garde-fous :

  • les fichiers sensibles restent fermés pour tout le monde, passe ou pas ;
  • les essais sont limités, et chaque défi ne sert qu'une fois ;
  • si un navigateur muni d'un passe tente une attaque, le passe est retiré pour toute l'adresse.

Une protection qui casse le site détruit plus qu'elle ne défend

C'est la règle qui guide Sentinelle depuis le début. Elle est née d'un incident : j'ai failli bloquer à la main un serveur Mailgun, ce qui aurait coupé en silence tous les e-mails entrants d'un de mes sites. Depuis, les fournisseurs critiques ne peuvent pas être bloqués, et les webhooks ne déclenchent jamais de blocage.

La page de passage applique la même règle aux personnes : être dur avec les robots, sans faire payer les humains qui partagent leur adresse.

Sentinelle est gratuit et open source. La documentation explique aussi le réglage à ne pas oublier derrière un proxy (trusted_proxies), sans lequel tous vos visiteurs ont la même adresse.

Un projet du même genre ?Intégration de l'IA, site à rendre lisible par les assistants, sécurité : parlons-en.
Me contacter

À lire aussi