Git Geçmişinde Gizli Anahtarlar: Neden 'git rm' Yetersizdir?
Modern yazılım projelerinde geliştiricilerin en sık karşılaştığı ve en yüksek maliyetli güvenlik facialarından biri, yerel geliştirme sırasında kullanılan bir API anahtarının (OpenAI, AWS Secret Key, Stripe token veya özel SSH anahtarı) yanlışlıkla Git aşamasına eklenip (git add) uzak depoya gönderilmesidir (git push). İnternette GitHub depolarını saniyeler içinde tarayan açık kaynak tarayıcı botları, genel erişime açılan bir depodaki API anahtarını ortalama 3 ila 5 saniye içinde tespit edip kötüye kullanabilir.
Sızıntıyı fark eden geliştiricilerin ilk refleksi genellikle dosyayı silip yeni bir commit atmak (git rm ve git commit) veya 'git revert' çalıştırmaktır. Ancak Git, yönlendirilmiş döngüsüz bir çizge (DAG) üzerinde tüm geçmişi saklayan bir versiyon kontrol sistemidir. Dosyayı en son commit'ten silmek, anahtarı Git'in packfile veya tree nesnelerinden kaldırmaz. Anahtar geçmişteki commit hash'lerinde sonsuza dek yaşamaya devam eder; bu nedenle en etkili savunma, anahtarın Git geçmişine ilk adımını atmadan önce yerel makinede engellenmesidir.
# YANLIŞ ÇÖZÜM: Dosyayı silip yeni commit atmak geçmişi temizlemez!
git rm .env
git commit -m "fix: remove secret"
# Gizli anahtar önceki commit nesnesinde hâlâ okunabilir durumda kalır:
git log -p -S "AKIAIOSFODNN7EXAMPLE"Yüksek Entropi ve İmza Tabanlı Tespit Nasıl Çalışır?
Statik kod analizinde gizli anahtarları yakalamak iki ana yöntemle gerçekleştirilir: kesin kalıp (pattern) eşleştirme ve Shannon entropisi analizi. Kalıp eşleştirme, bilinen sağlayıcıların standart öneklerine dayanır. Örneğin AWS kimlikleri 'AKIA' veya 'ABIA' ile başlar, GitHub Personal Access Token'ları 'ghp_' ile başlar ve Slack bot belirteçleri 'xoxb-' biçimindedir. Bu kesin imzalar, yanlış pozitif oranını sıfıra yakın tutarken bilinen servisleri anında yakalar.
Ancak özel veritabanı şifreleri, JWT gizli anahtarları veya jenerik API token'ları belirli bir sağlayıcı önekine sahip değildir. Burada matematiksel Shannon entropisi devreye girer. Bir metin dizisindeki karakterlerin bilgi yoğunluğu ve rastgelelik derecesi ölçülür. Normal değişken adları düşük entropiye (2.0 - 3.2 bit) sahipken, rastgele üretilmiş kriptografik anahtarlar 4.5 bitin üzerinde yüksek entropi sergiler. TokenGuard, bu iki yaklaşımı birleştirerek hem bilinen kalıpları hem de öneksiz rastgele anahtarları yakalar.
# Shannon Entropisi Karşılaştırması:
# "user_profile_controller" -> Entropi: ~2.84 (Zararsız kod değişkeni)
# "d9f8a7b6c5e43210fe89ab42" -> Entropi: ~4.61 (Kriptografik Token Tehlikesi)TokenGuard ile Sıfır Bağımlılıklı Staged Değişiklik Taraması
TokenGuard, harici hiçbir üçüncü parti kütüphaneye ihtiyaç duymayan, Python 3.9+ standart kütüphanesiyle çalışan sıfır bağımlılıklı bir güvenlik CLI aracıdır. Aracın en kritik özelliklerinden biri 'staged' tarama modudur. Bu mod, tüm diski taramak yerine sadece 'git add' ile hazırlanmış ve commit edilmek üzere olan diff içeriğini denetler. Bu sayede tarama süresi 50 milisaniyenin altında tamamlanır.
TokenGuard terminalde bir bulgu yakaladığında, bulunan gizli anahtarı ekrana açık şekilde basmaz; güvenli bir biçimde maskeler (örneğin 'AKIA************') ve çıkış kodu olarak 1 döner. Böylece terminal kayıtlarınız veya CI loglarınız ikincil bir sızıntı kaynağına dönüşmez.
# Python ortamınıza kurarak çalıştırın:
pip install tokenguard-cli
# Veya uvx ile kurulum yapmadan anında çalıştırın:
uvx --from tokenguard-cli tokenguard --staged
# Çıktı Örneği:
# [!] TokenGuard: 1 secret detected in staged changes!
# File: src/config.py:14
# Rule: AWS Access Key ID (AKIA************)
# Action blocked: commit aborted.Tek Komutla Yerel Git Pre-Commit Hook Kurulumu
Bir güvenlik aracının manuel çalıştırılması insan hatasına açıktır; geliştirici commit atmadan önce komutu çalıştırmayı unutabilir. Bu nedenle kontrolün otomatikleştirilmesi şarttır. TokenGuard, yerel Git deponuzun '.git/hooks/pre-commit' mekanizmasını tek bir komutla yapılandırmanızı sağlar.
'tokenguard install-hook' komutunu çalıştırdığınızda, deponuzda her 'git commit' çağrıldığında TokenGuard otomatik devreye girer. Eğer sahnelenen kodda açık bir API anahtarı varsa commit işlemi Git tarafından anında iptal edilir ve anahtarın depoya girmesi engellenir.
# Depo kök dizininde yerel pre-commit hook'unu etkinleştirin:
tokenguard install-hook
# Alternatif olarak çoklu geliştirici ekipleri için .pre-commit-config.yaml:
# repos:
# - repo: https://github.com/umutgungorr/tokenguard
# rev: v0.2.1
# hooks:
# - id: tokenguardMevcut Kod Tabanı İçin Baseline Dosyası ve Geçmişi Temizleme
Mevcut bir projede güvenlik tarayıcısı çalıştırmanın en büyük zorluğu, test dosyalarında yer alan sahte (dummy) anahtarlar veya geçmişten kalan güvenli string'lerdir. TokenGuard, SHA-256 tabanlı parmak izi eşleştirmesi kullanan bir 'baseline' mekanizması sunar. '--update-baseline' parametresiyle mevcut bulguları onaylı bir dosyaya kaydedebilir, yalnızca yeni eklenen ihlallerin commit edilmesini engelleyebilirsiniz.
Eğer bir anahtar çoktan uzak depoya (GitHub vb.) gönderildiyse yapılması gereken ilk ve en zorunlu adım 'anahtarı ilgili sağlayıcı panelinden anında iptal etmektir (revoke)'. Ardından 'git-filter-repo' veya BFG Repo-Cleaner kullanılarak commit geçmişi yeniden yazılmalı ve tüm ekip üyelerine yeni geçmiş duyurulmalıdır.
# Mevcut onaylı test anahtarlarını baseline dosyasına kaydedin:
tokenguard --update-baseline .tokenguard-baseline.json
# CI veya yerel kontrolde baseline ile tarama yapın:
tokenguard --baseline .tokenguard-baseline.json
# SARIF formatında CI güvenlik raporu üretin (GitHub Code Scanning uyumlu):
tokenguard --format sarif --output audit-results.sarifMühendislik Sürecinde Güvenlik Refleksi
Yazılım güvenliği, projeyi canlıya alırken son gün hatırlanan bir denetim listesi maddesi değil; klavyedeki her commit'e entegre edilmiş bir mühendislik alışkanlığı olmalıdır. Sıfır bağımlılıklı, hafif ve deterministik yerel tarama araçları, geliştirici deneyimini yavaşlatmadan ekipleri milyarlarca liralık sızıntı maliyetlerinden korur.
TokenGuard açık kaynak olarak GitHub ve PyPI üzerinde yayınlanmaktadır. CLI dokümantasyonu, SARIF v2.1.0 şema detayları ve pre-commit entegrasyonu için projenin resmi sayfalarını inceleyebilirsiniz.
# PyPI üzerinden en son kararlı sürümü kurun:
pip install tokenguard-cli --upgrade
# Komut satırı yardım menüsünü görüntüleyin:
tokenguard --helpKaynak: TokenGuard: PyPI Paketi (tokenguard-cli)
Kaynak: TokenGuard: GitHub Kaynak Kodu
Kaynak: Umut Güngör: TokenGuard Vaka Analizi
Kaynak: Umut Güngör: Hakkımda & İletişim
