Başlıkların Çantacığu
HTTP logging çerçeveleri istek başlıklarını anahtar-değer çiftleri çantası olarak ele alır. Loglama API'sı tam çantayı açıklar. Operatörler, bir istekte başarısız olduğunda başlıkları anlatmak için başlık yazma seçeneğini etkinleştirir. İn-build reddetme listesi yoktur. Kimlik filtrelemesi belgede belirtilmemiştir. Tam başlıklar diskte yazılır.
Genel bir istekte bulunan kimlik 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 şablonu)
Bu değerler isteği kimlendirir. Bir log dosyasına yazılan değerler, kimlendirir.
Kimlik Akışı
Bir kimlik, bir log dosyasına yazılır ve orada kalmaz. Yolculuk yapar:
1. Web sunucusu /var/log/nginx/access.log'a yazılır
2. Log döndürme aracı (logrotate) kopyalar /var/log/nginx/access.log.1
3. Log taşıyıcı aracı (Fluentd, Filebeat, Logstash) okur ve gönderir
4. Log toplu işleyici (Elasticsearch, Splunk, Datadog) dizinler ve saklar
5. Varsayılan politika uyarınca 30-90 gün boyunca saklanır
Kimlik, beş konumda aynı anda bulunur. Oturum belirtecini iptal etmek, log toplu işleyicisinden kimliği kaldırmaz. Log erişimi için tam retansiyon penceresi boyunca aranabilir, dışarıya aktarılabilir ve kimlik erişimi olan herkes tarafından erişilebilir.
Açıklama Penceresi
Bellekteki kimliğin açıklama penceresi: max(oeturum süresi, işlem ömrü). Oturum: saatler ile günler. İşlem: saatler ile haftalar.
Logdaki kimliğin açıklama penceresi: max(oeturum süresi, log retansiyonu). Oturum: saatler ile günler. Retansiyon: 30-90 gün.
Bellekten çalınan bir kimlik, saldırganın oturum penceresi sırasında mevcut olması gerekiyordu. Log'tan çalınan bir kimlik, tam retansiyon dönemi boyunca log toplu işleyicisine erişmeye yeterli olduğu için geriye dönük olarak gereklidir.
MOAD-0003 karşı MOAD-0004
MOAD-0003 (Yaygın Kontekst): bir kimlik bellekten yanlış istek elemanına sızar. İşlem penceresi boyunca erişilebilir, thread havuzu aracılığıyla. Geçici.
MOAD-0004 (Kaydedilmiş Gizli): Bir diske depolanan kimlik bilgisi, log dönüştürme, log taşıma ve log birleştirme sırasında sürer. Geri dönük olarak, log erişimi olan herkes tarafından erişilebilir, 30-90 gün boyunca. Kalıcı.
Yapısal fark: geçici/kalıcı. Çözüm farklı bir katmanda çalışır.
Geçici vs Kalıcı
Geçici/kalıcı ayrımı, risk yüzeyini, çözüm katmanını ve olay yanıt gereksinimlerini belirler.
Serileştirme Katmanında Kimlik Bilgisine Red Liste Uygula
Çözüm: Serileştirme katmanında bir kimlik bilgisi red listesi uygula. Log çıkışına herhangi bir başlık değeri ulaşmadan önce, başlık adını red listeye karşı kontrol et. Değerı '[REDACTED]' ile değiştir.
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()
}
Red list, serileştirme katmanında yer almalıdır, log sorgu katmanında değil. Log sorgusu gizlemesi: kimlik doğrulama bilgisi disk üzerine ulaştıktan sonra uygulanır; gerçek değer hâlâ mevcuttur, ancak gösterimden gizlenir. Serileştirme katmanı gizlemesi: kimlik doğrulama bilgisi disk üzerine asla ulaşmaz. Gerçek değer hiç log dosyasına, log göndericiye veya log birleştiriciye girmeyecek.
Red List Testi
Üç test düzeni:
- Pozitif: Authorization: Bearer token123 içeren bir talep, log girişiyle Authorization: [REDACTED] üretir
- Negatif: Content-Type: application/json içeren bir talep, değerin sağlam kalmasını sağlar
- Büyük/küçük harf duyarlı olmayan: AUTHORIZATION: Bearer token123 de [REDACTED] de üretir (HTTP başlığı adları büyük/küçük harf duyarlı değildir)
Red list gerektirir: yeni kimlik doğrulama bilgisi düzenleri (ör. özel X-Service-Auth başlıkları) için açıkça eklenmesi gerekir. Çözüm yapısal olsa da otomatik olarak sürdürülmez.
Red List Uygulama
Bir ekip, Nginx erişim log formatını talep başlıklarını içerir şekilde yapılandırmaya karar verir. Bu yapılandırmalar:
log_format debug_format '$remote_addr - $request - $http_authorization - $http_cookie';
access_log /var/log/nginx/debug.log debug_format;
Ekip, olayı çözer ve debug konfigürasyonunu kaldırmayı planlar, ancak bu değişiklik üretim ortamına ulaşmaz ve bir sonraki dağıtım döngüsü başlamadan önce (7 gün sonra) olaya yeniden rastlanır.