Bloquer un robot sans bloquer un bureau entier
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.
À lire aussi
Une alerte par robot, c'est zéro alerte
Mon bundle de sécurité devait se taire quand un robot était déjà bloqué. Il ne le faisait jamais. Sentinelle 0.6 corrige le bug, et n'écrit plus à la minute que si quelque chose est vraiment sorti.
L'IA écrit mon code, je garde les clés
Je ne tape plus de code : une IA écrit tout. Elle n'a pourtant accès ni au serveur ni à un seul secret. Qui peut faire quoi, ce qui est en place, et ce qui ne l'est pas encore.
Mon site se met à jour pendant que je dors, et je valide le matin
Uplift fait monter PHP, Symfony et les dépendances dans des limites que je fixe, lance les tests et me laisse décider. Premier vrai passage : Symfony 7.3 vers 7.4.21, 40 paquets.