Environment va Secrets — production sozlamalar, .env, secret management
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:
appsettings.jsonappsettings.{Environment}.json- User Secrets (faqat Development)
- Muhit o'zgaruvchilari
- 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 passwordbilan tekshiring;gitleakskabi vositalar CI da) -
appsettings.Development.jsonimage 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