API anahtarım sızdı: şimdi ne yapmalı?
OpenRouter, OpenAI, Anthropic ya da Google gibi bir yapay zekâ servisinin API anahtarı herkese açık bir yere düştüyse, onu kullanan herkes faturayı size yazdırabilir. Bu yazıda ilk 15 dakikada yapılacakları, anahtar git geçmişine girdiyse neden yalnız silmenin yetmediğini ve bir daha aynı şeyi yaşamamak için kurulacak düzeni anlatıyoruz.
Neden acele etmelisiniz?
API anahtarı, servisin sizi tanıdığı tek şeydir; kimin elinde olursa olsun, istekler sizin hesabınızdan düşer. OpenRouter belgeleri bunu açıkça söyler: limiti olmayan bir anahtar sızarsa ya da kontrolden çıkan bir ajan onu kullanırsa, otomatik yüklemeler dahil tüm krediniz harcanabilir [5]. Google da Gemini anahtarları için istemci tarafına gömülen anahtarların kullanıcılar tarafından çıkarılabileceği uyarısını yapar [8]. Yani soru "biri bulur mu?" değil, "bulduğunda ne kadar zarar verir?" sorusudur.
İlk 15 dakika: kontrol listesi
- Anahtarı iptal edin. Sağlayıcının panelindeki anahtarlar sayfasına girin ve sızan anahtarı silin. Anthropic, şüphelenilen anahtarın hemen iptal edilmesini ve Console'daki API anahtarları sayfasından silinmesini önerir [6]. OpenRouter da şüphe durumunda anahtarı ayarlar sayfasından silip yenisini oluşturmayı söyler [5].
- Yeni anahtar üretin ve uygulamanızı güncelleyin. Canlıda çalışan bir servisiniz varsa Google ve OpenAI'nin önerdiği sıra işe yarar: yeni anahtarı oluşturun, uygulamaya dağıtın, çalıştığını doğrulayın, sonra eskisini kapatın [7][8]. Ama anahtar gerçekten herkese açık bir yere düştüyse, kesintiyi göze alıp eskisini önce kapatmak daha güvenlidir.
- Kullanım ve harcama kayıtlarına bakın. Sızıntı süresince tanımadığınız model çağrıları, ani maliyet artışı ya da alışılmadık saatlerde yoğun istek var mı? Google, faturalama ve kullanım kayıtlarının yetkisiz etkinlik için incelenmesini önerir [8]; Anthropic de Console'daki kayıt ve kullanım sayfalarının düzenli izlenmesini tavsiye eder [6].
- Harcama limiti koyun. OpenRouter'da her anahtara ayrı bir kredi limiti verebilir, bu limiti günlük, haftalık ya da aylık sıfırlanacak şekilde ayarlayabilirsiniz; limite ulaşan anahtarın istekleri reddedilir [4][5]. OpenAI'de harcama uyarıları ve aylık sert harcama limiti tanımlanabilir; sert limit, harcama sınıra ulaştığında ilgili API trafiğini durdurur [7].
- Otomatik yüklemeyi gözden geçirin. Kartınızdan otomatik kredi yükleme açıksa eşiğini düşük tutun. Anthropic, otomatik yeniden yükleme eşiğinin dikkatle seçilmesini önerir, çünkü bu ayar beklenmedik yüksek kullanıma karşı da bir korumadır [6].
- Sızıntının kaynağını bulun. Anahtar nereden çıktı? Kaynağı kapatmadan yeni anahtar da aynı yoldan sızar. Aşağıdaki bölümler bunun için.
Anahtar git geçmişine girdiyse
En sık yapılan hata, anahtarı içeren dosyayı silip yeni bir commit atmak ve işin bittiğini sanmaktır. Oysa eski commit'ler anahtarı içermeye devam eder; depoyu klonlayan herkes geçmişte geriye gidip onu görebilir. GitHub'ın hassas veri kaldırma rehberi bu yüzden ilk adım olarak sırrın iptal edilmesini ya da yenilenmesini ister; anahtar artık çalışmıyorsa çoğu durumda geçmişi yeniden yazmaya gerek bile kalmaz [1].
Yine de geçmişi temizlemek isterseniz rehber, git-filter-repo aracını (sürüm 2.47 ve sonrası, --sensitive-data-removal seçeneğiyle) ve ardından zorla gönderimi tarif eder [1]. Bunun bedelleri vardır: commit kimlikleri değişir, açık pull request'ler bozulabilir, mevcut klonlar ve çatallar (fork) eski commit'leri tutmaya devam eder. GitHub üzerindeki önbelleğe alınmış görünümler için GitHub Destek'e başvurmak gerekebilir [1]. Kısacası temizlik iptalin yerini tutmaz; önce iptal, sonra temizlik.
GitHub sizin yerinize fark edebilir
GitHub'ın secret scanning özelliği herkese açık depolarda ücretsiz ve otomatik çalışır; kod geçmişinin yanında issue, pull request ve wiki gibi alanları da tarar [2]. Bulunan anahtar bir iş ortağı sağlayıcıya aitse GitHub bunu sağlayıcıya bildirir ve sağlayıcı anahtarı iptal etmek gibi adımlar atabilir [2]. Anthropic, 2024'ten beri bu programın ortağıdır: herkese açık depoda bulunan anahtarı otomatik olarak devre dışı bırakır ve kullanıcıya e-postayla haber verir [6][9]. OpenRouter da kendini secret scanning ortağı olarak tanımlar ve sızan anahtar için e-posta bildirimi gönderdiğini belirtir [5].
Daha da iyisi, anahtarın hiç gönderilmemesidir. GitHub'ın push protection özelliğinin kullanıcı düzeyindeki hâli GitHub.com'da varsayılan olarak açıktır ve herkese açık depolara sır göndermenizi engeller [3]. Bu uyarıyı gördüğünüzde "sonra düzeltirim" deyip geçmeyin.
Anahtarlar nereden sızar?
- Herkese açık depo: Anthropic'e göre en sık sızıntı nedenlerinden biri, anahtarın herkese açık kod depolarına ya da üçüncü taraf araçlara yanlışlıkla konmasıdır [6].
.envdosyasının yanlışlıkla commit'lenmesi klasik örnektir. - İstemci tarafı JavaScript: Tarayıcıda çalışan koda gömülen anahtarı sayfayı açan herkes görebilir. Google, çağrıların kendi kontrolünüzdeki bir sunucu üzerinden yapılmasını önerir [8].
- Ekran görüntüsü ve video: Terminal, panel ya da ayar dosyası görünen bir ekran görüntüsü, forum sorusu veya eğitim videosu anahtarı açık ederse yazıyı bulanıklaştırmak yerine anahtarı iptal edin.
- Paylaşılan notlar ve sohbetler: Ekip notu, paylaşılan belge ya da mesajlaşma grubu da herkese açık sayılmalıdır. Yapay zekâ sohbetlerine yapıştırılan bilgilerin nereye gittiğini merak ediyorsanız ücretsiz yapay zekâ ve gizlilik yazımıza bakabilirsiniz.
- Üçüncü taraf araçlar: Anthropic, anahtarınızı bir web IDE'ye ya da CI/CD platformuna yüklediğinizde o aracın geliştiricisine hesabınıza erişim vermiş olduğunuzu hatırlatır [6]. Yalnız güvendiğiniz araçlara verin.
Bir daha olmaması için
Anahtarı koddan ayırın
OpenAI, OpenRouter, Anthropic ve Google'ın ortak tavsiyesi aynıdır: anahtarı kodun içine yazmayın, ortam değişkeninden okuyun [4][6][7][8]. Python'da bu kadar basit:
import os k = os.environ["OPENROUTER_API_KEY"]
Yerel geliştirmede değişkenleri bir .env dosyasında tutuyorsanız, Anthropic'in de önerdiği gibi bu dosyayı sürüm kontrolünün dışında bırakın [6]. Projeye başlarken .gitignore dosyasına şu satırı ekleyin:
.env
Gizli kasa kullanın
Canlı ortamda düz metin dosyası yerine bir sır yöneticisi kullanmak daha güvenlidir. Google, üretim için Google Cloud Secret Manager gibi ayrı bir sır deposunu önerir; OpenAI de anahtarların ortam değişkenleri ya da bir sır yönetimi servisiyle çalışma anında yüklenmesini tavsiye eder [7][8].
İstemciyle sağlayıcı arasına sunucu koyun
Web ya da mobil uygulama yazıyorsanız, kullanıcının cihazı yapay zekâ servisine doğrudan bağlanmasın. İstekleri kendi sunucunuzdaki küçük bir aracı üzerinden geçirin; anahtar yalnız sunucuda dursun [8]. Böylece kullanıcı başına sınır koymak da kolaylaşır.
Anahtar başına limit, kapsam ve süre
- Her ortam için ayrı anahtar: Anthropic geliştirme, test ve canlı için farklı anahtarlar önerir; biri sızınca diğerleri etkilenmez [6].
- Anahtar başına limit: OpenRouter her anahtara limit konmasını önerir [5]. OpenAI'de ayrı projeler oluşturup proje başına harcama ve hız limitleri tanımlanabilir [7].
- Kapsamı daraltın: Google, anahtarı yalnız Gemini API ile ya da IP adresi gibi ölçütlerle kısıtlamaya izin verir [8].
- Süre ve döngü: OpenAI proje anahtarlarına son kullanma tarihi verilmesini ve düzenli yenileme yapılmasını önerir [7]; Anthropic örnek olarak 90 günlük bir döngüden söz eder [6].
- Tarama: Anthropic, GitHub secret scanning'i açmayı ve Gitleaks gibi araçları CI/CD hattına eklemeyi önerir [6].
OpenRouter'ı ücretsiz modellerle kullanıyorsanız bile limit koymak iyi bir alışkanlıktır; ayrıntılar için OpenRouter'da ücretsiz model kullanımı yazımıza göz atın.
Sonuç
Sızan bir anahtarda ilk refleks iptal etmek olmalı; dosyayı silmek, depoyu gizlemek ya da geçmişi temizlemek bundan sonra gelir. Ardından kullanım kayıtlarına bakın, harcama limitlerini kurun ve sızıntının kaynağını kapatın. Uzun vadede anahtarı koddan ayırmak, her anahtara limit ve dar kapsam vermek ve istemciyle sağlayıcı arasına bir sunucu koymak, bir sonraki sızıntıyı hem daha olasılık dışı hem de çok daha ucuz hâle getirir.