Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Configuration mı, Secret mı? Ayarları Sınıflandırmak, Twelve-Factor ve Secret'ların Sızdığı Yerler
Secret, ele geçirilince birinin senin adına iş yapabildiği her ayardır ve tek doğal yeri bir secret store'dur; build-time, runtime ve environment'a özgü config ise repo'da ya da environment'ta durabilir. Bookstore üzerinde Git geçmişinde kalan key'i, docker inspect, /proc/environ ve createdump ile görünen connection string'i, Angular bundle'ındaki API key'ini gerçek çıktılarla görüyor ve serinin hedefi olan secret'sız erişime giden envanteri çıkarıyoruz.
Tek Artifact, Çok Environment: .NET'te Configuration Layering, Environment Variable'lar ve Angular'da Runtime Config
Tek artifact'i çok environment'ta çalıştırmanın yolu, artifact'e yalnızca ortak varsayılanları koyup environment'a özgü değerleri deploy anında environment variable ya da runtime config dosyasıyla vermektir. .NET 10'da provider sırasını ölçüyor (BOOKSTORE_ öneki command line'ı ezer, ASPNETCORE_ öneki appsettings'e yenilir), ValidateOnStart ve [OptionsValidator] ile fail fast kuruyor, Angular'da provideAppInitializer ve nginx entrypoint'iyle config.json'u runtime'da üretiyoruz.
Azure Key Vault ile .NET: Managed Identity, RBAC, Configuration Provider ve Production'da Doğru Credential
Bir .NET uygulaması Key Vault'a parola taşımadan, managed identity ve vault seviyesinde verilmiş Key Vault Secrets User rolüyle erişmeli; production'da DefaultAzureCredential yerine ManagedIdentityCredential kullanılmalı. AddAzureKeyVault'u prefix'li secret manager ve ReloadInterval ile kuruyor, yerel emulator'de reload'u, managed identity yokken üç dakikalık açılışı ve App Service'te çözülemeyen reference'ın değer olarak kalmasını gerçek çıktılarla görüyoruz.
Azure App Configuration: Merkezi Configuration, Label'larla Environment'lar, Sentinel Key ile Yenileme ve Key Vault Reference'ları
Azure App Configuration, birden çok servisin paylaştığı ve deploy'suz değişmesi gereken gizli olmayan ayarlar içindir; secret'lar Key Vault'ta kalır, store'da yalnızca reference durur. Resmi emulator üzerinde label'larla environment ayırmayı, sentinel key değişmeden ayarın yansımadığını, çözülemeyen Key Vault reference'ının açılışı durdurduğunu ve 1 saniyelik refresh alt sınırını gerçek çıktılarla görüyor, değişikliği pull request ve pipeline ile yönetiyoruz.
HashiCorp Vault ve OpenBao: KV, Auth Method'lar, Policy'ler ve SQL Server için Dynamic Credential
Vault ve OpenBao, veritabanı için her açılışta yeni ve kısa ömürlü bir kullanıcı üretir; uygulamayı Vault'tan habersiz tutmanın en iyi yolu Vault Agent'ın yazdığı dosyayı reloadOnChange ile okumaktır. KV v2, policy ve AppRole'u kuruyor; SQL Server'da lease yenilemeyi, saklanan connection string'in revoke sonrası "Login failed" ile düşmesini, KILL yetkisi olmayan revoke'un takılmasını ve OpenBao'da SQL Server plugin'i olmadığını gerçek çıktılarla görüyoruz.
Container ve Kubernetes'te Secret: External Secrets Operator, Secrets Store CSI Driver ve Workload Identity
Kubernetes'te secret'ın kaynağı Vault ya da Key Vault olmalı; External Secrets Operator onu Kubernetes Secret'ına, Secrets Store CSI Driver doğrudan pod'un volume'una taşır. kind'de ölçtük: Vault'taki değişiklik volume'u okuyan pod'a yaklaşık 56 saniyede yansıdı, environment variable'lı pod restart'a kadar eski değeri gördü. CSI'da rotation'ın varsayılan kapalı olduğunu, ARG ile verilen token'ın docker history'de kaldığını ve BuildKit secret mount ile Compose secrets'ı da görüyoruz.
Secret Rotation ve Sızıntı Müdahalesi: Kesintisiz Rotation, Sızan Secret'ta İlk 60 Dakika ve Secret'sız Mimari
Kesintisiz rotation için bir süre iki secret birlikte geçerli sayılır: yeni secret önce kabul eden tarafa eklenir, her yere yayılınca kullanılmaya başlanır, eski secret ölçümle kaldırılır. Bookstore'un ödeme webhook'unda primary ve secondary secret ile restart'sız rotation'ı, Vault audit log'uyla sızıntı kapsamını çıkarmayı, Key Vault'un SecretNearExpiry olayıyla otomasyonu ve Bookstore'un Azure'a ve veritabanına erişen secret sayısını sıfıra indiren secret'sız mimariyi görüyoruz.