ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~12 นาที· อัปเดตล่าสุด

Secret — เก็บข้อมูลลับ

รหัสผ่าน, token, cert แยกจาก config ทั่วไป

พื้นฐานที่ควรรู้: นอกจากการตั้งค่าทั่วไปแล้ว ระบบมักต้องการรหัสผ่าน (Passwords), กุญแจ API (API Keys) หรือใบรับรอง (Certificates) ซึ่งเป็นข้อมูลที่อ่อนไหว หากหลุดไปอาจทำให้ระบบถูกโจมตีได้

Secret เหมือนตู้เซฟนิรภัย

Secret เหมือนตู้เซฟเทียบกับป้ายตั้งค่า (ConfigMap) ที่แปะโล่ง ๆ · ใช้เก็บของที่ห้ามหลุด: รหัสผ่านฐานข้อมูล, API key, TLS cert

Secret หน้าตาคล้าย ConfigMap แต่ตั้งใจใช้กับข้อมูลลับ · ค่าถูกเก็บแบบ base64-encoded และ K8s ควบคุมการเข้าถึงเข้มกว่า

# สร้างจาก literal (K8s เข้ารหัส base64 ให้)
kubectl create secret generic db-cred \
  --from-literal=DB_PASSWORD='s3cr3t!'

# อ้างใน container:
#   env:
#     - name: DB_PASSWORD
#       valueFrom:
#         secretKeyRef: { name: db-cred, key: DB_PASSWORD }
สร้าง Secret แล้วใช้เป็น env

สรุป Key Takeaways

  • Secret = ที่เก็บข้อมูลลับ (รหัสผ่าน, token, cert) แยกจาก ConfigMap
  • ค่าเป็น base64 ซึ่งไม่ใช่การเข้ารหัส — ต้องเปิด encryption at rest + RBAC
  • อย่า commit Secret ดิบลง Git · งานจริงใช้ Vault/Sealed Secrets/External Secrets

คำถามที่พบบ่อย

Secret ปลอดภัยกว่า ConfigMap จริงไหม

โดย default แทบไม่ต่าง — Secret แค่ base64 (encode ไม่ใช่ encrypt) ใครมีสิทธิ์อ่านก็ decode ได้ — ที่ทำให้ปลอดภัยจริงคือ: เปิด encryption at rest ของ etcd, จำกัด RBAC ว่าใครอ่าน Secret ได้, และงานจริงจังใช้ external secret manager (AWS Secrets Manager, Vault) sync เข้ามา

เก็บ secret ใน git ยังไงให้ถูกวิธี

ห้าม commit secret ตรงๆ เด็ดขาด — ทางเลือก: (1) Sealed Secrets เข้ารหัสไว้ให้ controller ใน cluster ถอดเอง (2) External Secrets Operator ดึงจาก secret manager ภายนอก (3) SOPS เข้ารหัสไฟล์ — ใน GitOps ทุกอย่างอยู่ใน git ได้ ยกเว้นความลับที่ต้องผ่านการเข้ารหัสเสมอ

อ่านจบแล้วอย่าลืมทำเครื่องหมาย