Secret Yönetimi (Şifre Saklama) 🔑
Uygulamalarınızın içinde veritabanı şifresi, API anahtarı veya Secret Key gibi hassas verileri ASLA kodun içine (Hardcoded) yazmamalısınız. Kodunuzu GitHub'a attığınız an o şifreler ifşa olur.
İşte bu şifreleri güvenli bir şekilde yönetmenin yolları.
1. Yöntem: .env Dosyası (En Pratik) ✅
Çoğu proje (Node.js, Python, PHP, Docker) için standart yöntem budur. Şifreler proje klasöründe .env adında gizli bir dosyada tutulur.
Nasıl Yapılır?
-
Proje dizininde
.envdosyasını oluşturun: -
İçine hassas verilerinizi yazın:
Güvenli Hale Getirme (Çok Önemli!) 🛡️
Bu dosyanın sadece sizin tarafınızdan okunabilmesi lazım. Diğer kullanıcılar okuyamasın.
# Sadece sahibi okuyup yazabilsin (600)
chmod 600 .env
# Sahipliğini garantiye al
sudo chown $USER:$USER .env
Git'ten Uzak Tutma 🚫
Bu dosyanın yanlışlıkla GitHub'a gitmemesi için .gitignore dosyasına ekleyin:
2. Yöntem: Docker Secrets (Konteynerler İçin) 🐳
Eğer Docker Compose kullanıyorsanız, şifreleri çevre değişkeni (Environment Variable) yerine dosya olarak mount etmek daha güvenlidir.
docker-compose.yml örneği:
services:
app:
image: my-app
secrets:
- db_password
- api_token
secrets:
db_password:
file: ./secrets/db_password.txt
api_token:
file: ./secrets/api_token.txt
Bu yöntemde şifreler konteynerin içine /run/secrets/db_password dosyası olarak salt okunur (read-only) bağlanır. Uygulamanız şifreyi bu dosyadan okur.
3. Güçlü Şifre Üretme Araçları 🎲
"Ali123" gibi şifreler kullanmayın. Terminalden kriptografik olarak güvenli rastgele şifreler üretin.
OpenSSL ile (Önerilen)
# 32 karakterlik base64 şifre (JWT Secret için ideal)
openssl rand -base64 32
# Çıktı: K7xP9mN2vQ8wR4tY6uI0oL3jH5gF1dS7aZ9xC2bV4nM=
Çoklu Üretim
4. Neden HashiCorp Vault Değil? 🤔
HashiCorp Vault veya AWS Secrets Manager gibi araçlar çok güçlüdür ancak kurulumu ve bakımı zordur ("Overkill").
| Yöntem | Karmaşıklık | Güvenlik | Uygun Senaryo |
|---|---|---|---|
| Hardcoded | Çok Düşük | ❌ Yok | Asla kullanma |
| .env Dosyası | Düşük | ✅ İyi | Tek sunucu, küçük/orta proje |
| Docker Secrets | Orta | ✅✅ Çok İyi | Docker Swarm / Kubernetes |
| HashiCorp Vault | Çok Yüksek | 🏆 Mükemmel | Bankalar, Dev Kurumsal Yapılar |
Özet: Tek bir sunucu veya startup projesi için .env + chmod 600 fazlasıyla yeterlidir.
5. Ekip Çalışması ve Ortamlar 🤝
Projede yalnız değilseniz veya farklı sunucular (Test, Prod) yönetiyorsanız:
📝 .env.example Oluşturun
Gerçek şifrelerin olmadığı bir şablon dosyası oluşturun ve Git'e gönderin. Yeni gelen geliştirici neye ihtiyacı olduğunu anlasın.
# .env.example (Git'e eklenir - İÇİ BOŞ OLSUN!)
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=
JWT_SECRET=
API_KEY=
Kullanım:
🌍 Ortamları Ayırın
.env.development(Lokal - Git'e girmez).env.production(Canlı Sunucu - Git'e girmez, Çok güvenli!).gitignoreayarı:
6. Kritik Hata: Şifreyi Yanlışlıkla Git'e Attım! 🚨
Sadece dosyayı silip yeni commit atmak YETMEZ! Git geçmişinde o şifre sonsuza kadar saklanır.
Adım 1: Şifreyi hemen değiştirin (En garanti çözüm budur).
Adım 2: Git Geçmişini Temizleyin (Opsiyonel ama önerilir)
Eğer history temizlemek zorundaysanız BFG Repo-Cleaner kullanın:
# .env dosyasını tarihten sil
bfg --delete-files .env
# Git referanslarını temizle ve zorla gönder
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push --force
7. İleri Seviye Güvenlik Riskleri 🕵️♂️
📋 Loglara Şifre Yazma Hatası
Kod yazarken dikkatli olun. Şifreyi loglamayın!
# ❌ YANLIŞ: Şifre log dosyasına açık metin yazılır
logger.info(f"Bağlanılıyor: {DB_USER}:{DB_PASSWORD}")
# ✅ DOĞRU: Maskeleme yapın
logger.info(f"Bağlanılıyor: {DB_USER}:****")
🔍 Systemd Servislerinde Şifre
Servis dosyasının içine (Environment=ŞİFRE) yazmayın. ps aux komutunda görünebilir. Bunun yerine dosya kullanın:
Ve dosya izinlerini kısıtlayın:
8. Ekstra İpuçları (Opsiyonel) 💡
🔄 Şifre Rotasyonu
Kritik şifreleri sonsuza kadar kullanmayın. Belirli aralıklarla değiştirin:
- API Key: 90 Günde bir.
- Veritabanı Şifresi: 6 Ayda bir.
- JWT Secret: Yılda bir (Dikkat: Değişince kullanıcıların oturumu düşer).
🔍 Process Environment Riski (İleri Seviye)
Aynı kullanıcı adıyla çalışan işlemler, birbirlerinin çevre değişkenlerini (env) okuyabilir.
Çözüm: Uygulamayı her zaman kendine ait bir kullanıcı (örn: appuser) ile çalıştırın.
8. Piyasadaki Diğer Alternatifler (Gelişmiş Senaryolar) 🌍
Eğer projeniz büyürse veya env dosyasıyla uğraşmak istemezseniz, şu araçlara bakabilirsiniz:
| Araç | Tür | Özellik | Kullanım Önerisi |
|---|---|---|---|
| HashiCorp Vault | 🏢 Enterprise | Endüstri standardı. Çok karmaşık ama her şeyi yapar. | Büyük bankalar, Dev şirketler. |
| Infisical | 🚀 Startup Dostu | Açık kaynaklı, Vault'un çok daha kolay hali. | Modern Yazılım Ekipleri (Şiddetle Önerilir). |
| Bitwarden Secrets | 🔓 Açık Kaynak | Parola yöneticisi Bitwarden'ın DevOps versiyonu. Güvenilir. | Kişisel / Küçük Ekipler. |
| AWS / Google Secrets | ☁️ Cloud Native | Bulut sağlayıcınızın kendi servisi. Pahalı olabilir. | Full AWS/GCP üzerindeki projeler. |
| Yandex Lockbox | 🇷🇺 Rusya Menşeli | Yandex Cloud'un servisi. HashiCorp alternatifi. | Yandex Cloud kullananlar. (Not: Veri gizliliği endişesi olabilir) |
💡 Tavsiye: Eğer
.envyetmiyor ama Vault çok ağır geliyorsa, Infisical veya Bitwarden'a göz atın. Hem güvenli hem pratiklerdir.