Grinden som "låg nere" utan att ligga nere
Postmortem. Händelser 3 och 4 oktober 2026, utredd och åtgärdad 9 oktober 2026. Skriven av den som byggde och körde systemet.
- Vad hände
- Tre utgående anrop från kodagenter stoppades med beskedet att klientdata-grinden inte svarade. Grinden svarade; den var bara långsammare än kroken hade tålamod för.
- Verkan
- Tre anrop blockerade, agenterna stannade och väntade enligt regelboken. Ingen data lämnade huset. Tre falska larm på högsta nivå i SIEM:en.
- Grundorsak
- Krokens tidsgräns mot grinden var 3 sekunder, satt när grinden bara körde regler. Efter att namnigenkänning lades till tar en stor text upp till 4,6 sekunder. Gränsen sågs aldrig över, och ingen mätte.
- Upptäckt
- Fem dygn senare, när loggen granskades inför att Kontoret-sidan byggdes. Inte av ett larm.
Tidslinje
| När | Vad |
|---|---|
| 30 sep 16:01 | Grinden startar. Den kör sedan oavbrutet i nio dygn (780 098 sekunder uppe när den mäts den 9 oktober), alltså inget krasch- eller omstartsfönster i hela perioden. |
| 3 okt 00:45:06 | Kroken stoppar ett WebFetch-anrop: "Grinden svarar inte". Nästa sekund ett till. Agenten får beskedet att utgången är stängd som standard och väntar. |
| 4 okt 14:01:21 | Grinden stoppar ett Bash-anrop från ett bolag med 3 e-postadresser och 6 personnamn i texten. Ett riktigt stopp. |
| 4 okt 14:01:53 | Trettiotvå sekunder senare stoppar kroken ett Bash-anrop från ett annat bolag: "Grinden svarar inte". I grindens processlogg finns sex BrokenPipeError, vilket är vad som händer när grinden blir klar med en skanning och försöker svara en klient som redan lagt på. |
| 9 okt eftermiddag | Loggen granskas inför bygget av Kontoret-sidan. Inga starter av grinden i fönstret, men BrokenPipeError i processloggen. Hypotesen: tidsgräns, inte driftstopp. |
| 9 okt 16:40 | Mätning mot den körande grinden med namnigenkänning: 2 660 tecken 0,08 s, 26 600 tecken 0,65 s, 79 800 tecken 1,46 s, 200 000 tecken (grindens tak) 4,58 s. Tre samtidiga anrop på 79 800 tecken: 1,9 s. Hypotesen håller: texter nära taket tar längre än 3 sekunder. |
| 9 okt 16:50 | Åtgärderna nedan driftsatta. Första kaosprovet körs: 9 av 9 steg. |
Varför det var ofarligt och ändå ett fel
Kroken är stängd som standard: svarar grinden inte, stoppas anropet. Det är rätt. Ett fel i skyddet ska bli ett stopp, inte ett hål. Men samma regel gjorde felet osynligt. Ett stopp ser ut som att skyddet fungerar, och tre stopp på två dygn drunknade bland de riktiga. Loggen sa "svarar inte" utan att skilja på en död process och en långsam, så ingen hade anledning att titta närmare.
Stängd som standard skyddar data. Den skyddar inte mot att man missförstår sina egna loggar.
Åtgärder, gjorda 9 oktober
| Åtgärd | Varför | Läge |
|---|---|---|
| Tidsgräns 3 till 10 sekunder grind_krok.py | Dubbla marginalen mot det uppmätta värsta fallet, 4,6 s. Mätningen står som kommentar i koden bredvid siffran, så nästa person ser var den kommer ifrån. | Klar |
| Loggen säger varför grind_krok.py | "Grinden svarar inte, stoppade Bash (tidsgräns)" eller "(nere)". Samma stopp, men nu går det att se skillnad utan att läsa processloggar. | Klar |
| Kaosprov varje natt 04:30 kaosprov.py, launchd | Dödar grinden på riktigt, visar att kroken nekar medan den är nere, väntar in att launchd startar om den, provar att personuppgifter stoppas och ren text släpps, slår på och släpper nödstoppet, och ser att händelsen når SIEM:en. Nio steg. Faller ett går det till mobilen. Resultatet publiceras på Kontoret. | Klar |
| Räknare som överlever omstart grind.py | Kaosprovet startar om grinden varje natt. Utan det hade antalet skanningar och stopp nollställts dagligen och siffrorna på Kontoret blivit meningslösa. | Klar |
| Skanningstid mätt och bevakad grind.py, Prometheus, Grafana, vakter.py | Grinden exponerar skanningstiden som histogram på /metrics. Prometheus räknar p95 och p50, Grafana visar dem, och en vakt i Hub larmar till mobilen när p95 passerar 5 sekunder, halva tidsgränsen. Nästa gång gränsen närmar sig syns det innan den passeras. | Klar, samma kväll |
| SIEM-regel 100162 Wazuh | Kaosprovets planerade stopp och nödstopp får nivå 3 i stället för 12. Annars hade det riktiga larmet "grinden nere" tappat sin betydelse efter en vecka. | Klar, 17 av 17 regeltester |
Vad som fortfarande saknas
- En text på 200 000 tecken på väg ut är i sig misstänkt. Ett tak som stoppar direkt vid storlek, utan att skanna, vore både snabbare och säkrare än att skanna allt.
- Kroken gör inget nytt försök. Ett enda försök med 10 sekunder räcker för de fall som mätts, men ett andra försök efter ett nätverksfel hade kostat lite.
- Larmhistoriken i Wazuh börjar den 8 oktober, eftersom containern byggdes om då. Händelserna från 3 och 4 oktober finns i Hubs egen logg, inte i SIEM:en.
Alla siffror kommer från Hubs händelselogg, grindens processlogg och mätningarna den 9 oktober. Tillbaka till plattformens kontroller.