Fatigue d'alerte : 82 e-mails en un jour de mon moniteur de sécurité
Combien d’alertes un moniteur de sécurité tenu par une seule personne devrait-il envoyer ? D’après mes chiffres, environ un e-mail par jour, plus le rare qui me demande d’agir. Le 1er novembre, entre minuit et 13:32 heure du Pacifique, mon moniteur a remis 74 e-mails au service d’envoi : 55 pour des blocages déjà effectués, 16 alertes critiques, deux alertes horaires de volume et une provenant du scanner de mon Mac.12 Ma lecture, cet après-midi-là, était que chacun décrivait un balayage de routine que l’edge avait déjà arrêté ;3 pour les rafales critiques, la section 6 montre que cette lecture était trop généreuse. La solution a été une politique, pas un seuil : un récapitulatif quotidien qui sert aussi de signal de vie, les blocages envoyés sur le chat plutôt que par e-mail, une alerte critique intégrée au récapitulatif quand l’edge l’a déjà traitée, et le sort inscrit sur chaque alerte critique du cloud. Le lendemain, un scanner a déclenché quatre alertes critiques en moins de six minutes sur mes sites, et mon moniteur n’a envoyé aucun e-mail à ce sujet.4 La journée a tout de même produit 19 e-mails, pas un seul, et la raison en est la partie la plus utile de l’histoire.5
Je suis le seul lecteur du courrier de mon moniteur. Quand la boîte de réception affichait 74, je me suis demandé s’il s’agissait de routine ou de menaces réelles, et la réponse honnête était que le moniteur ne pouvait pas me le dire à travers ses objets, parce que chaque objet disait la même chose à un volume différent.1 Un moniteur dont l’unique lecteur cesse de le lire a cessé de surveiller, quoi que ses détecteurs attrapent encore. Voici le décompte, la politique qui l’a remplacé, un cas d’essai, et les trois endroits où la version propre de l’histoire se fissure.
En bref
- 74 e-mails à 13:32, 82 à minuit. Mon propre tableau et le décompte tiré des journaux s’accordent sur 74 avant ma plainte (55 par blocage, 16 critiques, deux horaires, un local) ; l’ensemble du 1er novembre a totalisé 81 e-mails journalisés plus un récapitulatif envoyé à la main.125
- 22 des 74 ne sont pas prouvés. Ils venaient d’un code qui journalisait « sent » (envoyé) sans vérifier la réponse du service d’envoi ; le journal prouve donc qu’une remise a été tentée, pas qu’un message est arrivé.26
- La littérature avait déjà la règle. Le livre SRE de Google admet trois sorties (alertes, tickets et journalisation), dit « Every page should be actionable » (chaque page doit appeler une action) et qualifie les alertes par e-mail d’« alert spam » ; l’alerte de The Joint Commission (l’organisme américain d’accréditation des hôpitaux) cite une estimation selon laquelle « between 85 and 99 percent of alarm signals do not require clinical intervention » (85 à 99 % des signaux d’alarme ne nécessitent aucune intervention clinique).78910
- Le cas d’essai a fonctionné. Le 2 novembre, une seule adresse d’un hébergeur néerlandais a déclenché quatre alertes critiques en 5 minutes 51 secondes sur mes sites ; le moniteur l’a bloquée une fois, a publié le blocage sur le chat, a intégré chaque alerte critique au récapitulatif et n’a envoyé aucun e-mail.41112
- Le lendemain a tout de même envoyé 19 e-mails, pas un. Quatorze étaient des alertes critiques de rafale WAF dans lesquelles certains événements n’avaient ni blocage ni challenge enregistré, et leurs objets disaient « WAF blocks » (blocages WAF) même quand l’edge n’avait bloqué aucun des événements (deux fois ce jour-là ; la veille au soir, l’un disait « 104 WAF blocks » alors que l’edge n’avait rien bloqué ni soumis à un challenge) ; ma première reformulation, le jour même du décompte, mélangeait encore deux comptages sur une ligne, et la relecture de cet article l’a repéré.51314
- Deux signaux étaient faux. Une vérification de signature de code sur mon Mac a pris le propre démon Spotlight d’Apple pour un mineur de cryptomonnaie non signé, et le « RUNS SHORT 162/207 » (exécutions manquantes) du récapitulatif s’est révélé être en partie la veille, en partie une cadence réelle plus lente et en partie, d’après la chronologie, trois exécutions tuées par le watchdog.151617
- Ce qui a changé : un récapitulatif par jour porte le signal de vie, chaque blocage et le sort de chaque alerte critique du cloud, tandis que seules une alerte critique qu’aucune des deux intégrations ne couvre, l’alerte horaire de volume et le scanner local envoient encore un e-mail immédiat ; les 82 e-mails du 1er novembre sont devenus 19 le 2 novembre.185
1. La boîte de réception du 1er novembre
À 13:32 heure du Pacifique le 1er novembre, j’ai écrit à la session d’agent qui gère mon infrastructure : les e-mails du moniteur inondaient ma boîte ; y avait-il quelque chose à changer, et s’agissait-il de routine ou de menaces réelles ?1 Le tableau que j’ai tenu cet après-midi-là comptait 74 e-mails depuis minuit par expéditeur : 55 notifications par blocage, 16 alertes critiques, deux alertes horaires de volume et une alerte critique du scanner de mon Mac.1
Le décompte repose sur une règle, la voici donc avant les chiffres. Un e-mail, dans cet article, est une ligne du journal du moniteur qui enregistre une remise au service d’envoi. Un script a parcouru les six fichiers journaux du 31 octobre au 2 novembre et a classé chacune de ces lignes par flux et par issue.5 Arrêté à 13:32, le script concorde avec mon tableau flux par flux : 55, 16, deux et un, soit 74.2 La journée locale entière, jusqu’à minuit, a totalisé 81 e-mails journalisés (55 par blocage, 22 critiques, trois horaires, un local), plus un récapitulatif envoyé à la main à 13:48, qui n’a pas de ligne d’envoi dans le journal du moniteur, soit 82.51
Deux détails comptent dans cette concordance. Mon tableau indiquait pour les alertes critiques « 9 before the fold went live at 00:30 PT; the 7 after » (9 avant la mise en service de l’intégration à 00:30 PT, 7 après) ; le journal compte 11 lignes critiques « sent » avant 00:30 et cinq après, et la première alerte critique intégrée à une notification de blocage apparaît à 00:54:43, après l’entrée en vigueur du changement d’intégration à 00:46 PDT, et non à 00:30 comme l’indiquait mon tableau.218 Les totaux concordent ; la répartition que j’avais notée à la main était fausse de deux. Le second détail pèse davantage. Sur les 74, 22 (10 par blocage, 11 critiques, un horaire) venaient d’expéditeurs qui jetaient la réponse du service d’envoi puis journalisaient « sent » quoi qu’il revienne.26 Un correctif à 01:04 PDT ce matin-là, avant le recul des horloges, a fait journaliser par les expéditeurs de la moitié cloud le statut HTTP du service, et n’écrire « sent » que sur un 2xx ; l’expéditeur du scanner local écrit une simple ligne « Critical email sent », et seulement quand la requête n’a levé aucune erreur.6 Les 22 lignes antérieures prouvent que le moniteur a essayé ; elles ne prouvent pas que le service d’envoi a accepté quoi que ce soit. Mon journal du 31 octobre jugeait que les e-mails cloud « most likely were » (avaient très probablement été) remis, ce qui est une supposition raisonnable, mais reste une supposition.19
Même un 2xx prouve moins que ne le laisse entendre le mot « sent ». La documentation de Resend définit son événement email.sent comme « Occurs whenever the API request was successful. Resend will attempt to deliver the message to the recipient’s mail server » (se produit chaque fois que la requête API a réussi ; Resend tentera alors de remettre le message au serveur de messagerie du destinataire), et présente la remise comme un événement distinct et ultérieur.20 L’appel d’envoi lui-même répond par un id.21 Chaque décompte ci-dessous est un décompte de remises acceptées par le service d’envoi ou, pour les 22 du 1er novembre et les 10 du 31 octobre, soit 32 en tout, de remises tentées par le moniteur.5 Aucun n’est un décompte de messages que j’ai lus.
Heure par heure, la journée ressemble à une falaise suivie d’un plateau.
1er novembre, heure locale : e-mails par heure face aux alertes qui ne sont pas devenues des e-mails, avec le changement de politique de 13:50 marqué.22
La première heure a porté 22 e-mails, tous issus du code non vérifié (10 par blocage, 11 critiques, un horaire).22 Ensuite, les notifications par blocage ont continué au rythme d’une à cinq par heure, parce que l’edge ne cessait de bloquer des scanners et que chaque blocage m’écrivait une lettre. Le dernier e-mail par blocage est parti à 13:25:57 ; la première notification de blocage intégrée au récapitulatif apparaît à 14:20:35.22 Après le changement de 13:50, les e-mails tombent à zéro à deux par heure, tandis que les alertes intégrées et supprimées grimpent jusqu’à 23 par heure.22 Le trafic n’a pas baissé. Les e-mails, si.
La veille est une mauvaise base de comparaison. Mon journal du 1er novembre indique « Yesterday had 10 » (hier, il y en a eu 10), et le script est d’accord, mais le journal du 31 octobre commence à 22:31, le soir où j’ai réarmé le moniteur ; ces 10 e-mails couvrent donc 89 minutes.15 Selon ma lecture, les 74 mesuraient le détecteur au travail sur une journée complète de bruit de fond d’Internet, pas un changement dans le comportement des scanners.
2. À quoi servaient les alertes
Le moniteur a deux moitiés. La moitié cloud est programmée pour s’exécuter sur mon Mac toutes les cinq minutes et demande à Cloudflare les événements de pare-feu et les comptes de requêtes groupés de chacune de mes zones : quelles adresses ont visé quels chemins, à quelle fréquence, et quelle action l’edge a prise sur chaque événement.1823 La propre description de ces données par Cloudflare en donne le bon cadre : « Security Events displays information about requests actioned or flagged by Cloudflare security products, including features such as Browser Integrity Check. » (Security Events affiche des informations sur les requêtes traitées ou signalées par les produits de sécurité de Cloudflare, y compris des fonctionnalités comme Browser Integrity Check.)24 La moitié locale est un scanner qui vérifie le Mac lui-même par paliers toutes les 10 minutes : les processus et leurs signatures de code, les hooks d’agent présents sur la machine, les outils qui masquent des binaires système dans le chemin d’accès, et ainsi de suite.12
Ce que la moitié cloud fait de ces données se résume simplement. Elle produit des constats par gravité (critical, high, medium) et par catégorie, et pour un constat critique, elle tente d’agir avant de prévenir qui que ce soit : quand une adresse est à l’origine d’assez d’événements, elle l’ajoute pour sept jours à une liste de blocage à l’échelle du compte, que chaque zone applique à l’edge.124 Jusqu’aux changements du 1er novembre, chacune de ces actions produisait aussi un e-mail, tout comme chaque alerte critique qu’une limite de deux heures par site et par catégorie ne supprimait pas, la fin de chaque session et chaque heure de blocages nombreux.185 Le scanner local produit ses propres constats et envoie lui-même ses alertes critiques par e-mail.25 Les Alerts de Cloudflare existent en deux types, « Monitors that you define yourself, and Platform Notifications » (des Monitors que vous définissez vous-même, et des Platform Notifications) : des requêtes SQL API planifiées et des alertes produit préconfigurées, toutes deux paramétrées dans son tableau de bord.26 Le mien n’est ni l’un ni l’autre : c’est un script sur mon Mac qui lit lui-même les événements de pare-feu, ce qui veut aussi dire que le bruit, c’est à moi de le corriger.
3. Ce que la littérature disait déjà
Rien de ce qui suit n’est nouveau, et c’est bien là le malaise. J’en avais lu l’essentiel et j’ai tout de même construit un moniteur qui envoyait un e-mail par événement.
Trois sorties, et l’e-mail n’en fait pas partie. L’introduction de Site Reliability Engineering de Google (l’ouvrage de référence de Google sur l’exploitation des systèmes de production) affirme « There are three kinds of valid monitoring output » (il existe trois types de sorties de supervision valables) : les alertes, qui « Signify that a human needs to take action immediately » (signifient qu’un humain doit agir immédiatement) ; les tickets, qui « Signify that a human needs to take action, but not immediately. » (signifient qu’un humain doit agir, mais pas immédiatement) ; et la journalisation, où « No one needs to look at this information, but it is recorded for diagnostic or forensic purposes. » (personne n’a besoin de regarder ces informations, mais elles sont enregistrées à des fins de diagnostic ou d’analyse forensique).7 La même page est sans détour sur le design que j’avais : « a system that requires a human to read an email and decide whether or not some type of action needs to be taken in response is fundamentally flawed. » (un système qui oblige un humain à lire un e-mail et à décider si une action quelconque s’impose est fondamentalement défaillant).7 Classés ainsi, mes 55 e-mails par blocage étaient de la journalisation livrée sous forme d’alertes. L’edge avait agi ; il ne restait rien à faire pour un humain.
Chaque page doit appeler une action. Le chapitre de Rob Ewaschuk sur la supervision, dans le même livre, définit une alerte comme « A notification intended to be read by a human and that is pushed to a system such as a bug or ticket queue, an email alias, or a pager » (une notification destinée à être lue par un humain et poussée vers un système tel qu’une file de bugs ou de tickets, un alias e-mail ou un pager), et sa note sur le type e-mail se lit « Sometimes known as “alert spam,” as they are rarely read or acted on. » (parfois appelées « spam d’alertes », car elles sont rarement lues ou traitées).9 Les règles du chapitre pour les pages tiennent en trois lignes : « Every page should be actionable. » « I can only react with a sense of urgency a few times a day before I become fatigued. » « If a page merely merits a robotic response, it shouldn’t be a page. » (Chaque page doit appeler une action ; je ne peux réagir dans l’urgence que quelques fois par jour avant de m’épuiser ; si une page ne mérite qu’une réponse machinale, elle ne devrait pas être une page.)8 Ma réponse machinale à un e-mail par blocage était de le supprimer. Le chapitre nomme aussi le coût du bruit : « When pages occur too frequently, employees second-guess, skim, or even ignore incoming alerts, sometimes even ignoring a “real” page that’s masked by the noise. » (Quand les pages sont trop fréquentes, les employés doutent, survolent ou ignorent les alertes entrantes, au point parfois d’ignorer une « vraie » page masquée par le bruit.)27 Et il décrit une équipe qui « spent significant amounts of time triaging the alerts to find the few that were really actionable » (passait énormément de temps à trier les alertes pour trouver les rares qui appelaient vraiment une action), ce qui décrit assez bien mon après-midi du 1er novembre.28
Les symptômes avant les causes, et un test pour une page. L’essai antérieur d’Ewaschuk, qui selon lui a servi de fondation à ce chapitre, condense le test en une phrase : « Pages should be urgent, important, actionable, and real. » (Les pages doivent être urgentes, importantes, actionnables et réelles.)29 Sur les causes, il écrit « Include cause-based information in symptom-based pages or on dashboards, but avoid alerting directly on causes » (incluez les informations sur les causes dans des pages fondées sur les symptômes ou dans des tableaux de bord, mais évitez d’alerter directement sur les causes), sous un intertitre « Cause-based alerts are bad (but sometimes necessary) » (les alertes fondées sur les causes sont mauvaises, mais parfois nécessaires).29 Je lis un blocage de pare-feu comme un fait de niveau cause : un scanner a touché une règle. Le symptôme qui m’importe, c’est un chemin sensible servi ou un site en panne, et selon ma lecture, aucun des 74 ne signalait ni l’un ni l’autre ; les requêtes de ce jour-là sur les chemins sondés ne montraient aucun 2xx sur un chemin sensible.3 L’essai anticipe aussi le récapitulatif : « A daily (or more frequent) report can work too » (un rapport quotidien, ou plus fréquent, peut aussi fonctionner), avec l’avertissement que « without a system of accountability this amounts to less-spammy email alerts » (sans système de responsabilité, cela revient à des alertes e-mail un peu moins envahissantes).30 Son remède est une personne : « make sure the oncall person (or someone else) is designated to triage these every day » (veillez à ce que la personne d’astreinte, ou quelqu’un d’autre, soit désignée pour les trier chaque jour).30 Sur un moniteur tenu par une seule personne, cette personne ne peut être que moi. Le champ d’issue de la section 4 est mon propre mécanisme d’appui, pas le sien : il donne au tri quotidien quelque chose à vérifier, ce qu’il est advenu de chaque alerte critique, mais il ne fait pas le tri.
Précision et rappel. Le chapitre sur l’alerte de The Site Reliability Workbook (le volume pratique qui accompagne le livre SRE) fournit le vocabulaire de ce qui a mal tourné. La précision est « The proportion of events detected that were significant. » (la proportion d’événements détectés qui étaient significatifs). Le rappel est « The proportion of significant events detected. » (la proportion d’événements significatifs détectés).31 Je n’ai pas mesuré le rappel de mon moniteur, ce qui exigerait un décompte des événements significatifs qu’il a manqués, et la section 5 en décrit un qu’il a manqué. En tant que flux de courrier, sa précision était proche de zéro : 74 e-mails et, selon ma lecture, aucun message parmi eux ne me demandait de faire quoi que ce soit. Le même chapitre nomme le temps de réinitialisation, « How long alerts fire after an issue is resolved. Long reset times can lead to confusion or to issues being ignored. » (combien de temps les alertes continuent de se déclencher après la résolution d’un problème ; des temps longs peuvent semer la confusion ou faire ignorer des problèmes).31 Le temps de réinitialisation est défini pour des alertes qui continuent de se déclencher ; un e-mail par blocage se déclenche une fois puis n’apporte aucune mise à jour de résolution : il ne dit jamais que le scanner est parti.
La version hospitalière du même échec. Le chapitre SRE lui-même pointe hors du logiciel, vers la gestion des alarmes cardiaques, « for an example of alert fatigue in another context. » (comme exemple de fatigue d’alerte dans un autre contexte).28 La Sentinel Event Alert (alerte sur les événements sentinelles) de The Joint Commission consacrée à la sécurité des alarmes des dispositifs médicaux, publiée le 8 avril 2013, chiffre le phénomène : « The number of alarm signals per patient per day can reach several hundred » (le nombre de signaux d’alarme par patient et par jour peut atteindre plusieurs centaines), et « It is estimated that between 85 and 99 percent of alarm signals do not require clinical intervention » (on estime que 85 à 99 % des signaux d’alarme ne nécessitent aucune intervention clinique).10 L’alerte est rigoureuse d’une manière qui mérite d’être imitée : les 85 à 99 % couvrent les alarmes qui ne demandent aucune intervention, pas seulement les fausses, et l’alerte ne sépare pas les deux. La conséquence qu’elle consigne est celle dans laquelle je m’engageais déjà à moitié : les soignants « become desensitized or immune to the sounds » (deviennent insensibles ou immunisés aux sons), et « may turn down the volume of the alarm, turn it off, or adjust the alarm settings outside the limits that are safe and appropriate for the patient » (peuvent baisser le volume de l’alarme, la couper ou régler ses paramètres hors des limites sûres et appropriées pour le patient).10 Elle recense 98 événements liés aux alarmes de janvier 2009 à juin 2012, dont 80 « resulted in death » (ont entraîné un décès), et, au-delà des facteurs signalés à sa base de données, désigne la fatigue d’alarme comme « the most common contributing factor. » (le facteur contributif le plus courant).10 Mes enjeux sont bien moindres. Le mécanisme est le même : une personne qui apprend que les alarmes n’ont pas besoin d’elle l’apprend aussi pour la prochaine vraie.
Le NIST, hier et aujourd’hui. La révision de 2012 du guide de traitement des incidents du NIST, SP 800-61r2, avertissait qu’« it is not uncommon for an organization to receive thousands or even millions of intrusion detection sensor alerts per day. » (il n’est pas rare qu’une organisation reçoive des milliers, voire des millions d’alertes de capteurs de détection d’intrusion par jour).32 La révision d’avril 2025, SP 800-61r3, qui « supersedes SP 800-61r2 » (remplace SP 800-61r2), supprime cette phrase ; la plus proche est une recommandation : « The volume of potentially adverse events to be analyzed is generally quite high, so organizations should rely on technical solutions that filter large event datasets down to a subset that is suitable for human viewing and analysis. » (Le volume d’événements potentiellement indésirables à analyser est généralement élevé ; les organisations devraient donc s’appuyer sur des solutions techniques qui filtrent de grands ensembles d’événements jusqu’à un sous-ensemble adapté à l’examen et à l’analyse humains.)33 Je prends le filtre comme consigne, et le récapitulatif comme l’un de ces filtres.
Une enquête de fournisseur, présentée comme telle. L’enquête 2023 de Vectra AI, menée par Sapio Research auprès de 2 000 analystes en sécurité, rapporte que « SOC teams receive an average of 4,484 alerts per day, and over two-thirds (67%) of them are ignored. » (les équipes SOC reçoivent en moyenne 4 484 alertes par jour, et plus des deux tiers, 67 %, sont ignorées).34 C’est une enquête d’opinion commandée par un fournisseur, et les 67 % sont ce que les répondants ont déclaré, pas une mesure. Je ne la cite que pour un point : l’échec se transpose aussi vers le bas. Des analystes disent ignorer les deux tiers de 4 484 alertes par jour, et un lecteur seul, sans équipe, a cessé de lire à 74.
4. La refonte, sous forme de règles
Le changement est entré en vigueur à 13:50 le 1er novembre, 18 minutes après mon message, et un second changement à 14:00 a resserré l’une de ses conditions.18 Je l’ai écrit sous forme de règles, chacune avec sa raison d’être.
Règle 1 : un récapitulatif par jour, et c’est lui le signal de vie. La première exécution du moniteur après 07:00 heure locale envoie un e-mail couvrant la fenêtre écoulée depuis le récapitulatif précédent.1835 La description du récapitulatif dit elle-même ce que cet e-mail remplace : « One email a day … in place of an email per auto-block and per WAF-handled CRITICAL. » (un e-mail par jour… au lieu d’un e-mail par blocage automatique et par alerte critique traitée par le WAF).35 Il s’ouvre sur l’état des exécutions (exécutions enregistrées, exécutions lancées et terminées, échecs, e-mails critiques envoyés et supprimés), puis viennent les blocages automatiques avec zone, motif et opérateur réseau, chaque alerte critique et ce qu’il en est advenu, les constats par gravité et par catégorie, les chemins sondés et les constats non résolus du scanner local.12 La raison d’être du récapitulatif, c’est la boîte de réception. La raison de l’envoyer chaque jour figure dans la même description : « The digest is also the heartbeat: it goes out on a quiet day too » (le récapitulatif est aussi le signal de vie, le heartbeat : il part aussi les jours calmes).35 Un flux d’alertes qui ne parle que lorsqu’il se passe quelque chose ne peut pas me faire distinguer une journée calme d’un moniteur mort. Un récapitulatif qui arrive toujours le peut : le silence signifie une panne, pas le calme. Les notes du programme consignent pourquoi j’y tiens : plus tôt en 2026, le moniteur est resté mort pendant des mois, et rien ne l’a remarqué.35
Règle 2 : les blocages vont sur le chat, pas par e-mail. Les notes de conception tiennent en quatre mots : « Per block: Slack only. » (par blocage : Slack uniquement).3 Un blocage, c’est l’edge qui agit en mon nom. Dans les termes du livre SRE, c’est de la journalisation : enregistré, utile plus tard, et rien sur quoi un humain doive agir.7 Le chat garde le flux en direct pour les moments où je veux en suivre un, et le récapitulatif garde la trace.
Règle 3 : intégrer une alerte critique quand l’edge l’a déjà traitée. Une alerte critique tente toujours de bloquer d’abord ; ensuite, le moniteur décide si elle mérite un e-mail.3 Deux conditions l’intègrent plutôt au récapitulatif, vérifiées dans cet ordre. La première : l’adresse propre au constat, et chaque adresse qu’il contient éligible au blocage automatique, figure déjà sur la liste de blocage active, si bien que l’edge arrête ces adresses en ce moment même.314 Cette vérification n’examine aucune autre adresse et s’exécute avant l’examen de l’échantillon ; une rafale intégrée par elle peut donc encore contenir des événements sans blocage ni challenge enregistré, issus d’adresses sous le seuil de blocage ; cette branche dit que les cibles du répondeur sont bloquées, pas que chaque événement a été atténué. La seconde s’applique à une rafale WAF, une salve d’événements de pare-feu sur une zone : elle n’intègre que si chaque événement de l’échantillon, bot ou non, a un blocage ou un challenge enregistré, et si l’échantillon est complet. « A solved or bypassed challenge, log, allow and skip all count as unmitigated. » (Un challenge résolu ou contourné, log, allow et skip comptent tous comme non atténués.)3 Les définitions de Cloudflare expliquent pourquoi ces quatre jouent contre l’intégration : après un challenge, « If successful, Cloudflare accepts the matched request » (en cas de réussite, Cloudflare accepte la requête concernée), et une action log ne fait que « Records matching requests in the Cloudflare Logs. » (consigner les requêtes correspondantes dans les Cloudflare Logs).36 Un constat de scanner persistant, qui ne compte que les événements que l’edge a bloqués ou soumis à un challenge, est intégré pour cette raison par l’intégration WAF, ou par l’intégration par liste de blocage lorsque son adresse figure déjà sur la liste, comme ce fut le cas pour celui du 2 novembre.3 Tout le reste part immédiatement par e-mail.
Règle 4 : l’issue est inscrite sur le constat. La politique veut que chaque alerte critique de la moitié cloud porte une issue enregistrée : intégrée parce que l’adresse est sur la liste de blocage, intégrée parce que l’edge a bloqué ou soumis à un challenge chaque événement échantillonné, envoyée par e-mail, supprimée (dans la limite d’un e-mail par site et par catégorie toutes les deux heures), ou envoi échoué.337 L’enregistrement reste en deçà de la politique. Parmi les alertes critiques datées du 1er novembre en UTC, 118 ne portent aucune issue : 117 ont été produites avant l’existence du champ, et une alerte critique cloud, à 14:13 PST, est venue après ; son exécution était l’une des trois de la section 7 qui se sont terminées environ quatre minutes après leur lancement, et elle s’est arrêtée pendant le blocage automatique, avant qu’une issue soit écrite. Les alertes critiques du scanner local n’en portent jamais ; les trois du 2 novembre n’en ont pas.3738 Depuis le 3 novembre, le moniteur inscrit « pending » (en attente) sur une alerte critique avant l’exécution du blocage automatique, de sorte qu’une exécution interrompue en cours de route laisse un état visible au lieu d’un blanc.14 Le récapitulatif imprime l’issue à côté de chaque alerte critique cloud, sous un intitulé qui le promet : « Every CRITICAL and what became of it » (chaque alerte critique et ce qu’il en est advenu).12 Le champ d’issue est mon mécanisme, pas celui d’Ewaschuk. Sa condition pour un rapport quotidien est une personne désignée pour le trier chaque jour, et ici cette personne, c’est moi ; le champ donne à ce tri quelque chose à vérifier.30 Avec l’issue sur chaque ligne, le récapitulatif répond à la question que j’ai posée le 1er novembre, routine ou menace réelle, une alerte critique à la fois, même si « emailed » (envoyée) ou « folded » (intégrée) dit où est allée une alerte critique, pas que quoi que ce soit a été résolu.
Règle 5 : l’alerte horaire de volume reste. Les notes, encore : « Hourly volume alert (responder): still immediate, at most once an hour » (alerte horaire de volume du répondeur : toujours immédiate, au plus une fois par heure).3 Un blocage isolé relève de la routine ; une soudaine pile de blocages en une heure est ce que la moitié cloud a de plus proche d’un symptôme, un changement dans ce qu’Internet me fait subir. Elle s’est déclenchée une fois le 2 novembre.5
Règle 6 : les alertes critiques du scanner local partent toujours immédiatement. Les notes de conception les gardent immédiates parce qu’elles sont censées être rares.3 Je les garde pour une seconde raison : rien ne s’interpose entre mon Mac et un constat local comme l’edge s’interpose entre mes sites et un scanner. Une liste de blocage peut arrêter une adresse ; rien hors du Mac n’arrête un processus qui tourne dessus. Le coût de cette règle apparaît dans la section 7.
Le jour où les règles sont entrées en vigueur, elles ont réduit le flux de 74 e-mails avant 13:32 à sept journalisés pour le reste de la journée (six alertes critiques et une alerte horaire), plus le récapitulatif envoyé à la main.52 La prévision que j’ai écrite cet après-midi-là disait « Under today’s traffic that would have been 0 immediate emails instead of 16. » (Avec le trafic d’aujourd’hui, cela aurait donné 0 e-mail immédiat au lieu de 16.)1 Elle ne s’est pas vérifiée, et la section 6 explique pourquoi.
5. Le cas d’essai : 2 novembre, de 11:03 à 11:21
Le premier vrai test des règles est arrivé le lendemain matin : une adresse appartenant à un hébergeur néerlandais a lancé un scanner de vulnérabilités sur mon site.12 Voici ce que le moniteur a écrit, mot pour mot depuis son journal en heure locale du Pacifique, l’adresse remplacée par « [the address] » et les lignes intermédiaires omises.4
[2026-11-02 11:03:53] [INFO] New finding [critical]: Request flood from [the address] on blakecrosley.com
[2026-11-02 11:04:02] [RESPOND] [INFO] Block notification: Slack posted, email folded into the daily digest
[2026-11-02 11:04:03] [INFO] Critical alert folded into the daily digest (IP on the block ledger): Request flood from [the address] on blakecrosley.com
[2026-11-02 11:04:04] [INFO] New finding [critical]: Scanner from [the address] on blakecrosley.com
[2026-11-02 11:04:05] [RESPOND] [INFO] Skip: [the address] already has active real block in blakecrosley.com (dedup)
[2026-11-02 11:04:05] [INFO] Critical alert folded into the daily digest (IP on the block ledger): Scanner from [the address] on blakecrosley.com
[2026-11-02 11:09:22] [INFO] New finding [critical]: 726 WAF blocks in 5 minutes
[2026-11-02 11:09:23] [INFO] Critical alert folded into the daily digest (IP on the block ledger): 726 WAF blocks in 5 minutes
[2026-11-02 11:09:44] [INFO] New finding [critical]: Persistent scanner: [the address] blocked 743 times today
[2026-11-02 11:09:47] [RESPOND] [INFO] Block notification: Slack posted, email folded into the daily digest
[2026-11-02 11:09:47] [INFO] Critical alert folded into the daily digest (IP on the block ledger): Persistent scanner: [the address] blocked 743 times today
Minute par minute :
- 11:03:53. Le détecteur de rafales de requêtes produit une alerte critique contre l’adresse. Huit secondes plus tard, à 11:04:01, le répondeur l’ajoute à la liste de blocage, et à 11:04:02 la notification de blocage part sur le chat, son e-mail intégré au récapitulatif.4
- 11:04:03. L’alerte critique elle-même est intégrée : l’adresse figure désormais au registre de blocage, l’edge fait donc déjà le travail qu’un e-mail me demanderait de faire.4
- 11:04:04. Un second détecteur, la vérification de scanner, produit sa propre alerte critique pour la même adresse. La demande de blocage du répondeur est ignorée comme doublon, et l’alerte critique est intégrée une seconde plus tard.4
- 11:09:22. Le détecteur de rafales WAF produit une troisième alerte critique pour la zone. Son auteur figure au registre, et elle est intégrée.411 Seule l’intégration par liste de blocage en décide : huit des événements échantillonnés n’avaient ni blocage ni challenge enregistré, et l’échantillon était plafonné ; l’intégration WAF seule l’aurait donc envoyée par e-mail.11
- 11:09:44. La vérification de scanner persistant, qui compte les événements d’une adresse que l’edge a bloqués ou soumis à un challenge sur l’ensemble de mes zones, produit la quatrième, enregistrée sur un autre de mes sites : 743 événements bloqués ou soumis à un challenge pour l’adresse ce jour-là.12 Le répondeur inscrit l’adresse une seconde fois sur la liste (un défaut, voir plus bas), publie sur le chat et intègre l’alerte critique à 11:09:47.411
- 11:14:58 et 11:20:40. Deux autres alertes critiques de rafale WAF pour la même zone ; toutes deux sont intégrées de la même façon.11
Quatre alertes critiques en 5 minutes 51 secondes, six à 11:20, toutes enregistrées sur leurs constats comme intégrées parce que l’adresse était bloquée.11 Une adresse bloquée, son entrée de liste écrite deux fois parce que la vérification des doublons fonctionnait alors par site (corrigé le 3 novembre), quatre autres demandes de blocage ignorées comme doublons.414 E-mails : zéro. Le journal n’enregistre aucun e-mail envoyé entre 11:03 et 11:21 ; la seule alerte critique de cette fenêtre ni intégrée ni envoyée, supprimée à 11:03:13, était une rafale sur un autre site, venant d’une autre adresse.4
Le récapitulatif suivant l’a présentée en deux lignes dans le tableau des blocages automatiques (le premier blocage, avec sa zone, son motif et son opérateur réseau, et le nouvel ajout par le scanner persistant) et six lignes dans le tableau de toutes les alertes critiques, chacune marquée « blocked » (bloquée) ou « blocked earlier » (bloquée plus tôt).12 Selon ma lecture, c’est le bon poids pour un scanner que le moniteur a bloqué huit secondes après son premier constat, huit minutes après le début du balayage : quelques lignes que je peux lire avec mon café, pas une page qui me réveille.4
Il y a une chose que le cas d’essai ne montre pas, découverte le 3 novembre. Le même scanner envoyait aussi des soumissions au formulaire de contact de mon site, soumissions auxquelles mon application a répondu 200, soit au plus 31 e-mails à elles seules, et qui font l’objet de l’article compagnon, et la vérification de rafale de formulaire du moniteur n’a produit aucun constat en direct ; rejouée sur des données complètes pour les cinq minutes jusqu’à 11:03:23, la même vérification produit le constat, en gravité high (une ligne du récapitulatif, ni e-mail ni blocage), à partir de 39 soumissions, dont 23 refusées.39 L’exécution en direct avait demandé à Cloudflare une fenêtre se terminant à l’instant de la demande, 37 secondes après le début de l’exécution, avant que les événements les plus récents soient entièrement arrivés : elle a compté 1 914 requêtes de l’adresse dans cette fenêtre, là où la rejouée sur données complètes en compte 2 143.439 Ce retard est mesuré sur l’ensemble des requêtes de l’adresse, pas sur les soumissions de formulaire que compte la vérification ; selon ma lecture, le même retard a maintenu ces soumissions sous le seuil de la vérification en direct. Et chaque exécution regardait exactement cinq minutes en arrière alors que les exécutions démarraient à environ 5,6 à 5,8 minutes d’intervalle, si bien qu’une partie de chaque intervalle n’était jamais balayée.3917 Le correctif est entré en vigueur le jour même : chaque fenêtre commence désormais là où la précédente s’est terminée et se termine 90 secondes avant l’exécution, sauf si l’enregistrement précédent manque, date de moins d’une minute ou de plus de 15 minutes, comme après une mise en veille du Mac, auquel cas l’exécution revient à un simple regard de cinq minutes en arrière.39 Rejouer la fenêtre du 2 novembre à travers le code modifié donne les mêmes constats ; le changement n’a donc pas perturbé la détection sur une fenêtre fixe. Une rejouée ne peut pas mettre à l’épreuve l’enchaînement des fenêtres ni le retard, qui n’agissent que sur les exécutions en direct ; les exécutions en direct à partir du 3 novembre en sont le test.39
6. Ce qui part encore par e-mail, et pourquoi
Le 2 novembre a été la première journée complète sous les nouvelles règles, et elle a envoyé 19 e-mails, pas un : 14 alertes critiques, une alerte horaire de volume, un récapitulatif et trois du scanner local.5 Aucun e-mail par blocage n’est parti ; 108 notifications de blocage ont été intégrées au récapitulatif à la place, 177 alertes critiques ont été intégrées, et 37 autres ont été supprimées par la limite de deux heures, le tout compté par jour local. Les décomptes d’issues plus loin dans cet article suivent la date UTC, d’où l’écart entre ces chiffres.5
E-mails par jour local et par flux ; le 31 octobre ne couvre que les 89 minutes suivant le début du journal.5
Chaque alerte critique cloud envoyée par e-mail après le changement de 13:50 et jusqu’à la fin du 2 novembre, 20 en tout (six dans le reste du 1er novembre, quatorze le 2 novembre), était une rafale WAF sur resumegeni.com ou blakecrosley.com dans laquelle au moins un événement n’avait ni blocage ni challenge enregistré.13 L’intégration WAF a correctement refusé chacune selon sa propre règle : un événement non atténué figurait dans l’échantillon, le moniteur ne pouvait donc pas affirmer que l’edge l’avait traité.3 Dans ces rafales, aucune adresse n’avait assez d’événements pour être éligible au blocage automatique, si bien que l’intégration par liste de blocage n’avait aucune adresse à vérifier.13 Le récapitulatif nomme ce groupe de la même façon : « a CRITICAL that was neither blocked nor already handled by the WAF » (une alerte critique ni bloquée ni déjà traitée par le WAF).12
Les objets de ces e-mails racontaient une autre histoire, et c’était un défaut. Le résumé de rafale indiquait « N WAF blocks in 5 minutes » (N blocages WAF en 5 minutes), mais N comptait chaque événement de pare-feu non-bot de la fenêtre, quelle que soit l’action prise par l’edge.13 Deux exemples tirés des constats, en heure locale :
| Quand (PT) | Site | L’objet disait | Bloqués | Soumis à un challenge | Non atténués |
|---|---|---|---|---|---|
| 1er nov., 16:51 | blakecrosley.com | « 104 WAF blocks in 5 minutes » | 0 | 0 | 117 sur 117 événements |
| 1er nov., 22:45 | resumegeni.com | « 108 WAF blocks in 5 minutes » | 18 | 62 | 99 sur 179 événements |
Le premier e-mail annonçait 104 blocages alors que l’edge n’avait rien bloqué.13 Selon ma lecture, un objet qui dit « blocks » à propos d’événements sans blocage enregistré est pire que du bruit : il dit à l’unique lecteur que le système a traité ce qu’il n’a peut-être pas traité. Mon premier correctif, le 3 novembre, le jour même de ces décomptes, était lui-même faux. Il gardait le compte non-bot pour N et comptait bloqués, soumis à un challenge et le reste sur tous les événements, si bien que la salve de 16:51 aurait affiché 104 WAF events in 5 minutes: 0 blocked, 0 challenged, 117 through, deux populations sur une seule ligne. La relecture de cet article l’a repéré, et je l’ai corrigé une nouvelle fois le même jour.14 Le résumé de rafale, et avec lui l’objet de l’e-mail, compte désormais une seule population, chaque événement de pare-feu échantillonné, et se lit N WAF events in 5 minutes: B blocked, C challenged, U unmitigated (S from non-bot user agents) ; un challenge JavaScript compte comme challenge, et le motif du blocage automatique se lit N WAF events from this address in 5 min.14 Pour la salve de 16:51, cela donne 117 WAF events in 5 minutes: 0 blocked, 0 challenged, 117 unmitigated (104 from non-bot user agents).1314 L’intégration WAF reposait déjà sur les événements non atténués ; l’objet et la décision comptent donc désormais la même chose. Le correctif change ce que disent les 14 objets. Il ne change pas combien ont été envoyés, et 19 reste le chiffre honnête pour le 2 novembre.
La prévision que j’ai écrite le 1er novembre a manqué sa cible parce que sa prémisse était fausse. Elle affirmait que les nouvelles règles « would have been 0 immediate emails instead of 16 » (auraient donné 0 e-mail immédiat au lieu de 16), en partant du principe que, pour les sept alertes critiques postérieures à 00:30 ce matin-là, « Cloudflare had already blocked every one of those requests. » (Cloudflare avait déjà bloqué chacune de ces requêtes).1 Les constats disent autre chose pour celles-là aussi : les cinq que le journal montre envoyées après 00:30 enregistrent chacune au plus un blocage et neuf challenges, face à 76 à 89 événements dans leurs résumés.13 Et dans chacune des six alertes critiques envoyées cet après-midi-là et ce soir-là, l’edge n’avait bloqué ou soumis à un challenge qu’une partie des événements (aucun dans la salve de 16:51) ; même la règle de 13:50, qui n’intégrait que lorsque blocages et challenges couvraient chaque événement non-bot, les aurait donc toutes envoyées.131 Dix minutes après le changement de 13:50, un second changement a fait compter à l’intégration WAF chaque événement, user agent de bot ou non, et ne faire confiance qu’à un échantillon complet ; il a rendu la règle plus stricte, mais ce n’est pas pour cela que la prévision a manqué.183 La prévision comptait les blocages auxquels je croyais ; la règle comptait les événements qui étaient là.
Ce que je ne sais pas, c’est si ces 14, les alertes critiques du 2 novembre parties par e-mail, méritaient un e-mail. Les constats enregistrent combien d’événements étaient non atténués, c’est-à-dire sans blocage ni challenge enregistré, mais pas quelles actions ils portaient : une règle log, un skip, un allow, ou un challenge résolu par un client.13 Un événement non atténué n’est pas non plus une requête qui a atteint mon site. Cloudflare indique que « A single HTTP request can generate one or more security events when it triggers security features » (une seule requête HTTP peut générer un ou plusieurs événements de sécurité lorsqu’elle déclenche des fonctionnalités de sécurité), et classe log et skip parmi les actions qui ne mettent pas fin à l’évaluation des règles comme le fait un blocage ; selon ma lecture, une autre règle peut donc encore agir sur la même requête.2436 Le tutoriel GraphQL de Cloudflare montre le champ action et des valeurs d’exemple comme "log" et "block", mais ne liste pas toutes les valeurs que le champ peut prendre.23 Le tableau de bord Security Events de Cloudflare échantillonne lui aussi : « For large volumes of traffic, Cloudflare uses sampling to return results faster. » (Pour de gros volumes de trafic, Cloudflare utilise l’échantillonnage afin de renvoyer les résultats plus vite.)24 Tant que le moniteur n’enregistre pas les actions derrière chaque événement non atténué et ne relie pas les événements aux requêtes, je ne peux pas dire lesquels de ces e-mails décrivaient un trafic que l’edge a laissé passer, et c’est cette réponse qui décide s’ils méritent un e-mail.
Les trois e-mails locaux du 2 novembre sont l’autre point en suspens. Ils signalent à 13:50 une « Browser -> shell chain » (chaîne du navigateur vers un shell) dans laquelle un shell a lancé curl, et ils restent non résolus dans les constats.40 Je n’ai pas vérifié s’il s’agissait de l’outillage d’agent que je faisais tourner cet après-midi-là ou d’autre chose ; je ne les compte donc pas comme de fausses alertes.
7. Deux faux signaux
Le mineur de cryptomonnaie qui était Spotlight
À 10:03 le 1er novembre, le scanner local a produit une alerte critique, « High CPU unsigned process - possible crypto miner » (processus non signé à forte consommation CPU, possible mineur de cryptomonnaie), contre spotlightknowledged, le propre démon Spotlight d’Apple, à 74,9 % de CPU, et deux secondes plus tard a journalisé « Critical email sent. »15 Le bug était le mien. La vérification cherchait l’expression « valid on disk » dans la sortie de la commande d’affichage de la signature de code, codesign -d. Les notes du scanner consignent désormais le défaut en une proposition : l’expression est une expression « which only codesign -v prints, so every process read as unsigned » (que seul codesign -v affiche, si bien que chaque processus apparaissait comme non signé).25 Une liste d’exclusion avait masqué le défaut jusqu’à ce qu’un démon d’un framework Apple s’emballe, et mon journal de ce jour-là le dit.1 Le constat porte maintenant sa résolution : « false positive, Apple platform binary » (faux positif, binaire de la plateforme Apple).41
Cela a coûté un e-mail, le seul e-mail local du 1er novembre.5 Les 16 alertes critiques locales qui l’ont précédé, le 31 octobre et le 1er novembre, ont signalé Xcode, le Python de Homebrew, mes propres builds d’applications, des modifications de hooks, des shims de gestionnaires de versions dans le chemin d’accès, un motif de ver IA qui correspondait aux instructions d’agent d’un autre projet, et une vérification d’event tap qui correspondait à sa propre requête ; elles ont produit 15 tentatives d’envoi, et chacune a échoué.5251915 Le service d’envoi se trouve derrière Cloudflare, qui répondait au user agent par défaut de Python par l’erreur 1010 avant même que la clé soit lue ; je l’ai reproduit avec une clé volontairement erronée.19 La page de Cloudflare consacrée à cette erreur nomme ce client directement, dans sa note sur les hôtes Pages et Workers : « a User-Agent header that Browser Integrity Check treats as a non-browser client (for example, the default Python urllib user agent). » (un en-tête User-Agent que Browser Integrity Check traite comme un client non navigateur, par exemple le user agent par défaut de Python urllib).42 Un expéditeur cassé m’a épargné 15 e-mails sur mes propres outils et mes propres changements.15 Les notes du scanner énoncent la leçon plus large sans détour : « most of the CRITICALs it raised in its first live days were its own noise. » (la plupart des alertes critiques de ses premiers jours en service étaient son propre bruit).25 Je garde malgré tout les alertes critiques locales immédiates, et je corrige chaque fausse alerte dans sa vérification plutôt que de couper le flux.
RUNS SHORT 162/207
Le premier récapitulatif planifié, le matin du 2 novembre, portait l’objet « Mon Nov 2: 71 blocks on 15 zones, 11 criticals emailed, RUNS SHORT 162/207 » (lun. 2 nov. : 71 blocages sur 15 zones, 11 alertes critiques envoyées, exécutions manquantes 162/207).16 La règle du récapitulatif était de l’arithmétique simple : le nombre d’exécutions attendu est le nombre de minutes de la fenêtre divisé par cinq, et l’objet signale un déficit.35 La fenêtre allait du 1er novembre 13:48 au 2 novembre 07:05, soit 1 036,5 minutes, donc 207 créneaux de cinq minutes ; le journal a enregistré 162 exécutions.17
Mon journal du 2 novembre expliquait l’écart en une ligne : « The RUNS SHORT line is the Mac asleep » (la ligne RUNS SHORT, c’est le Mac en veille), sans défaillance du moniteur.43 Cette ligne a raison de dire que le moniteur n’a pas failli (aucune exécution du 2 novembre n’est restée inachevée) et tort sur la cause, le 2 novembre comme sur la fenêtre que décrivait le chiffre. L’analyse des écarts entre exécutions répartit approximativement les 45 créneaux manquants : environ 25 perdus à la cadence, environ 16 à la veille, environ un de plus dans un long écart après une exécution terminée prématurément, et trois exécutions qui ne se sont jamais enregistrées.17
| Cause | Créneaux, environ | Éléments |
|---|---|---|
| La cadence réelle | 25 | 160 écarts ordinaires entre exécutions, médiane 5,60 minutes, jamais sous 5,35 ; ils remplissent 926,0 minutes, soit 185 créneaux de cinq minutes |
| Veille | 16 | trois écarts de plus de 10 minutes, 93,0 minutes en tout, à l’intérieur des périodes de veille d’inactivité du journal d’alimentation, les exécutions reprenant pendant de brefs réveils de maintenance |
| Un long écart après un arrêt prématuré | 1 | le quatrième écart de plus de 10 minutes, 10,0 minutes après l’exécution de 14:19 terminée prématurément |
| Des exécutions qui ne se sont jamais enregistrées | 3 | 165 démarrages d’exécution contre 162 exécutions enregistrées |
| Derrière ces trois-là | trois exécutions terminées environ quatre minutes après leur démarrage sans ligne de fin journalisée, d’après la chronologie le watchdog de 240 secondes, toutes le 1er novembre : deux fois l’après-midi et une fois tard ce soir-là |
Le journal d’alimentation montre une veille d’inactivité à 23:21:30 et un réveil complet à 00:30:05, puis de nouveau une veille d’inactivité à 06:01:20 et un réveil complet à 06:30:28.44 Les trois exécutions ont démarré à 14:09, 14:19 et 23:10 le 1er novembre ; chacune s’est terminée environ quatre minutes plus tard sans ligne de fin journalisée, ce qui, selon ma lecture, est le watchdog de 240 secondes. Une quatrième exécution s’est terminée 28 secondes après son démarrage sans cause visible.1738 Sur la journée calendaire du 2 novembre, 242 exécutions ont démarré face à 288 créneaux de cinq minutes, soit 46 de moins, et aucune n’est restée inachevée ; seuls deux écarts ont dépassé 10 minutes, 35,8 minutes en tout ; ce jour-là aussi, l’essentiel du déficit venait donc de la cadence, pas de la veille.17
L’hypothèse fausse était la mienne, dans le récapitulatif : un planificateur réglé sur cinq minutes livrait une exécution environ toutes les 5,6 à 5,8 minutes même Mac éveillé, si bien que l’arithmétique à cinq minutes qualifierait de déficitaire une journée saine.17 Je n’ai pas établi pourquoi la cadence en éveil est plus lente. J’ai remplacé l’arithmétique le 3 novembre. L’état des exécutions indique désormais les exécutions enregistrées, la médiane des minutes qui les séparent et le plus long écart avec son heure, et l’objet ne signale qu’un écart de plus de 20 minutes. L’aperçu de ce matin-là indiquait « about one every 5.6 min » (environ une toutes les 5,6 minutes), et son objet se terminait par « RUN GAP 31 min at 05:56 » (écart d’exécution de 31 minutes à 05:56).14 Un écart est un symptôme sur lequel je peux agir : le Mac s’est mis en veille, ou le moniteur s’est arrêté. Un ratio rapporté à une cadence que le planificateur n’a jamais tenue n’était ni l’un ni l’autre.
Les règles que j’ai gardées
- Comptez le courrier avant de le changer, par flux, avec une règle énoncée. Mon tableau et le décompte du journal ne se sont accordés sur 74 que parce que j’avais d’abord écrit ce qui comptait comme un e-mail.12
- Ne journalisez « sent » que lorsque le service d’envoi dit oui. Pour 22 de mes 74 e-mails, je peux prouver une tentative et rien de plus.26
- Un blocage déjà effectué par l’edge est une ligne de journal, pas une alerte. Les trois sorties du livre SRE l’y rangent, et déplacer 55 e-mails par blocage vers le chat ne m’a rien fait perdre sur quoi j’aurais agi.75
- Envoyez un récapitulatif quotidien même quand rien ne s’est passé. Un récapitulatif qui arrive toujours est le signal de vie ; son absence est l’alerte.35
- N’intégrez une alerte critique que sur une condition que l’edge prouve. Les miennes sont : les adresses blocables du constat déjà sur la liste de blocage, et un échantillon complet dans lequel chaque événement a un blocage ou un challenge enregistré ; la seconde explique pourquoi 14 alertes sont encore parties par e-mail le 2 novembre.313
- Inscrivez l’issue sur chaque alerte critique du cloud. Un rapport quotidien dont personne n’est responsable revient, selon les mots d’Ewaschuk, à des « less-spammy email alerts » (alertes e-mail un peu moins envahissantes) ; l’issue sur chaque ligne est ce que vérifie mon tri quotidien.3012
- Faites dire à l’objet ce que l’edge a fait. « 104 WAF blocks » sur une salve sans aucun blocage a été ma pire ligne de la semaine.13
- Signalez des écarts, pas des ratios rapportés à un calendrier. Une minuterie de cinq minutes livrait une exécution environ toutes les 5,6 minutes ; 162/207 ressemblait donc à une panne et n’était, pour l’essentiel, qu’une horloge.17
- Corrigez une fausse alerte dans sa vérification, pas dans la boîte de réception. Une sortie de commande mal lue a fait du démon Spotlight d’Apple un mineur de cryptomonnaie ; le correctif est allé dans la vérification.25
Ce qui pourrait changer
- Si les événements non atténués se révèlent être des challenges résolus, cela seul ne ferait pas du bruit des alertes critiques de rafale WAF qui partent encore par e-mail. Quand un client réussit un challenge, « Cloudflare accepts the matched request » (Cloudflare accepte la requête concernée) : la requête poursuit son chemin, ce qui ne montre ni qu’elle était inoffensive ni que rien n’appelle de réponse. Intégrer ces alertes critiques exigerait des preuves au niveau des requêtes, rattachées aux mêmes événements, montrant que rien en elles ne demandait une personne, et la réussite d’un challenge ne constitue pas à elle seule une telle preuve. S’il s’agit de règles
logouskip, la question est de savoir si ces règles font ce que je voulais, et chaque e-mail mérite d’être lu tant que je ne le sais pas. Le moniteur n’enregistre pas encore lequel des deux.1336 - Si les e-mails critiques d’une journée remontent vers plusieurs dizaines, c’est que la limite de deux heures par site et par catégorie fait le travail qu’une règle devrait faire, et la règle mérite d’être revue.3
- Si le récapitulatif cesse d’arriver, quelque chose s’est arrêté entre le moniteur et ma boîte de réception : le moniteur, le Mac sur lequel il tourne, l’expéditeur ou le chemin de remise, puisqu’un envoi accepté n’est pas encore un envoi remis. C’est le seul silence que la conception traite comme une invitation à aller voir.3520
- Si le scanner local produit une alerte critique que je ne peux pas expliquer par mon propre outillage, l’e-mail immédiat était le bon choix ; les trois constats de chaîne vers un shell non résolus du 2 novembre en sont le test en cours.40
- Si j’ajoute un lecteur, les pages et les tickets ne sont plus la même personne, et la distinction du livre SRE entre alertes et tickets exigerait une file de tickets, pas ma boîte de réception.7
Points clés
Si vous faites tourner un moniteur pour vous-même
- J’ai cessé de lire quelque part en deçà de 74 e-mails en une demi-journée, un chiffre que ma boîte de réception a atteint en début d’après-midi.1
- Un récapitulatif quotidien qui arrive aussi les jours calmes est un signal de vie gratuit ; un moniteur qui ne parle que lors d’événements ne peut pas vous dire qu’il est mort.35
- Vos journaux disent peut-être « sent » pour du courrier qui n’est jamais parti. Vérifiez le code avant de vous fier au décompte.619
Si vous en construisez un
- Agissez d’abord, décidez ensuite s’il faut prévenir : bloquez, puis intégrez l’alerte si la liste de blocage ou l’edge la couvre déjà.3
- Enregistrez l’issue de chaque alerte critique sur le constat et imprimez-la dans le récapitulatif, afin que la personne qui, selon Ewaschuk, doit trier un rapport quotidien ait quelque chose à vérifier ; sur mon moniteur, cette personne, c’est moi.3012
- Nommez les événements d’après ce que l’edge a enregistré pour eux (bloqués, soumis à un challenge, non atténués), comptez une seule population par ligne, et ne les nommez jamais d’après ce que vous espériez que l’edge ait fait.1314
- Mesurez le planificateur que vous avez réellement. Le mien tournait toutes les 5,6 minutes avec une minuterie de cinq minutes.17
Si c’est vous qui lisez la boîte de réception
- Demandez de chaque alerte si elle est « urgent, important, actionable, and real » (urgente, importante, actionnable et réelle) ; tout ce qui échoue à ce test relève d’un récapitulatif ou d’un journal.29
- Ma prévision du premier jour a manqué sa cible : elle annonçait zéro alerte critique immédiate, et le lendemain en a envoyé 14.15
Questions fréquentes
Qu’est-ce que la fatigue d’alerte ?
La fatigue d’alerte, c’est ce qui arrive aux personnes qui reçoivent trop d’alarmes ne leur demandant rien : elles deviennent, selon les mots de The Joint Commission, « desensitized or immune to the sounds » (insensibles ou immunisées aux sons), et se mettent à baisser ou à couper les alarmes.10 Le livre SRE de Google décrit la même chose en exploitation, où les gens « second-guess, skim, or even ignore incoming alerts, sometimes even ignoring a “real” page that’s masked by the noise. » (doutent, survolent ou ignorent les alertes entrantes, au point parfois d’ignorer une « vraie » page masquée par le bruit).27 Mon propre cas a pris une journée : 74 e-mails à 13:32, dont aucun, selon ma lecture de cet après-midi-là, ne me demandait d’agir.1
Combien d’alertes de sécurité par jour, c’est trop ?
Pour une personne, la réponse honnête du chapitre SRE est : quelques-unes. « I can only react with a sense of urgency a few times a day before I become fatigued. » (Je ne peux réagir dans l’urgence que quelques fois par jour avant de m’épuiser.)8 L’enquête du fournisseur Vectra rapporte des équipes qui reçoivent en moyenne 4 484 alertes par jour et qui, de leur propre aveu, en ignorent 67 %.34 Pour mon moniteur tenu par une seule personne, la réponse de travail est un récapitulatif par jour plus les alertes qui ont besoin d’un humain maintenant ; le 2 novembre, cela faisait encore 19, et je traite les 14 alertes critiques de rafale WAF parmi elles comme une question ouverte plutôt que comme un coût acquis.513
Les alertes de sécurité doivent-elles passer par un récapitulatif quotidien ou en temps réel ?
Les deux, réparties selon ce que l’humain doit faire. Tout ce que le moniteur considère comme déjà traité (une adresse qu’il a placée sur la liste de blocage, ou une rafale dont chaque événement échantillonné a été bloqué ou soumis à un challenge) va dans le récapitulatif ; le reste part immédiatement, dans la limite de deux heures.3 Ewaschuk admet qu’un rapport quotidien « can work too » (peut aussi fonctionner), à une condition : sans responsabilité, il « amounts to less-spammy email alerts » (revient à des alertes e-mail un peu moins envahissantes), et il veut quelqu’un de « designated to triage these every day » (désigné pour les trier chaque jour).30 Sur mon moniteur, c’est moi, et mon récapitulatif imprime ce qu’il est advenu de chaque alerte critique cloud pour que le tri ait quelque chose à vérifier.12
Qu’est-ce qu’une alerte de type heartbeat ?
Un heartbeat (signal de vie) est un message qui arrive selon un calendrier, qu’il se soit passé quelque chose ou non, de sorte que son absence signifie qu’une chose s’est cassée. Mon récapitulatif quotidien est ce signal de vie : « it goes out on a quiet day too » (il part aussi les jours calmes) ; un moniteur qui a cessé de tourner se manifeste donc par un e-mail manquant.35 Il en va de même d’un envoi échoué ou d’une remise perdue ; un récapitulatif manquant invite donc à vérifier le moniteur, l’hôte sur lequel il tourne, l’expéditeur et le chemin de remise.20 Sa section sur l’état des exécutions indique aussi le plus long écart entre exécutions et signale dans l’objet tout écart de plus de 20 minutes.14
Pourquoi les alertes WAF de Cloudflare inondent-elles ma boîte e-mail ?
La mienne a été inondée parce que chaque blocage et chaque alerte critique devenait un message à part entière, et qu’Internet balaie chaque zone publique toute la journée.5 Les Alerts de Cloudflare, « Monitors that you define yourself, and Platform Notifications » (des Monitors que vous définissez vous-même, et des Platform Notifications), peuvent être remises par e-mail et se paramètrent dans son tableau de bord ; un moniteur que vous construisez vous-même sur son API, comme le mien, n’est ni l’un ni l’autre et hérite de tout envoi par événement que vous y avez écrit.26 Vérifiez aussi ce que compte une alerte : les actions de Cloudflare incluent log et skip, qui ne mettent pas fin à l’évaluation des règles comme un blocage, et un challenge résolu par un client se termine par l’acceptation de la requête par Cloudflare ; « WAF events » (événements WAF) et « WAF blocks » (blocages WAF) sont donc des chiffres différents.36 Mes objets ont confondu les deux jusqu’au 3 novembre.1314
Un 2xx de l’API d’e-mail signifie-t-il que l’alerte a été remise ?
Non. L’événement email.sent de Resend « Occurs whenever the API request was successful. Resend will attempt to deliver the message to the recipient’s mail server » (se produit chaque fois que la requête API a réussi ; Resend tentera alors de remettre le message au serveur de messagerie du destinataire), et la remise est un événement distinct.20 Un 2xx signifie que le service a accepté le message. Journalisez le code de statut, et traitez la remise comme une autre question.6
À lire aussi sur ce site : Pourquoi le spam a battu mon formulaire de contact à débit limité suit le même scanner du 2 novembre du côté du formulaire de contact ; Ce que je lance avant de dormir est la vérification nocturne de la production, l’autre routine qui tourne pendant que je ne regarde pas ; Ce qui casse vraiment quand des agents IA tournent sans supervision nomme les modes de défaillance des sessions d’agent sans surveillance, chacun avec un signal de détection ; Chaque hook est une cicatrice relie chacun de mes hooks d’agent à l’échec qui l’a fait naître, la même habitude que corriger une fausse alerte dans sa vérification ; Le mode auto de Claude Code n’est pas une frontière de sécurité soutient que le mur autour d’un agent compte plus que son classificateur ; et L’observabilité des agents IA plaide pour voir ce que les agents font au disque, au CPU et au réseau.
Sources
Toutes les heures des données propres à l’auteur sont en heure locale du Pacifique sauf mention UTC ; le 1er novembre, l’heure est passée de PDT à PST à 02:00. Les pages publiques ont été consultées le 3 novembre 2026, aux heures UTC indiquées.
-
Journal d’exploitation de l’auteur (Captain’s Log) du 1er novembre 2026 : le message de 13:32 PT ; le tableau des 74 e-mails depuis minuit par flux (55 par blocage, 16 critiques, 2 horaires de volume, 1 local) ; la règle d’intégration de 13:50 (blocages et challenges couvrant chaque événement non-bot) ; la répartition des alertes critiques notée « 9 before the fold went live at 00:30 PT; the 7 after », avec la conviction que « Cloudflare had already blocked every one of those requests » ; « Yesterday had 10 » ; le premier récapitulatif envoyé à la main à 13:48 PT ; la prévision « Under today’s traffic that would have been 0 immediate emails instead of 16 » ; et la note selon laquelle la liste d’exclusion avait masqué le bug de signature de code. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Données de l’auteur : le décompte des e-mails tiré par script des journaux du moniteur, arrêté à 13:32 PT le 1er novembre : 74 (55 par blocage, 16 critiques, 2 horaires de volume, 1 local), dont 22 (10 par blocage, 11 critiques, 1 horaire) venaient des expéditeurs qui journalisaient « sent » sans condition ; 81 pour l’ensemble de la journée locale. La liste ligne à ligne du même script place 11 lignes critiques « sent » avant 00:30 et 5 après, et la première alerte critique intégrée à une notification de blocage à 00:54:43. ↩↩↩↩↩↩↩↩↩
-
Notes de conception de l’auteur pour le moniteur, section notifications, au 3 novembre 2026 : « Every one described routine mass-scanning the edge had already stopped » (chacun décrivait un balayage de masse de routine que l’edge avait déjà arrêté) ; « Per block: Slack only » ; les deux conditions d’intégration et leur ordre ; « A solved or bypassed challenge, log, allow and skip all count as unmitigated » ; l’alerte horaire de volume maintenue immédiate ; les alertes critiques du scanner local maintenues immédiates parce qu’elles sont censées être rares. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Données de l’auteur : le journal du moniteur du 2 novembre 2026, de 11:03 à 11:21 PT : les lignes citées dans la section 5 (adresse remplacée), les écritures dans la liste de blocage à 11:04:01 et 11:09:46 avec une expiration à sept jours, quatre demandes de blocage en double ignorées, les publications sur le chat, et aucune ligne d’e-mail dans la fenêtre hormis une rafale supprimée sur un autre site à 11:03:13 ; l’exécution qui a produit la première alerte critique a démarré à 11:02:46 et sa fenêtre de détection s’est terminée à 11:03:23, 37 secondes plus tard, et son motif de blocage comptait 1 914 requêtes de l’adresse dans cette fenêtre. Les premières requêtes du balayage ont atteint le site à 10:56 PT, huit minutes avant le blocage (journal d’exploitation de l’auteur du 2 novembre et comptes de requêtes par minute de Cloudflare pour l’adresse). ↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Données de l’auteur : le décompte des e-mails tiré par script des six journaux du moniteur du 31 octobre au 2 novembre 2026 (la moitié cloud et le scanner local), un e-mail par ligne enregistrant une remise au service d’envoi. Par jour local : 31 octobre (le journal commence à 22:31), 10 (4 par blocage, 6 critiques, tous issus des expéditeurs qui journalisaient « sent » sans condition ; 3 alertes critiques supprimées par la limite de deux heures ; 13 envois locaux échoués) ; 1er novembre, 81 journalisés (55 par blocage, 22 critiques, 3 horaires de volume, 1 local ; 2 envois locaux échoués) plus un récapitulatif envoyé à la main ; 2 novembre, 19 (14 critiques, 1 horaire de volume, 1 récapitulatif, 3 locaux). Non envoyés le 2 novembre : 108 notifications de blocage et 177 alertes critiques intégrées au récapitulatif, 37 alertes critiques supprimées. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Code de l’auteur : les expéditeurs du moniteur tels qu’armés le 31 octobre 2026, qui jetaient la réponse à la requête d’envoi puis journalisaient « sent » sans condition, et le changement du 1er novembre à 01:04 PDT, avant le recul des horloges, après lequel les expéditeurs de la moitié cloud journalisent le statut HTTP du service d’envoi et n’écrivent « sent » que sur un 2xx ; l’expéditeur du scanner local écrit une simple ligne « Critical email sent », et seulement quand la requête n’a levé aucune erreur. ↩↩↩↩↩↩
-
Benjamin Treynor Sloss, “Introduction,” chapitre 1 de Site Reliability Engineering: How Google Runs Production Systems (Google, publié par O’Reilly Media), consulté à 14:19:33Z : les trois types de sorties de supervision valables (alertes, tickets, journalisation), cités, et le passage qualifiant l’alerte du type « lire un e-mail puis décider » de « fundamentally flawed ». ↩↩↩↩↩↩
-
Rob Ewaschuk, “Monitoring Distributed Systems,” chapitre 6 de Site Reliability Engineering (Google, O’Reilly Media), consulté à 14:18:54Z : « Every page should be actionable », la ligne sur l’urgence et la ligne sur la réponse machinale, citées. ↩↩↩
-
Ewaschuk, “Monitoring Distributed Systems,” consulté à 14:18:54Z : la définition d’une alerte et la note 22 sur les alertes par e-mail (« alert spam »), citées. ↩↩
-
The Joint Commission, “Medical device alarm safety in hospitals,” Sentinel Event Alert numéro 50, 8 avril 2013, lue depuis la capture de la Wayback Machine du 13 novembre 2024, consultée à 14:21:49Z (l’URL de l’éditeur lui-même répondait 403) : les signaux d’alarme par patient et par jour ; l’estimation de 85 à 99 %, que l’alerte attribue à l’AAMI et qui couvre les alarmes ne nécessitant aucune intervention clinique sans en isoler les fausses ; les passages sur la désensibilisation et sur la baisse du volume ; 98 événements liés aux alarmes de janvier 2009 à juin 2012, dont 80 ayant entraîné un décès ; et « the most common contributing factor », cité d’après la liste de l’alerte recensant les facteurs au-delà de ceux signalés à sa base de données Sentinel Event, distincte de la liste des facteurs signalés à la base elle-même. ↩↩↩↩↩
-
Données de l’auteur : les six constats critiques concernant le scanner du 2 novembre dans le fichier de constats du moniteur (11:03:53 rafale de requêtes, 11:04:04 scanner, 11:09:22 rafale WAF, 11:09:44 scanner persistant, 11:14:58 et 11:20:40 rafale WAF), chacun enregistré comme intégré parce que l’adresse était sur la liste de blocage ; la rafale WAF de 11:09:22 enregistre aussi huit événements échantillonnés sans blocage ni challenge enregistré, et un nombre d’événements de pare-feu égal à la limite d’échantillon du moniteur, son échantillon était donc plafonné. ↩↩↩↩↩↩
-
Données de l’auteur : le récapitulatif suivant tel que le mode aperçu du programme de récapitulatif l’a rendu le 3 novembre 2026 (fenêtre du lundi 2 novembre, 07:05, au mardi 3 novembre, 06:17 PST ; l’aperçu n’envoie rien) : ses sections, les paliers de 10 minutes du scanner local, la liste de blocage à l’échelle du compte appliquée sur chaque zone pendant sept jours, le tableau des blocages automatiques avec l’opérateur réseau (un hébergeur néerlandais pour le scanner du 2 novembre), le texte de l’intitulé « Criticals that emailed you » (alertes critiques qui vous ont été envoyées) et le tableau « Every CRITICAL and what became of it ». ↩↩↩↩↩↩↩↩↩↩↩↩
-
Données de l’auteur : chaque alerte critique enregistrée comme envoyée depuis le changement de 13:50 PST le 1er novembre, date à laquelle commence le champ d’issue, jusqu’à la fin du 2 novembre PST, 20 en tout (15 datées des 1er et 2 novembre UTC et cinq datées du 3 novembre UTC, envoyées à 16:42, 17:58, 20:34, 21:07 et 23:08 PST), d’après le fichier de constats avec les détails qui ont décidé de chacune : toutes des rafales WAF sur resumegeni.com ou blakecrosley.com avec des événements sans blocage ni challenge enregistré ; les six du 1er novembre avec les événements non-bot que l’edge a bloqués ou soumis à un challenge (le compte acted des constats) inférieurs au nombre d’événements (5 sur 83, 95 sur 153, 0 sur 104, 67 sur 128, 54 sur 135, 80 sur 108) ; deux du 2 novembre sans aucun blocage (05:55 PST, 26 soumis à un challenge ; 12:06 PST, 204 soumis à un challenge) ; pour les 20, le journal du moniteur ne montre aucune adresse isolée avec assez d’événements pour un blocage ; les deux lignes du tableau de la section 6 (2026-11-02T00:51:04Z et 06:45:59Z) ; le texte de résumé qui comptait chaque événement de pare-feu non-bot comme un « WAF block » ; pour la salve de 16:51, 104 événements non-bot et 117 événements en tout, aucun bloqué ni soumis à un challenge ; et, pour les cinq alertes critiques que le journal montre envoyées entre 00:30 et 13:32 PT le 1er novembre, les comptes de blocages et de challenges des constats (0 et 0 sur 79 événements, 0 et 9 sur 81, 1 et 0 sur 89, 1 et 9 sur 84, 0 et 5 sur 76) ; les constats n’enregistrent pas quelles actions portaient ces événements. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Code et données de l’auteur, 3 novembre 2026 : le modèle de résumé de rafale WAF du moniteur, d’abord réécrit ce matin-là en
N WAF events in 5 minutes: B blocked, C challenged, U throughavec N le compte non-bot, puis, après la relecture de cet article, enN WAF events in 5 minutes: B blocked, C challenged, U unmitigated (S from non-bot user agents)sur chaque événement échantillonné, les challenges JavaScript comptés comme challenges ; son motif de blocage automatiqueN WAF events from this address in 5 min; l’issue « pending » inscrite sur une alerte critique avant l’exécution du blocage automatique, que le récapitulatif imprime comme une exécution interrompue avant la fin du chemin d’alerte ; l’ensemble d’adresses de l’intégration par liste de blocage (l’adresse propre au constat et les adresses éligibles au blocage automatique) et sa place avant l’intégration WAF ; la vérification des doublons du blocage automatique, qui fonctionnait jusque-là par site et a donc inscrit deux fois l’adresse du 2 novembre sur la liste, passée ce jour-là à une vérification par adresse (les notes de conception du moniteur pour cette version et le journal d’exploitation du 3 novembre) ; la règle d’état des exécutions du récapitulatif (exécutions enregistrées, médiane des minutes entre exécutions, plus long écart avec son heure, signalement dans l’objet seulement pour un écart de plus de 20 minutes) ; et l’aperçu de ce matin-là, qui indiquait « about one every 5.6 min » et « RUN GAP 31 min at 05:56 ». ↩↩↩↩↩↩↩↩↩↩↩ -
Données de l’auteur : le journal du scanner local du 1er novembre 2026 : le constat critique de 10:03:04 contre
spotlightknowledgedd’Apple à 74,9 % de CPU et la ligne « Critical email sent » de 10:03:06 ; les deux alertes critiques antérieures de ce jour-là (00:48:55, les shims du chemin d’accès), chacune suivie d’un envoi échoué ; et les 14 alertes critiques du journal du 31 octobre, parmi lesquelles le motif de ver IA à 22:52:57 et cinq constats « Claude hook modified » (hook Claude modifié) à 22:41, dont quatre suivis d’un envoi échoué (les hooks avaient été modifiés le 24 octobre, comme le consigne le journal d’exploitation du 31 octobre). ↩↩↩↩ -
Données de l’auteur : l’enregistrement d’état du programme de récapitulatif après le récapitulatif du 2 novembre : objet « Mon Nov 2: 71 blocks on 15 zones, 11 criticals emailed, RUNS SHORT 162/207, » fenêtre du 2026-11-01T21:48:49Z au 2026-11-02T15:05:17Z, 162 exécutions ; le journal du moniteur enregistre l’envoi à 07:05:19 PST. ↩↩
-
Données de l’auteur : une analyse par script des écarts entre exécutions dans les journaux du moniteur des 1er et 2 novembre 2026. Pour la fenêtre du récapitulatif du 2 novembre (1 036,5 minutes, 207 créneaux de cinq minutes) : 165 démarrages d’exécution, dont 4 sans « run complete » (exécution terminée) avant le démarrage suivant ; 160 écarts ordinaires, médiane 5,60 minutes, moyenne 5,79, minimum 5,35, totalisant 926,0 minutes (185 créneaux) ; 4 écarts de plus de 10 minutes, 103,0 minutes en tout. Pour la journée calendaire du 2 novembre (de minuit à minuit, 1 440 minutes, 288 créneaux de cinq minutes) : 242 démarrages, 46 de moins que les créneaux, aucun inachevé ; 239 écarts ordinaires, médiane 5,62 minutes, totalisant 1 374,7 minutes (environ 275 créneaux) ; 2 écarts de plus de 10 minutes, 35,8 minutes en tout. La décomposition est une arithmétique approximative à partir de ces chiffres : environ 25,2 créneaux de cadence (les 160 écarts ordinaires couvrent 185,2 créneaux de cinq minutes et contiennent 160 exécutions), environ 15,6 créneaux dans les trois écarts de veille (93,0 minutes, 18,6 créneaux, trois exécutions), environ 1,0 créneau dans l’écart de 10,0 minutes après l’exécution de 14:19, et 3 exécutions non enregistrées, environ 45 en tout. ↩↩↩↩↩↩↩↩↩
-
Données de l’auteur : l’historique de configuration du moniteur, lu dans son dépôt : armement le 31 octobre à 22:44 PDT (un e-mail par alerte critique et par fin de session) ; 1er novembre, 00:46 PDT (une alerte critique intégrée à l’e-mail de blocage) ; 1er novembre, 13:50 PST (récapitulatif activé à 07:00, e-mail par blocage désactivé, alertes critiques traitées par l’edge intégrées) ; 1er novembre, 14:00 PST (aucun changement de configuration ; le code de l’intégration WAF modifié pour compter chaque événement et exiger un échantillon complet). ↩↩↩↩↩↩↩
-
Journal d’exploitation de l’auteur (Captain’s Log) du 31 octobre 2026 : les envois du scanner local échouant sur l’erreur 1010 de Cloudflare pour le user agent par défaut de Python, reproduite avec une clé erronée ; le décompte de 13 envois échoués pour 14 alertes critiques cette nuit-là ; les e-mails cloud qui « most likely were » remis. ↩↩↩↩
-
Resend, “Event Types,” documentation des webhooks, consultée à 14:23:37Z : la définition de
email.sent, citée, etemail.deliveredcomme événement distinct. ↩↩↩↩ -
Resend, “Send Email,” référence de l’API, consultée à 14:18:59Z : le corps de la réponse est un
id. ↩ -
Données de l’auteur : le 1er novembre 2026 par heure locale, d’après le même script, l’heure de 01:00 séparée pour PDT et PST : e-mails par heure (22 dans l’heure de minuit, tous non vérifiés), alertes intégrées ou supprimées par heure, le dernier e-mail par blocage à 13:25:57 et la première notification de blocage intégrée à 14:20:35. ↩↩↩↩
-
Cloudflare, “Querying Firewall Events with GraphQL,” documentation Analytics, consultée à 14:19:01Z : les champs de la requête, dont
action, et un exemple de sortie avec"log"et"block"; la page ne liste pas toutes les valeurs d’action. ↩↩ -
Cloudflare, “Security Events,” documentation WAF, consultée à 14:23:10Z : la définition des événements de sécurité, la phrase selon laquelle une requête peut générer plusieurs événements, et la phrase sur l’échantillonnage, citées. ↩↩↩
-
Notes de conception de l’auteur pour le scanner local, « Check fixes and false positives » (correctifs de vérifications et faux positifs) : « most of the CRITICALs it raised in its first live days were its own noise », le tableau des faux positifs (le Python de Homebrew, Xcode, les builds d’applications de l’auteur, l’auto-correspondance de la vérification d’event tap, les shims de gestionnaires de versions, le motif de ver IA sur les instructions d’agent d’un autre projet), et l’entrée sur la signature de code, citées ; le scanner envoie lui-même ses alertes critiques par e-mail. ↩↩↩↩↩
-
Cloudflare, “Cloudflare Alerts,” documentation Notifications, consultée à 14:19:00Z : les deux catégories d’alertes, citées ; les Monitors comme requêtes SQL API planifiées et les Platform Notifications comme alertes produit préconfigurées, toutes deux créées depuis le tableau de bord, avec remise par e-mail sur toutes les offres. ↩↩
-
Ewaschuk, “Monitoring Distributed Systems,” consulté à 14:18:54Z : le passage sur les pages trop fréquentes, cité. ↩↩
-
Ewaschuk, “Monitoring Distributed Systems,” consulté à 14:18:54Z : l’étude de cas d’une équipe triant des alertes, et la note 24 renvoyant à la gestion des alarmes cardiaques « for an example of alert fatigue in another context », citée. ↩↩
-
Rob Ewaschuk, “My Philosophy on Alerting,” document Google, lu depuis son export HTML, consulté à 14:18:55Z : la note du document indiquant que ses idées forment la fondation du chapitre du livre SRE, « Pages should be urgent, important, actionable, and real », ainsi que le passage sur les alertes fondées sur les causes et l’intitulé de section, cités. ↩↩↩
-
Ewaschuk, “My Philosophy on Alerting,” consulté à 14:18:55Z : le passage sur le rapport quotidien, sa réserve sur la responsabilité et son appel à désigner une personne pour trier le rapport chaque jour, cités. ↩↩↩↩↩↩
-
Steven Thurgood, avec Jess Frame, Anthony Lenton, Carmela Quinito, Anton Tolchanov et Nejc Trdin, “Alerting on SLOs,” chapitre 5 de The Site Reliability Workbook (Google, O’Reilly Media), consulté à 14:18:55Z : les définitions de la précision, du rappel et du temps de réinitialisation, citées. ↩↩
-
NIST, SP 800-61 Revision 2, Computer Security Incident Handling Guide (2012, remplacé), consulté à 14:18:58Z : la phrase sur les « thousands or even millions » (milliers, voire millions), citée. ↩
-
NIST, SP 800-61 Revision 3 (avril 2025), consulté à 14:18:57Z : sa déclaration de remplacement de r2, et la recommandation R1 de la partie Adverse Event Analysis (analyse des événements indésirables), citées. ↩
-
Vectra AI, “2023 State of Threat Detection” (enquête de fournisseur ; mars à avril 2023, commandée par Vectra, terrain réalisé par Sapio Research, 2 000 analystes en sécurité dans des organisations de plus de 1 000 salariés sur dix marchés), consulté à 14:22:49Z : 4 484 alertes par jour et 67 % ignorées, selon les déclarations des répondants. ↩↩
-
Code de l’auteur : la description du programme de récapitulatif (« One email a day … in place of an email per auto-block and per WAF-handled CRITICAL » ; « The digest is also the heartbeat: it goes out on a quiet day too » ; la longue période de plusieurs mois pendant laquelle le moniteur était mort plus tôt en 2026) et, au 2 novembre, sa règle d’exécutions attendues : minutes de la fenêtre divisées par cinq. ↩↩↩↩↩↩↩↩↩
-
Cloudflare, “Actions reference,” documentation Ruleset Engine, consultée à 14:19:01Z : les actions
block, challenge,skipetlog, les définitions du challenge et de log, citées, etskipetloglistées comme non terminales. ↩↩↩↩ -
Données de l’auteur : les constats critiques par issue enregistrée et par catégorie, d’après le fichier de constats du moniteur, par date UTC. 1er novembre : 129, dont 118 sans issue : 117 produits avant que les issues soient enregistrées (parmi lesquels les catégories processus, hook et chaîne d’approvisionnement du scanner local, qui n’en portent jamais), et une alerte critique de scanner cloud à 14:13 PST, après le changement, dont la dernière ligne journalisée de l’exécution est le blocage automatique qu’elle a déclenché (le journal du moniteur du 1er novembre). 2 novembre : 236 (160 intégrées parce que l’adresse était bloquée, 1 intégrée parce que le WAF l’avait traitée, 58 supprimées, 14 envoyées, 3 locales sans issue). ↩↩
-
Données de l’auteur : le journal du moniteur du 1er novembre 2026 : trois exécutions (démarrées à 14:09:49, 14:19:46 et 23:10:31) dont les dernières lignes tombent environ quatre minutes après le démarrage, sans ligne de watchdog, de délai dépassé ou d’arrêt forcé journalisée, ce que l’auteur interprète comme le watchdog de 240 secondes du moniteur (le code tue une exécution à 240 secondes), et une exécution démarrée à 14:36:06 qui se termine à 14:36:34 sans « run complete ». ↩↩
-
Rejouée par l’auteur, le 3 novembre 2026, de la propre vérification de rafale de formulaire du moniteur sur des données Cloudflare complètes pour 18:58:23 à 19:03:23 UTC le 2 novembre (10:58:23 à 11:03:23 PST), qui produit le constat manqué par l’exécution en direct, en gravité high (que le moniteur envoie au récapitulatif, ni par e-mail ni à la liste de blocage), à partir de 39 soumissions dont 23 refusées, et compte 2 143 requêtes de l’adresse là où l’exécution en direct en comptait 1 914 ; les deux causes telles que lues dans le code du moniteur ce jour-là (la fenêtre de chaque exécution se terminait à l’instant où le détecteur interrogeait, avant que les données les plus récentes de Cloudflare soient entièrement arrivées, et des regards de cinq minutes en arrière sur des exécutions démarrées à plus de cinq minutes d’intervalle laissaient une partie de chaque intervalle non balayée) et le correctif apporté ce jour-là (les fenêtres en direct s’enchaînent à partir d’un enregistrement de la fin de la fenêtre précédente et se terminent 90 secondes plus tôt ; un enregistrement manquant, datant de moins de 60 secondes ou de plus de 15 minutes, ramène à un regard de cinq minutes en arrière ; les rejouées ne lisent jamais l’enregistrement), une rejouée de la même fenêtre à travers le code modifié donnant des constats identiques, ce qui montre que le changement a laissé intacte la détection sur une fenêtre fixe et ne met pas à l’épreuve l’enchaînement ni le retard ; les soumissions du scanner au formulaire de contact telles que consignées dans le journal d’exploitation de l’auteur du 2 novembre. La rejouée à travers le code du 3 novembre est conservée avec le reste des éléments de cet article : ses commandes exactes, la fenêtre lue et la sortie complète du détecteur pour la fenêtre d’exécution et pour les minutes du formulaire de 18:58 à 19:05 UTC, exécutée à 15:55:04 UTC le 3 novembre. La première rejouée, faite plus tôt le 3 novembre à travers le code tel qu’il était avant le correctif, est consignée dans mes notes de programme avec les mêmes comptes ; sa sortie brute n’a pas été conservée. ↩↩↩↩↩
-
Données de l’auteur : le journal du scanner local du 2 novembre 2026, et l’aperçu du récapitulatif du 3 novembre : trois constats critiques « Browser -> shell chain » à 13:50 PST, un shell lançant
curl, non résolus dans le fichier de constats. ↩↩ -
Données de l’auteur : la résolution enregistrée sur le constat
spotlightknowledgeddu 1er novembre dans le fichier de constats, citée. ↩ -
Cloudflare, “Error 1010,” documentation d’assistance, consultée à 14:19:00Z : la définition de l’erreur et l’exemple de Python urllib, cités ; la page donne cet exemple pour les requêtes vers les noms d’hôte
*.pages.devet*.workers.devet les domaines personnalisés Pages. ↩ -
Journal d’exploitation de l’auteur (Captain’s Log) du 2 novembre 2026 : la ligne RUNS SHORT, citée. ↩
-
Données de l’auteur : le journal d’alimentation du Mac (lignes Sleep et Wake à partir du 1er novembre, 13:40 PST) : veille d’inactivité à 23:21:30 et réveil complet à 00:30:05 ; veille d’inactivité à 06:01:20 et réveil complet à 06:30:28. ↩