Environment va Secrets — production sozlamalar, .env, secret management

~15 daq · .NET Backend · Deploy

Muammodan boshlaylik

// appsettings.json — git da
{
  "ConnectionStrings": { "Dokon": "Host=prod-db;Password=Sup3rS3cret!" },
  "Jwt": { "Kalit": "mening-maxfiy-jwt-kalitim-12345678901234" },
  "Tolov": { "ApiKalit": "sk_live_8f3k..." }
}

Repozitoriy ochiq qilindi (yoki stajyorga ruxsat berildi, yoki noutbuk o'g'irlandi). Endi:

  • Production bazasining paroli ma'lum
  • JWT kaliti bilan istalgan foydalanuvchi, jumladan admin tokenini yasash mumkin
  • To'lov kaliti bilan pul o'tkazmalari

Git tarixidan o'chirish ham yordam bermaydi — nusxalar allaqachon tarqalgan bo'lishi mumkin. Barcha kalitlarni almashtirish kerak.


Hayotiy o'xshatma

Uy kaliti. Eshik qanday ochilishini (qulf turi, qaysi tomonga buriladi) hamma bilishi mumkin — bu konfiguratsiya. Kalitning o'zi esa cho'ntakda, eshik oldidagi gilam ostida emas. Va har bir yashovchining o'z kaliti: kimdir ko'chib ketsa — faqat uning kalitini qaytarib olasiz.


Konfiguratsiya va maxfiy ma'lumot

Konfiguratsiya — git da mumkin Secret — git da hech qachon
Log darajasi, timeout lar Baza parollari
Feature flag lar JWT/imzo kalitlari
Tashqi servis URL lari API kalitlar, client secret lar
Sahifa hajmi, limitlar Sertifikat parollari

Muhitlar

ASPNETCORE_ENVIRONMENT=Development   # lokal
ASPNETCORE_ENVIRONMENT=Staging       # sinov serveri
ASPNETCORE_ENVIRONMENT=Production    # sukut bo'yicha, agar berilmasa
if (app.Environment.IsDevelopment()) { app.MapOpenApi(); }
if (app.Environment.IsProduction()) { app.UseHsts(); }

Konfiguratsiya manbalari tartibi

Keyingisi oldingisini ustidan yozadi:

  1. appsettings.json
  2. appsettings.{Environment}.json
  3. User Secrets (faqat Development)
  4. Muhit o'zgaruvchilari
  5. Buyruq qatori argumentlari

Shuning uchun appsettings.json da xavfsiz sukut qiymatlari, production qiymatlari esa muhit o'zgaruvchilaridan keladi — kodni o'zgartirmasdan.


Lokal — User Secrets

dotnet user-secrets init
dotnet user-secrets set "Jwt:Kalit" "lokal-uchun-uzun-tasodifiy-kalit-kamida-32-belgi"
dotnet user-secrets set "ConnectionStrings:Dokon" "Host=localhost;Database=dokon;Username=dokon;Password=lokal"
dotnet user-secrets list

Qiymatlar loyiha papkasidan tashqarida saqlanadi (%APPDATA%\Microsoft\UserSecrets\<id>\secrets.json yoki ~/.microsoft/usersecrets/) — tasodifan commit qilib bo'lmaydi.

[!INFO] User Secrets — shifrlanmagan va faqat Development uchun. Bu production yechimi emas — u faqat sirlarni repozitoriydan tashqarida saqlashga yordam beradi.


Production — muhit o'zgaruvchilari

ConnectionStrings__Dokon="Host=prod-db;Database=dokon;Username=app;Password=..."
Jwt__Kalit="..."
Tolov__ApiKalit="..."

__ — ichma-ich kalit (Jwt:Kalit). Docker da -e, compose da environment/.env (81-dars), Kubernetes da Secret obyektlari, hosting panellarida — "Environment variables" bo'limi.


Secret menejerlar

Katta tizimlar uchun — maxsus xizmatlar:

Xizmat Xususiyati
Azure Key Vault .NET bilan to'g'ridan-to'g'ri integratsiya
AWS Secrets Manager AWS muhiti
HashiCorp Vault Platformadan mustaqil, o'z serveringizda
Docker/Kubernetes Secrets Orkestrator darajasida
// Azure Key Vault misoli
builder.Configuration.AddAzureKeyVault(
    new Uri("https://dokon-vault.vault.azure.net/"),
    new DefaultAzureCredential());

Afzalliklari: kirish huquqlari va audit (kim qachon o'qidi), kalitlarni markazlashgan almashtirish (rotation), shifrlangan saqlash.


Konfiguratsiyani tekshirish — Options pattern

builder.Services.AddOptions<JwtSozlamalari>()
    .Bind(builder.Configuration.GetSection("Jwt"))
    .Validate(s => s.Kalit.Length >= 32, "Jwt:Kalit kamida 32 belgi bo'lishi kerak")
    .ValidateOnStart();

Kalit unutilgan yoki qisqa bo'lsa — ilova ishga tushishda aniq xato bilan to'xtaydi, birinchi login so'rovida emas.


Production tekshiruv ro'yxati

  • ASPNETCORE_ENVIRONMENT=Production
  • Hech qanday secret git da yo'q (git log -p | grep -i password bilan tekshiring; gitleaks kabi vositalar CI da)
  • appsettings.Development.json image ga kirmaydi
  • HTTPS va HSTS; HTTP → HTTPS yo'naltirish (yoki reverse proxy da)
  • Developer exception page va OpenAPI UI o'chiq (yoki himoyalangan)
  • Har bir muhit uchun alohida kalitlar va parollar
  • Baza foydalanuvchisi — minimal huquqlar (superuser emas)
  • Log lar markaziy tizimga, maxfiy ma'lumotsiz
  • Health check va monitoring
  • Sirlarni almashtirish (rotation) tartibi bor

[!WARNING] Secret tasodifan git ga tushsa — commit ni o'chirish yetarli emas. Birinchi navbatda sirni bekor qiling va almashtiring (yangi parol, yangi kalit), keyin tarixni tozalang. GitHub ochiq repozitoriylarda ma'lum kalit formatlarini avtomatik skanerlaydi — botlar ham buni bir necha daqiqada qiladi.


Tez-tez uchraydigan xatolar

Muhit o'zgaruvchisida : — Linux da ishlamaydi; __ ishlating.

appsettings.Production.json da parollar — u ham git da va image da.

Development va Production bir xil kalit — lokal sizib chiqish production ni ochadi.


Xulosa

Konfiguratsiya va secret — alohida: secret hech qachon git yoki image da emas. Muhit — ASPNETCORE_ENVIRONMENT; manbalar tartibi: appsettings → appsettings.{Env} → User Secrets → muhit o'zgaruvchilari → argumentlar.

Lokal — dotnet user-secrets; production — muhit o'zgaruvchilari (Jwt__Kalit) yoki secret menejer (Key Vault, Vault). ValidateOnStart — noto'g'ri konfiguratsiya ishga tushishda aniqlanadi. Har muhitga alohida kalit; sizib chiqsa — avval almashtirish.


Keyingi dars

83-dars: Yakuniy loyiha — To-Do API: CRUD + JWT + EF Core + Docker