Ortam değişkenleri ve secret'lar (şifre, API anahtarı) güvenli şekilde nasıl yönetilir?
Cevap
12-Factor App prensibine göre yapılandırma koddan ayrılmalı ve ortama göre (dev, staging, prod) değişmelidir. Aynı image her ortamda çalışır; yalnızca yapılandırma farklıdır.
Ortam değişkenleri
// config.js: uygulama açılışında doğrula, eksikse hemen çök
import { z } from "zod";
const schema = z.object({
DATABASE_URL: z.string().url(),
PORT: z.coerce.number().default(3000),
JWT_SECRET: z.string().min(32),
});
export const config = schema.parse(process.env);Yapılandırmayı tek bir modülde toplayıp açılışta doğrulamak, eksik değişken yüzünden saatler sonra ortaya çıkan hataları önler.
Yapılmaması gerekenler
- Secret'ları git'e commit etmek (
.envdosyası.gitignore'da olmalı; repoda yalnızca örnek.env.examplebulunur). - Dockerfile'da
ENVile veya image'a kopyalayarak secret gömmek. - Secret'ları loglamak (hata mesajları, istek dökümleri,
console.log(config)). - Tüm ortamlarda aynı secret'ı kullanmak.
Doğru yaklaşım
- Secret yöneticisi: HashiCorp Vault, AWS Secrets Manager, GCP Secret Manager, Azure Key Vault. Secret'lar merkezi, şifreli, erişim kontrollü ve denetim kaydıyla tutulur.
- Kubernetes:
Secretnesneleri (varsayılan olarak yalnızca base64 kodludur, etcd şifrelemesi açılmalı) veya External Secrets Operator ile bulut secret yöneticisinden çekme. - CI/CD: platformun şifreli secret deposu (GitHub Actions secrets); mümkünse statik anahtar yerine OIDC ile kısa ömürlü bulut kimlikleri.
- En az yetki: her servis yalnızca kendi ihtiyacı olan secret'a erişsin.
- Rotasyon: secret'lar düzenli ve sızıntı şüphesinde hemen değiştirilebilmelidir; dinamik, kısa ömürlü veritabanı kimlik bilgileri ideal çözümdür.
- Tarama: gitleaks veya GitHub secret scanning ile yanlışlıkla commit edilen secret'ları yakalayın.
Git geçmişine giren bir secret, commit silinse bile sızmış kabul edilir ve hemen rotate edilmelidir.
İlgili Docker & DevOps soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.