GoDasturchi
Secrets Management

Secrets Management

Maxfiy ma'lumotlarni boshqarish

Uy kalitingizni derazaga osib qo'ymaysiz, garchi bu "qulay" bo'lsa ham — chunki uni har kim ko'rib, ishlatishi mumkin. Dasturdagi "kalitlar" (parollar, API tokenlar, shifrlash kalitlari) bilan ham xuddi shunday: ularni hech qachon kodga yozib qo'ymang yoki oddiy matn holida logga chiqarmang.

example.go
package main

import "fmt"

// Logda ko'rsatish uchun maxfiy qiymatni "niqoblash"
func maskSecret(s string) string {
	if len(s) <= 4 {
		return "****"
	}
	return s[:2] + "****" + s[len(s)-2:]
}

func main() {
	apiKey := "sk_live_abcdef123456"

	// YOMON: fmt.Println("API kaliti:", apiKey) — to'liq kalit logda ko'rinadi!
	fmt.Println("API kaliti:", maskSecret(apiKey))
}

"Docker for Go Developers" kursida ("Environment Variables" darsida) ko'rganingizdek, sirlarni muhit o'zgaruvchilari orqali uzatish — birinchi qadam. Ikkinchi, ko'p unutiladigan qadam: sirlarni logga yozib qo'ymaslik. Agar debug qilish uchun konfiguratsiyani chop etish kerak bo'lsa, maskSecret kabi funksiya bilan uni "niqoblab" ko'rsatish kerak — to'liq qiymatni emas, faqat uni tanib olish uchun yetarli bo'lgan qismini (masalan boshi va oxiri).

Katta production tizimlarda sirlar odatda maxsus "sirlarni boshqarish" tizimlarida (masalan HashiCorp Vault, AWS Secrets Manager, yoki Kubernetes Secrets) saqlanadi — bular sirlarni shifrlab saqlaydi, kirish huquqini nazorat qiladi, va hatto ularni davriy ravishda avtomatik "aylantiradi" (rotation, ya'ni eski kalitni bekor qilib, yangisini yaratadi). Bu darsda ko'rgan os.Getenv — bu tizimlar sirni ilovaga qanday YETKAZIB berishining oxirgi, eng sodda bosqichi.

>_ Exercise

Konfiguratsiyani xavfsiz chop etadigan funksiya yozing.

  • printConfig(dbHost, apiKey string) yozing: dbHost'ni to'liq, apiKey'ni maskSecret orqali chop eting
  • printConfig("db.internal", "sk_live_abcdef123456") ni chaqiring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Maxfiy ma'lumotlarni nafaqat kodga yozmaslik, balki hatto debug maqsadida ham to'liq holda logga chiqarmaslik kerak — buning uchun ularni chop etishdan oldin "niqoblash" (masking) amaliyoti qo'llaniladi.

NEXT UP

Deployment Strategies: Concepts

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Secrets Management

Maxfiy ma'lumotlarni boshqarish

Uy kalitingizni derazaga osib qo'ymaysiz, garchi bu "qulay" bo'lsa ham — chunki uni har kim ko'rib, ishlatishi mumkin. Dasturdagi "kalitlar" (parollar, API tokenlar, shifrlash kalitlari) bilan ham xuddi shunday: ularni hech qachon kodga yozib qo'ymang yoki oddiy matn holida logga chiqarmang.

example.go
package main

import "fmt"

// Logda ko'rsatish uchun maxfiy qiymatni "niqoblash"
func maskSecret(s string) string {
	if len(s) <= 4 {
		return "****"
	}
	return s[:2] + "****" + s[len(s)-2:]
}

func main() {
	apiKey := "sk_live_abcdef123456"

	// YOMON: fmt.Println("API kaliti:", apiKey) — to'liq kalit logda ko'rinadi!
	fmt.Println("API kaliti:", maskSecret(apiKey))
}

"Docker for Go Developers" kursida ("Environment Variables" darsida) ko'rganingizdek, sirlarni muhit o'zgaruvchilari orqali uzatish — birinchi qadam. Ikkinchi, ko'p unutiladigan qadam: sirlarni logga yozib qo'ymaslik. Agar debug qilish uchun konfiguratsiyani chop etish kerak bo'lsa, maskSecret kabi funksiya bilan uni "niqoblab" ko'rsatish kerak — to'liq qiymatni emas, faqat uni tanib olish uchun yetarli bo'lgan qismini (masalan boshi va oxiri).

Katta production tizimlarda sirlar odatda maxsus "sirlarni boshqarish" tizimlarida (masalan HashiCorp Vault, AWS Secrets Manager, yoki Kubernetes Secrets) saqlanadi — bular sirlarni shifrlab saqlaydi, kirish huquqini nazorat qiladi, va hatto ularni davriy ravishda avtomatik "aylantiradi" (rotation, ya'ni eski kalitni bekor qilib, yangisini yaratadi). Bu darsda ko'rgan os.Getenv — bu tizimlar sirni ilovaga qanday YETKAZIB berishining oxirgi, eng sodda bosqichi.

>_ Exercise

Konfiguratsiyani xavfsiz chop etadigan funksiya yozing.

  • printConfig(dbHost, apiKey string) yozing: dbHost'ni to'liq, apiKey'ni maskSecret orqali chop eting
  • printConfig("db.internal", "sk_live_abcdef123456") ni chaqiring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Maxfiy ma'lumotlarni nafaqat kodga yozmaslik, balki hatto debug maqsadida ham to'liq holda logga chiqarmaslik kerak — buning uchun ularni chop etishdan oldin "niqoblash" (masking) amaliyoti qo'llaniladi.

NEXT UP

Deployment Strategies: Concepts