Huvuden som påsar
HTTP-loggningramverk behandlar request-huvuden som en påse med nyckel-värde-par. Loggnings-API:et exponerar hela påsen. Operatörer aktiverar huvudloggning för felsökning: när en begäran misslyckas berättar huvuden historien. Ingen inbyggd denylist. Ingen credential-filtrering i dokumentationen. Fullständiga huvuden till disk.
Credential-huvuden i en typisk begäran:
- Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... (JWT- eller OAuth-token)
- Cookie: session=abc123; auth=xyz789
- X-API-Key: sk-live-abc123...
- X-Auth-Token: ghp_abc123... (GitHub personal access token pattern)
Dessa värden autentiserar begäran. När de skrivs till en loggfil autentiserar de alla förfrågningar.
Credential Pipeline
En autentiseringsuppgift som skrivs till en loggfil stannar inte på ett ställe. Den färdas:
1. Webbservern skriver till /var/log/nginx/access.log
2. Loggrotationsagenten (logrotate) kopierar till /var/log/nginx/access.log.1
3. Loggshipper (Fluentd, Filebeat, Logstash) läser och skickar till aggregator
4. Loggaggregator (Elasticsearch, Splunk, Datadog) indexerar & lagrar
5. Sparas i 30–90 dagar enligt standardpolicy
Uppgifterna finns samtidigt i alla fem platserna. Att återkalla sessionstoken tar inte bort uppgifterna från loggaggregatorn. De förblir sökbara, exporterbara och tillgängliga för alla med åtkomst till loggarna under hela lagringsperioden.
Exponeringsfönstret
Exponeringsfönster för en uppgift i minnet: max(sessionstid, processlivstid). Session: timmar till dagar. Process: timmar till veckor.
Exponeringsfönster för en uppgift i en logg: max(sessionstid, logglagringstid). Session: timmar till dagar. Lagringstid: 30–90 dagar.
En uppgift som stulits från minnet krävde att angriparen var närvarande under sessionens tidsfönster. En uppgift som stulits från en logg kräver endast åtkomst till loggaggregatorn, vilket är tillgängligt retroaktivt under hela lagringsperioden.
MOAD-0003 vs MOAD-0004
MOAD-0003 (Läckt kontext): en autentiseringsuppgift i minnet läcker till fel request handler. Endast tillgänglig under processfönstret, via trådpoolen. Ephemeral. [BLOCK_TYPE persistence_problem/headers_as_bags]
MOAD-0004 (Loggad hemlighet): en autentiseringsuppgift på disk kvarstår genom loggrotation, loggskickning och loggaggregering. Tillgänglig retroaktivt, för alla med loggåtkomst, i 30–90 dagar. Persistent. [BLOCK_TYPE persistence_problem/headers_as_bags]
Den strukturella skillnaden: ephemeral vs persistent. Fixen verkar på ett annat lager. [BLOCK_TYPE persistence_problem/persistence_question]
Ephemeral vs Persistent [BLOCK_TYPE persistence_problem/persistence_question]
Distinktionen ephemeral/persistent avgör riskytan, fixlagret och incidenthanteringskraven. [BLOCK_TYPE persistence_problem/persistence_question]
Credential Denylist på serialiseringslagret
Fixen: en credential denylist på serialiseringslagret. Innan något header-värde når loggutdata, kontrollera header-namnet mot en denylist. Ersätt värdet med [REDACTED].
CREDENTIAL_HEADERS = {
'authorization',
'cookie',
'x-api-key',
'x-auth-token',
'x-csrf-token',
'proxy-authorization',
}
def sanitize_headers(headers: dict) -> dict:
return {
k: '[REDACTED]' if k.lower() in CREDENTIAL_HEADERS else v
for k, v in headers.items()
}
Denylist-listan hör hemma på serialiseringslagret, inte på loggfrågelagret. Redigering vid loggfråga: sker efter att autentiseringsuppgifterna nått disken; råvärdet finns fortfarande kvar, bara dolt från visning. Redigering på serialiseringslagret: autentiseringsuppgifterna når aldrig disken. Råvärdet kommer aldrig in i loggfilen, loggshippern eller loggaggregatorn.
Testa denylist-listan
Tre testmönster:
- Positivt: en begäran med Authorization: Bearer token123 ger en loggpost med Authorization: [REDACTED]
- Negativ: en begäran med Content-Type: application/json genererar en loggpost med värdet intakt
- Skiftlägesokänslig: AUTHORIZATION: Bearer token123 genererar också [REDACTED] (HTTP-huvudnamn är skiftlägesokänsliga)
Denylist kräver underhåll: nya mönster för autentiseringshuvuden (t.ex. anpassade X-Service-Auth-huvuden) måste läggas till explicit. Fixen är strukturell men inte självunderhållande.
Tillämpa Denylist
Ett team konfigurerar sin Nginx-accessloggformat för att inkludera alla begäranhuvuden vid felsökning av ett produktionsincident. Konfigurationen:
log_format debug_format '$remote_addr - $request - $http_authorization - $http_cookie';
access_log /var/log/nginx/debug.log debug_format;
De löser incidenten och avser att ta bort debug-konfigurationen, men ändringen når inte produktionen före nästa driftsättningscykel (7 dagar senare).