Security — ทำให้คลัสเตอร์ปลอดภัย
NetworkPolicy, Pod security, image และ least privilege
พื้นฐานที่ควรรู้: ความปลอดภัยในระบบคลาวด์ไม่ได้มาจากจุดเดียว แต่เป็นหลักการ "Defense in Depth" หรือการป้องกันแบบหลายชั้น เผื่อว่าหากแฮกเกอร์ทะลวงเข้ามาได้หนึ่งชั้น ก็จะยังเจอกับเกราะป้องกันชั้นถัดไป
ความปลอดภัยคลัสเตอร์เหมือนระบบรักษาความปลอดภัยตึกหลายชั้น: ประตูห้อง (NetworkPolicy), บัตรพนักงาน (RBAC), ตรวจของก่อนเข้า (image scanning), และไม่ให้ใครถือกุญแจ master โดยไม่จำเป็น (least privilege)
NetworkPolicy — ไฟร์วอลล์ระหว่าง Pod
ค่าเริ่มต้นของ K8s คือ Pod ทุกตัวคุยกันได้หมด (flat network) · NetworkPolicy ให้เราจำกัดว่า Pod ไหนคุยกับ Pod/namespace ไหนได้ — เช่น ให้เฉพาะ frontend เรียก backend, และ backend เท่านั้นที่แตะ database
จำกัดเส้นทาง: อนุญาตเฉพาะ frontend→backend→db
🚫 frontend เรียก database ตรง ๆ ไม่ได้ (ถูก NetworkPolicy บล็อก)
เช็กลิสต์ความปลอดภัยที่ควรทำ
- NetworkPolicy — ปิด traffic ที่ไม่จำเป็น (default-deny แล้วเปิดเฉพาะที่ต้อง)
- RBAC least privilege — ให้ ServiceAccount สิทธิ์เท่าที่ใช้ (ทบทวนจาก M6)
- Pod Security — ห้ามรันเป็น root, ปิด privileged, ตั้ง
readOnlyRootFilesystem(ผ่าน Pod Security Standards) - Image security — ใช้ image จาก registry ที่เชื่อถือได้, สแกนช่องโหว่ (Trivy), pin เวอร์ชันไม่ใช้ latest
- Secrets — เปิด encryption at rest, ใช้ External Secrets/Vault (ทบทวนจาก M4)
สรุป Key Takeaways
- ดีฟอลต์ Pod คุยกันได้หมด — ใช้ NetworkPolicy (default-deny) จำกัดเส้นทาง
- ต้องมี CNI ที่รองรับ (Calico/Cilium) NetworkPolicy ถึงมีผล
- ซ้อนหลายชั้น: NetworkPolicy + RBAC + Pod Security + image scanning + secrets
คำถามที่พบบ่อย
Security ใน K8s เริ่มจากอะไรถ้าทำได้ 5 อย่างแรก
(1) RBAC least privilege — เลิกแจก cluster-admin (2) NetworkPolicy กั้นเครือข่ายเริ่มจาก default-deny (3) รัน container เป็น non-root + readOnlyRootFilesystem (4) สแกน image หาช่องโหว่ใน CI (5) เก็บ secret ให้ถูก (encrypt etcd หรือ external manager) — ห้าข้อนี้ตัดความเสี่ยงส่วนใหญ่ของ cluster ทั่วไป
Pod Security Standards คืออะไร
มาตรฐานสามระดับของ K8s เอง: privileged (ไม่กัน) / baseline (กันท่าอันตรายพื้นฐาน) / restricted (เข้มสุด — non-root, ตัด capabilities) — เปิดใช้ระดับ namespace ผ่าน label ให้ K8s ปฏิเสธ pod ที่ไม่ผ่านมาตรฐานตั้งแต่ตอนสร้าง

