Gizli Bilgilerin Yönetimi
Gizli bilgileri geliştirme sırasında .NET User Secrets, üretimde ise Azure Key Vault veya ortam değişkenleriyle güvenle saklayın.
Gizli Bilgilerin Yönetimi, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Sırlar Yapılandırma Değildir
Parolalar, API anahtarları, bağlantı dizeleri ve JWT imzalama anahtarları hiçbir zaman appsettings.json içinde saklanmamalı veya kaynak denetimine gönderilmemelidir. .NET, sır yönetimi için özel olarak tasarlanmış çeşitli mekanizmalar sağlar.
User Secrets (Geliştirme)
User Secrets, geliştirme sırlarını proje dizininin dışında, makineye özgü bir dosyada saklar. Geliştirme ortamında otomatik olarak yüklenir ve kaynak koduyla birlikte hiçbir zaman taşınmaz.
# Initialize (adds UserSecretsId to .csproj):
dotnet user-secrets init
# Set secrets:
dotnet user-secrets set "Database:Password" "dev-pass-123"
dotnet user-secrets set "Jwt:SigningKey" "dev-jwt-key-abc"
dotnet user-secrets set "OpenAI:ApiKey" "sk-..."
# List / remove:
dotnet user-secrets list
dotnet user-secrets remove "OpenAI:ApiKey"
# Stored at:
# macOS/Linux: ~/.microsoft/usersecrets/{id}/secrets.json
# Windows: %APPDATA%\Microsoft\UserSecrets\{id}\secrets.jsonUser Secrets'ı Açıkça Yükleme
Host.CreateApplicationBuilder, User Secrets'ı Geliştirme ortamında otomatik olarak yükler. Bunları Geliştirme dışı senaryolar veya deneme projeleri için açıkça da yükleyebilirsiniz.
var builder = Host.CreateApplicationBuilder(args);
// Automatic (Development only) — already done by default
// Equivalent manual call:
if (builder.Environment.IsDevelopment())
builder.Configuration.AddUserSecrets<Program>();
// In test projects (no ASPNETCORE_ENVIRONMENT):
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true)
.AddUserSecrets<Program>() // loads secrets.json
.AddEnvironmentVariables()
.Build();Üretim için Ortam Değişkenleri
Üretimde sırları ortam değişkenleri olarak aktarın; bunlar çalışma zamanında işletim sistemi veya konteyner orkestratörü tarafından okunur ve kodla birlikte düz metin olarak diske hiçbir zaman kalıcılaştırılmaz.
# docker-compose.yml — inject secrets:
services:
api:
image: myapp:latest
environment:
- Database__Password=${DB_PASSWORD} # from .env file
- Jwt__SigningKey=${JWT_KEY}
- ConnectionStrings__Default=Server=db;Password=${DB_PASSWORD}
# Kubernetes Secret:
kubectl create secret generic app-secrets \
--from-literal=Database__Password=secret123 \
--from-literal=Jwt__SigningKey=verylongkey
# Reference in pod spec:
# env:
# - name: Database__Password
# valueFrom:
# secretKeyRef: { name: app-secrets, key: Database__Password }Azure Key Vault Tümleştirmesi
Azure Key Vault, üretim için yönetilen bir sır deposudur. Resmî sağlayıcı, sırları doğrudan yapılandırma sistemine yükler; uygulamanız bunları diğer yapılandırma değerleri gibi okur.
// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Azure.Identity
var builder = WebApplication.CreateBuilder(args);
if (!builder.Environment.IsDevelopment())
{
var kvUri = new Uri(builder.Configuration["Azure:KeyVaultUri"]!);
// Uses Managed Identity / workload identity in production:
builder.Configuration.AddAzureKeyVault(kvUri, new DefaultAzureCredential());
}
// Secrets named "Database--Password" in Key Vault
// are accessible as builder.Configuration["Database:Password"]
// (Key Vault uses -- as the : separator)AWS Secrets Manager
AWS üzerinde sırları .NET yapılandırma işlem hattına aktarmak için Amazon.Extensions.Configuration.SystemsManager kullanın veya Secrets Manager'ı doğrudan kullanın.
// dotnet add package Amazon.Extensions.Configuration.SystemsManager
builder.Configuration.AddSystemsManager(
path: "/myapp/production", // parameter store prefix
optional: false,
reloadAfter: TimeSpan.FromMinutes(30));
// Or Secrets Manager directly:
using Amazon.SecretsManager;
using Amazon.SecretsManager.Model;
var client = new AmazonSecretsManagerClient();
var response = await client.GetSecretValueAsync(new GetSecretValueRequest
{
SecretId = "myapp/production/db-password"
});
var secret = response.SecretString; // JSON string
// Parse and inject into configHashiCorp Vault
HashiCorp Vault, dinamik sırlar, sır döndürme ve ayrıntılı erişim denetimi sağlar. .NET ile tümleştirmek için topluluk tarafından geliştirilen VaultSharp kitaplığını veya bir yapılandırma sağlayıcısını kullanın.
// dotnet add package VaultSharp
using VaultSharp;
using VaultSharp.V1.AuthMethods.Token;
var authMethod = new TokenAuthMethodInfo("vault-token");
var vaultClient = new VaultClient(
new VaultClientSettings("https://vault.example.com:8200", authMethod));
// Read a secret:
var kv = await vaultClient.V1.Secrets.KeyValue.V2
.ReadSecretAsync(path: "myapp/database", mountPoint: "secret");
var password = kv.Data.Data["password"].ToString();
// Then store in configuration or pass to IOptions:
builder.Configuration["Database:Password"] = password;Bellekteki Sırları Koruma
Sırlar bellekteyken bile dikkatli işlenmelidir. SecureString kullanın veya using bloklarıyla kapsamı sınırlayın ve sır değerlerini günlüğe yazmaktan kaçının.
// NEVER log secrets:
_logger.LogInformation("API Key: {Key}", apiKey); // WRONG!
_logger.LogInformation("API Key configured: {HasKey}", !string.IsNullOrEmpty(apiKey)); // CORRECT
// Mask in diagnostics:
public string KeyHint => apiKey.Length > 8
? $"{apiKey[..4]}...{apiKey[^4..]}"
: "****";
// Scope the secret:
void ProcessWithSecret()
{
var secret = LoadSecret();
try { UseSecret(secret); }
finally { secret = string.Empty; } // clear reference
}CI/CD'de Sırlar
CI/CD işlem hatları (GitHub Actions, Azure DevOps, Jenkins) gizli değişken depoları sağlar. Sırları derleme veya dağıtım sırasında ortam değişkenleri olarak aktarın; bunları işlem hattı YAML'ına asla sabit olarak yazmayın.
# GitHub Actions — store in Settings > Secrets:
# name: Deploy
# on: push
# jobs:
# deploy:
# runs-on: ubuntu-latest
# env:
# Database__Password: ${{ secrets.DB_PASSWORD }}
# Jwt__SigningKey: ${{ secrets.JWT_KEY }}
# steps:
# - name: Run migration
# run: dotnet ef database update
# Azure Pipelines:
# variables:
# - group: my-app-secrets # from Azure DevOps Variable Group
# The secrets are masked in logs and never stored in plaintextGerçek Dünya: Geliştirme/Üretim Sır Stratejisi
Eksiksiz bir sır stratejisi: geliştirmede User Secrets, üretimde Azure Key Vault ve geri dönüş olarak ortam değişkenleri.
var builder = WebApplication.CreateBuilder(args);
if (builder.Environment.IsDevelopment())
{
// Dev: local secrets.json, never committed
builder.Configuration.AddUserSecrets<Program>();
}
else
{
// Production: Azure Key Vault via Managed Identity
var kvUri = builder.Configuration["Azure:KeyVaultUri"];
if (!string.IsNullOrEmpty(kvUri))
builder.Configuration.AddAzureKeyVault(
new Uri(kvUri), new DefaultAzureCredential());
}
// Always load env vars (works in all environments + containers):
// Already loaded by CreateBuilder — they override Key Vault
// Bind secrets to strongly typed options:
builder.Services
.AddOptions<JwtOptions>()
.BindConfiguration("Jwt")
.ValidateDataAnnotations()
.ValidateOnStart();Hızlı Kontrol
Sırlar neden hiçbir zaman appsettings.json içinde saklanmamalıdır?
Özet: Sır Yönetimi
Önemli çıkarımlar:
- Sırları hiçbir zaman
appsettings.jsoniçinde saklamayın; bu dosya kaynak denetimine gönderilir - Geliştirme: User Secrets (
dotnet user-secrets) kullanın; proje dışında saklanır - Üretim: ortam değişkenleri, Azure Key Vault, AWS Secrets Manager veya HashiCorp Vault kullanın
- CI/CD: sırları işlem hattının gizli bilgi deposunda saklayın ve ortam değişkenleri olarak aktarın
- Ham sır değerlerini hiçbir zaman günlüğe yazmayın; ipuçları veya maskeler kullanın
- Stratejileri birleştirin: geliştirmede User Secrets + üretimde Key Vault + geçersiz kılma olarak ortam değişkenleri
Sıkça Sorulan Sorular
“Gizli Bilgilerin Yönetimi” dersi ücretsiz mi?
Evet — “Gizli Bilgilerin Yönetimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Gizli Bilgilerin Yönetimi” dersinde ne öğreneceğim?
Gizli bilgileri geliştirme sırasında .NET User Secrets, üretimde ise Azure Key Vault veya ortam değişkenleriyle güvenle saklayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Gizli Bilgilerin Yönetimi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yapılandırma Kaynakları ve Sağlayıcıları
- IOptions ile Güçlü Türlendirilmiş Seçenekler
- Seçenek Doğrulama ve Adlandırılmış Seçenekler
- Gizli Bilgilerin Yönetimi