müfettiş
Moderatör
- Katılım
- 20 Ocak 2024
- Mesajlar
- 325
- Tepkime puanı
- 1
- Puanları
- 18
Konteynerlarda Environment Variables ve Gizli Veri (Secret) Yönetimi
Giriş: Şifreleri Kodun İçine Gömme Hatası
Yazılım geliştirmenin en büyük günahlarından biri Hardcoding'dir. Yani veritabanı şifresini, API anahtarını kodun içine yazmak.const dbPassword = "superSecretPassword123";Bu kodu GitHub'a attığınız anda şifreniz çalınmış demektir.Konteyner dünyasında (Docker/K8s), "12-Factor App" metodolojisi gereği, konfigürasyon koddan ayrılmalıdır. Bunun için iki temel yöntem kullanılır: Environment Variables (Ortam Değişkenleri) ve Secrets (Sırlar).
1. Environment Variables (ENV)
Değişkenleri, konteyner çalışırken dışarıdan enjekte etme yöntemidir.- Kullanım: Dockerfile'da değil, docker run komutunda verilir.docker run -e DB_HOST=192.168.1.50 my-app
- Avantajı: Aynı imajı (Image), hem Test hem Prod ortamında farklı ayarlarla çalıştırabilirsiniz.
- Tehlikesi: Şifreler için ENV kullanmak risklidir. Çünkü docker inspect komutunu yazan veya sunucuda ps komutunu çalıştıran herkes bu değişkenleri açık metin (plaintext) olarak görebilir.
2. Docker Secrets ve Kubernetes Secrets
Hassas veriler (Şifreler, SSH anahtarları) için özel nesneler kullanılmalıdır.Kubernetes Secrets
K8s, hassas verileri Secret objesi olarak saklar.- Nasıl Çalışır?: Secret oluşturursunuz (kubectl create secret...). Pod'u başlatırken "Bu Secret'ı şu klasöre dosya olarak bağla (Mount)" dersiniz.
- Güvenlik: Secret'lar etcd veritabanında saklanır. (Dikkat: Varsayılan olarak sadece Base64 ile kodlanmıştır, şifreli değildir. Etcd şifrelemesi (Encryption at Rest) mutlaka açılmalıdır).
- Uygulama: Uygulamanız şifreyi /etc/secrets/password.txt dosyasından okur. Konteyner silinince dosya da hafızadan silinir.
3. İleri Seviye: HashiCorp Vault
Kurumsal dünyada K8s Secrets bile bazen yetersiz kalır. Şifrelerin düzenli olarak değişmesi (Rotation) gerekir.HashiCorp Vault, merkezi bir kasa yönetimidir.- Dinamik Sırlar: Uygulama Vault'a başvurur. Vault, veritabanına gider, o anlık "geçici bir kullanıcı adı ve şifre" oluşturur, uygulamaya verir. 1 saat sonra bu şifreyi iptal eder.
- Avantaj: Şifre çalınsa bile ömrü kısadır. Veritabanı root şifresini kimse bilmez.
.env Dosyaları ve Docker Compose
Geliştirme ortamında (Localhost) genellikle .env dosyaları kullanılır.docker-compose.yml dosyası, aynı klasördeki .env dosyasını okur.Önemli: .env dosyasını mutlaka .gitignore listesine ekleyin. Asla Git reposuna göndermeyin!Sonuç
Güvenli bir konteyner mimarisi için kural basittir:- Config (URL, Port): Environment Variable kullan.
- Sensitive (Şifre, Key): Secret Management kullan.
- Kod: Asla, hiçbir koşulda konfigürasyon içermemeli.