Docker สามารถช่วยให้การจัดการแอปของคุณให้เป็นเรื่องง่าย เหมือนการจัดการกล่องบรรจุ (Containers) มาพร้อมความสามารถในการเคลื่อนย้าย และปรับขนาดได้อย่างอิสระ แต่อย่างไรก็ตามความสะดวกสบายของ Engine ตัวนี้เหมือนดาบสองคม หากใช้ไม่ระวัง อาจกลายเป็นช่องทางให้ผู้โจมตีเข้ามาทำลายแอปพลิเคชันของเราได้ – การเรียนรู้ และเตรียมรับมือกับภัยคุกคามด้วยหลักการ Docker Security จึงเป็นสิ่งสำคัญ
สารบัญ
แนวทางการป้องกันภัยคุกคามด้วย Docker Security
1. ยึดหลักการ Holistic Approach (การรักษาความปลอดภัยแบบองค์รวม)
ผู้พัฒนาต้องนึงถึงการจัดการที่ดีในระดับ Docker host, Application runtime และ Code-level เพื่อป้องกันการโจมตี และช่องโหว่ในทุกๆ ส่วนของระบบ
- Docker host : โฮสต์ควรได้รับการอัปเดต และแพตช์อย่างสม่ำเสมอ (อุดช่องโหว่) ให้ความสำคัญกับการ Hardening Docker Host (กำหนดค่าความปลอดภัยขั้นสูงให้โฮสต์) เช่น เปิดใช้งาน SELinux หรือ AppArmor เพื่อควบคุมการเข้าถึง Container
- Application runtime : ป้องกันการโจมตีที่อาจเกิดขึ้นจากการรันโค้ด หรือการทำงานของแอปพลิเคชัน อาทิเช่น การให้สิทธิ์น้อยที่สุดในการเข้าถึงทรัพยากร (ไม่ควรได้รับสิทธิ์ Root ในการเข้าถึงระบบทั้งหมด) และการจัดการข้อมูลสำคัญ โดยใช้ Microservices เพื่อแยกส่วนในการดูแลจัดการ
- Code-Level : เลือกใช้แนวทางการเขียนโค้ดที่ปลอดภัย เช่น ป้องกัน SQL Injection, Cross-site scripting (XSS) หรือ Remote Code Execution (RCE) และมีการจัดการ Dependencies หรือ Libraries ที่ดี (ที่สำคัญอย่าลืมอัพเดตอย่างสม่ำเสมอ)
เพิ่มเติม : ควรอัปเดต Docker Images ที่ใช้งานอย่างสม่ำเสมอ และใช้ Images จากแหล่งที่เชื่อถือได้เท่านั้น (Official หรือ Hub Official Images) หมั่นตรวจสอบโดยใช้เครื่องมือในการสแกน Container เพื่อหาช่องโหว่ เช่น Clair, Trivy, หรือ Docker Security Scanning
2. Know What’s in Your Container (รู้ว่าอะไรอยู่ภายใน Container ?)
- รู้ว่าแต่ละเลเยอร์ของ Container มีอะไรบ้าง : แต่ละเลเยอร์ใน Docker Image ต้องมีจุดประสงค์ชัดเจน เพื่อให้เข้าใจได้ง่าย ลดความซับซ้อน และมีขนาดเล็ก ซึ่งส่งผลให้ Container ทำงานได้เร็วขึ้น และมีประสิทธิภาพ
- ทุกอย่างที่รันใน Container ต้องประกาศไว้ : ควรกำหนดไว้ใน Dockerfile ให้ชัดเจน เพื่อความโปร่งใส และง่ายต่อการตรวจสอบในภายหลัง
- หลีกเลี่ยงซอฟต์แวร์จาก Third-party ในขณะ Runtime : เป็นความเสี่ยงที่อาจเปิดช่องทางให้ผู้โจมตีเข้ามาในระบบ หรือรันโค้ดที่ไม่รู้จักซึ่งอาจมีการแฝงมัลแวร์ หรือทำให้เกิดช่องโหว่ได้ในอนาคต
3. หลีกเลี่ยงปัญหา Noisy Neighbor
ปัญหา Noisy Neighbor เกิดขึ้นเมื่อ Container นึงๆ ใช้ทรัพยากรระบบ (เช่น CPU, RAM, หรือ Disk I/O) มากเกินไป ส่งผลต่อประสิทธิภาพของ Container อื่นๆ ที่ทำงานอยู่บนโฮสต์เดียวกัน แก้ปัญหาได้โดยลดการใช้ทรัพยากรเกินขนาด – กำหนดขีดจำกัดของทรัพยากรระบบ ได้โดยวิธีการ ดังนี้
- Limit CPU :
docker run --cpus=".5" my_container
- Limit Memory :
docker run --memory="512m" my_container
- Limit Disk I/O :
docker run --blkio-weight="500" my_container
นักพัฒนาสามารถอ่านรายละเอียดเกี่ยวกับการตั้งค่าความปลอดภัยให้ Docker เพิ่มเติมได้ที่นี่ Website Official
บทสรุป
หลักการเหล่านี้เป็นเพียงแนวทางสำคัญที่ช่วยรักษาความปลอดภัยของแอปพลิเคชันที่รันอยู่ใน Docker Containers การทำความเข้าใจหลักการ และแนวทางต่างๆ สามารถช่วยให้นักพัฒนาสามารถสร้างกำแพงป้องกันที่แข็งแกร่งขึ้น เพื่อรองรับภัยคุกคามที่อาจมาโดยไม่ได้ตั้งตัวได้อย่างมีประสิทธิภาพ แต่อย่างไรก็ตามต้องสร้างความตระหนักให้ผู้พัฒนาเกิดการนำไปใช้อย่างจริงจังถึงจะเห็นผล