เมื่อทุกอย่างถูกเปิดออกสู่ Internet
ระบบที่เปิด Port ของ Web Application, API Server, PostgreSQL และ Redis ออกสู่ภายนอกทั้งหมด แม้ว่าระบบจะสามารถทำงานได้ตามปกติ แต่ก็หมายความว่าผู้ไม่หวังดีสามารถมองเห็น Service เหล่านี้ได้เช่นกัน
เมื่อ Database หรือ API สามารถเข้าถึงได้โดยตรงจาก Internet ผู้โจมตีสามารถสแกนหา Port ที่เปิดอยู่ ทดลองโจมตีด้วยการเดารหัสผ่าน หรือค้นหาช่องโหว่ที่อาจมีอยู่ใน Service เหล่านั้นได้ทันที ยิ่งมี Service ที่เปิดออกภายนอกมากเท่าไร พื้นที่ในการโจมตีก็จะเพิ่มขึ้นตามไปด้วย
แนวทางที่นิยมในระบบ Production
ระบบ Production ส่วนใหญ่มักเปิดออกสู่ Internet เพียง Web Layer เท่านั้น โดยใช้ Nginx หรือ Reverse Proxy เป็นจุดรับ Request จากภายนอก จากนั้นจึงส่งต่อคำขอไปยัง API และ Service อื่น ๆ ภายในระบบ
ในสถาปัตยกรรมลักษณะนี้ ผู้ใช้งานภายนอกจะเห็นเพียง Port 80 และ 443 เท่านั้น ขณะที่ API, PostgreSQL และ Redis จะทำงานอยู่ภายใน Docker Network ซึ่งสามารถติดต่อกันได้โดยตรง แต่ไม่สามารถถูกเรียกใช้งานจาก Internet ได้
แนวคิดนี้เปรียบเสมือนอาคารสำนักงานที่มีเพียงแผนกต้อนรับอยู่ด้านหน้า ส่วนห้องเซิร์ฟเวอร์ ห้องเก็บเอกสาร และพื้นที่สำคัญอื่น ๆ ถูกเก็บไว้ด้านในและจำกัดสิทธิ์การเข้าถึงเฉพาะผู้ที่เกี่ยวข้องเท่านั้น
Docker Network ทำให้ Container คุยกันได้โดยไม่ต้องเปิด Port
หลายคนเข้าใจว่าหากไม่เปิด Port ออกมา Container จะไม่สามารถสื่อสารกันได้ แต่ในความเป็นจริง Docker มีระบบ Network ภายในที่ออกแบบมาเพื่อแก้ปัญหานี้โดยเฉพาะ
Container สามารถเรียกหากันผ่านชื่อ Service ได้โดยตรง เช่น API สามารถเชื่อมต่อไปยัง PostgreSQL ผ่านชื่อ postgres หรือเชื่อมต่อ Redis ผ่านชื่อ redis ได้ทันที โดยไม่จำเป็นต้องเปิด Port 5432 หรือ 6379 ออกสู่ภายนอกเลย
ผลลัพธ์คือ Service ภายในยังคงทำงานร่วมกันได้อย่างสมบูรณ์ แต่ถูกซ่อนจากผู้ใช้งานภายนอก
ลด Attack Surface ของระบบ
ในด้าน Cyber Security มีคำหนึ่งที่ถูกพูดถึงอยู่เสมอคือ Attack Surface หรือพื้นที่ที่ผู้โจมตีสามารถใช้เป็นช่องทางเข้าสู่ระบบได้
ทุก Port ที่เปิดออกสู่ Internet คืออีกหนึ่งจุดที่อาจถูกโจมตีได้ในอนาคต ไม่ว่าจะเป็นช่องโหว่ของ Software การตั้งค่าที่ผิดพลาด หรือการโจมตีด้วยรหัสผ่านที่อ่อนแอ
การเปิดเฉพาะสิ่งที่จำเป็นจึงเป็นหลักการพื้นฐานของการออกแบบระบบที่ปลอดภัย ยิ่งเปิดน้อย ยิ่งลดความเสี่ยง และยิ่งดูแลรักษาได้ง่าย
การควบคุมสิทธิ์ทำได้ง่ายขึ้น
เมื่อทุก Request ต้องผ่าน API ก่อนเข้าถึงข้อมูลใน Database ระบบจะมีจุดศูนย์กลางสำหรับตรวจสอบสิทธิ์ผู้ใช้งาน
API สามารถตรวจสอบการ Login, JWT Token, Permission, Role และ Rate Limit ได้ก่อนที่จะอนุญาตให้เข้าถึงข้อมูลจริง ทำให้การควบคุมความปลอดภัยของระบบเป็นไปในทิศทางเดียวกัน
หาก Database ถูกเปิดออกสู่ภายนอกโดยตรง การจัดการสิทธิ์และการป้องกันจะซับซ้อนขึ้นอย่างมาก เพราะผู้ใช้งานสามารถพยายามเชื่อมต่อกับ Database ได้โดยไม่ผ่านชั้น API
ยืดหยุ่นต่อการขยายระบบในอนาคต
อีกหนึ่งข้อดีที่สำคัญคือความยืดหยุ่นในการปรับเปลี่ยนโครงสร้างระบบ
หากในอนาคตต้องการย้าย Database ไปยัง Server ใหม่ เปลี่ยนจาก PostgreSQL เป็น MySQL หรือย้ายไปใช้ Managed Database บน Cloud ผู้ใช้งานจะไม่ได้รับผลกระทบ เพราะยังคงสื่อสารกับ API Endpoint เดิม
แนวทางนี้ช่วยลดผลกระทบจากการเปลี่ยนแปลงภายใน และทำให้ทีมพัฒนาสามารถปรับปรุงระบบได้ง่ายขึ้นโดยไม่กระทบกับผู้ใช้งาน
แนวทางที่องค์กรขนาดใหญ่เลือกใช้
ไม่ว่าจะเป็นระบบที่ทำงานบน Docker, Kubernetes หรือ Cloud Platform ต่าง ๆ แนวคิดที่ได้รับความนิยมคือการเปิดเฉพาะ Layer ที่จำเป็นต่อผู้ใช้งานภายนอก และเก็บ Service ที่สำคัญไว้ใน Private Network
เหตุผลไม่ได้มีเพียงเรื่องความปลอดภัยเท่านั้น แต่ยังรวมถึงความง่ายในการดูแลรักษา การขยายระบบ และการบริหารจัดการโครงสร้างพื้นฐานในระยะยาว
สรุป
การเปิดออกสู่ Internet แค่ Web Layer และซ่อน API, Database รวมถึง Service อื่น ๆ ไว้ภายใน Docker Network ถือเป็นแนวทางมาตรฐานของระบบ Production ในปัจจุบัน
แนวทางนี้ช่วยลดความเสี่ยงจากการโจมตี ลดจำนวน Port ที่ต้องดูแล ควบคุมสิทธิ์การเข้าถึงได้ง่ายขึ้น และรองรับการขยายระบบในอนาคตได้ดีกว่า
หลักการสำคัญมีเพียงประโยคเดียวคือ
เปิดเฉพาะสิ่งที่จำเป็นให้โลกภายนอกเห็น และซ่อนทุกอย่างที่เหลือไว้ภายในระบบ