Başlıklar Çanta Olarak
HTTP günlük çerçeveleri istek başlıklarını anahtar-değer çiftlerinden oluşan bir çanta gibi ele alır. Günlük API'si tüm çantayı açığa çıkarır. Operatörler hata ayıklama amacıyla başlık günlüğünü etkinleştirir: bir istek başarısız olduğunda, başlıklar hikayeyi anlatır. Yerleşik bir kara liste yoktur. Belgelerde kimlik bilgisi filtreleme bulunmaz. Tüm başlıklar diske yazılır.
Tipik bir istekteki kimlik bilgisi başlıkları:
- Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... (JWT veya OAuth belirteci)
- Cookie: session=abc123; auth=xyz789
- X-API-Key: sk-live-abc123...
- X-Auth-Token: ghp_abc123... (GitHub kişisel erişim belirteci deseni)
Bu değerler isteği doğrular. Bir günlük dosyasına yazıldığında, herhangi bir isteği doğrularlar.
Kimlik Bilgisi Hattı
Günlük dosyasına yazılan bir kimlik bilgisi tek bir yerde kalmaz. Şöyle dolaşır:
1. Web sunucusu /var/log/nginx/access.log dosyasına yazar
2. Günlük döndürme aracı (logrotate) /var/log/nginx/access.log.1 dosyasına kopyalar
3. Günlük taşıyıcı (Fluentd, Filebeat, Logstash) okur ve toplayıcıya gönderir
4. Log toplayıcı (Elasticsearch, Splunk, Datadog) indeksler ve depolar
5. Varsayılan politika altında 30-90 gün saklanır
Kimlik bilgisi aynı anda beş konumun tamamında bulunur. Oturum belirtecini iptal etmek, kimlik bilgisini log toplayıcısından kaldırmaz. Tam saklama süresi boyunca log erişimi olan herkes tarafından aranabilir, dışa aktarılabilir ve erişilebilir durumda kalır.
Maruziyet Penceresi
Bellekteki bir kimlik bilgisinin maruziyet penceresi: max(oturum süresi, süreç ömrü). Oturum: saatler ile günler arası. Süreç: saatler ile haftalar arası.
Logdaki bir kimlik bilgisinin maruziyet penceresi: max(oturum süresi, log saklama süresi). Oturum: saatler ile günler arası. Saklama: 30-90 gün.
Bellekten çalınan bir kimlik bilgisi için saldırganın oturum penceresi sırasında mevcut olması gerekir. Logdan çalınan bir kimlik bilgisi ise yalnızca log toplayıcısına erişim gerektirir ve bu erişim, tam saklama süresi boyunca geriye dönük olarak kullanılabilir.
MOAD-0003 vs MOAD-0004
MOAD-0003 (Bellekte Sızan Bağlam): bir kimlik bilgisi bellekte yanlış istek işleyicisine sızar. Yalnızca işlem penceresi sırasında, iş parçacığı havuzu üzerinden erişilebilir. Geçici.
MOAD-0004 (Günlüğe Kaydedilen Gizli): bir kimlik bilgisi diskte günlük rotasyonu, günlük nakliyesi ve günlük toplama yoluyla kalıcı hale gelir. Geriye dönük olarak, günlük erişimine sahip herkese, 30-90 gün boyunca erişilebilir. Kalıcı.
Yapısal fark: geçici ve kalıcı. Düzeltme farklı bir katmanda çalışır.
Geçici vs Kalıcı
Geçici/kalıcı ayrımı risk yüzeyini, düzeltme katmanını ve olay müdahale gereksinimlerini belirler.
Serileştirme Katmanında Kimlik Bilgisi Denylist'i
Düzeltme: serileştirme katmanında bir kimlik bilgisi denylist'i. Herhangi bir başlık değeri günlük çıktısına ulaşmadan önce, başlık adını denylist ile karşılaştırın. Değeri [REDACTED] ile değiştirin.
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 serileştirme katmanında olmalıdır, log sorgu katmanında değil. Log sorgu redaksiyonu: kimlik bilgisi diske ulaştıktan sonra uygulanır; ham değer hâlâ mevcuttur, yalnızca görüntülemeden gizlenir. Serileştirme katmanı redaksiyonu: kimlik bilgisi asla diske ulaşmaz. Ham değer hiçbir zaman log dosyasına, log göndericisine veya log toplayıcısına girmez.
Denylist'i Test Etme
Üç test deseni:
- Pozitif: Authorization: Bearer token123 içeren bir istek, Authorization: [REDACTED] içeren bir log girdisi üretir
- Negatif: Content-Type: application/json içeren bir istek, değeri olduğu gibi koruyan bir log girdisi oluşturur
- Büyük/küçük harfe duyarsız: AUTHORIZATION: Bearer token123 da [REDACTED] üretir (HTTP başlık adları büyük/küçük harfe duyarsızdır)
Denylist bakımı gerektirir: yeni kimlik doğrulama başlığı desenleri (örneğin özel X-Service-Auth başlıkları) açıkça eklenmelidir. Düzeltme yapısaldır ancak kendi kendini sürdürmez.
Denylist'i Uygula
Bir ekip, üretimdeki bir olayı hata ayıklamak için Nginx erişim log formatını tüm istek başlıklarını içerecek şekilde yapılandırır. Yapılandırma:
log_format debug_format '$remote_addr - $request - $http_authorization - $http_cookie';
access_log /var/log/nginx/debug.log debug_format;
Olayı çözüyorlar ve hata ayıklama yapılandırmasını kaldırmayı planlıyorlar, ancak değişiklik bir sonraki dağıtım döngüsünden (7 gün sonra) önce üretime ulaşmıyor.