Secret Yayılması: 412 Sızdırılmış Token Sorununu Nasıl Çözdük
3 Mart saat 02:13'te bir CI pipeline'ı hata verdi. 37 repository genelinde 412 sızdırılmış API token'ı tespit ettik. Bu hata, 1,2 milyon dolarlık potansiyel ihlal maliyetini riske attı.
Çoğu ekip bir Vault'un her şeyi çözeceğini düşünür. Gerçekte ise bir Vault, gecikme (latency) açısından tek bir hata noktası (single point of failure) haline gelebilir. Token'lar Vault dışında tutulduğunda, hard-coded değerler veya ortam değişkenleri (environment variables) kullanılır. Bu yedekleme yöntemleri denetim günlüklerinde (audit logs) görünmez.
Metriklerimiz bu yayılmanın maliyetini gösterdi:
- Normal secret erişimi: istek başına 48 ms.
- Sızıntı sırasında: istek başına 187 ms.
Build agent'ları, her iş (job) için uzak bir Vault kümesinden (cluster) 12 token çekti. Bu durum zaman aşımına (timeout) neden oldu ve geliştiricileri değişiklikleri manuel olarak geri almaya (roll back) zorladı. Gecikme sadece yavaş bir süreç değildir; bulut faturalarını kabartan ve geliştiricileri yavaşlatan bir maliyet merkezidir.
Bir staging repository'sindeki sızdırılmış tek bir AWS anahtarı, bir saldırgan tarafından kullanılması durumunda saatte 120 dolara mal olabilir. Tek bir saatlik kötüye kullanım, üç aylık bir güvenlik denetiminden daha pahalıya patlar.
Statik tarayıcılar bizi yarı yolda bıraktı. Token'larımızın %78'ini kaçırdılar. Neden? Çünkü bu token'lar anlık (on the fly) olarak oluşturuluyordu ve kaynak kodda değil, build artifact'lerinde yer alıyordu. Bir GitHub Actions adımı, bir token'ı Docker katmanına (layer) yazdı. Tarayıcı hiçbir şey görmedi ancak token haftalarca registry'mizde kaldı.
Sadece statik incelemeye değil, çalışma zamanı (runtime) görünürlüğüne ihtiyacınız var.
Bunu düzeltmek için bir Lambda motoru inşa ettik. CloudTrail'i yeni sırlar için izliyor ve bunları Vault ile karşılaştırıyor. İşte yeni iş akışı:
- Bir webhook aracılığıyla bir sırrı tespit et.
- Metadata için Vault'u sorgula.
- Sağlayıcı API'si aracılığıyla token'ı geçersiz kıl.
- Sırrı dosyadan kaldırmak için bir PR aç.
- CI'dan geçerse PR'ı otomatik olarak birleştir (merge).
Bu motor, 412 token'ı 27 dakika içinde %99,97 başarı oranıyla rotate etti.
Artık sır yaşını (secret age) takip ediyoruz. Eğer bir token 30 günden eskiyse, build başarısız olur. Bu basit kural, bir çeyrekte yeni sızıntıları %62 oranında azalttı. Ayrıca tuhaf kullanım modellerini işaretlemek için bir isolation-forest modeli kullanıyoruz. Eğer bir token yeni bir IP'den görünürse, sistem onu anında rotate eder.
Token'lara dosya gibi davranmayı bırakın. Sır yaşını ve erişim gecikmesini (retrieval latency) temel metrikler olarak ele alın. Bunu yaparsanız, yayılma azalacaktır.
İsteğe bağlı öğrenme topluluğu: https://t.me/GyaanSetuAi
