สรุปบทความ - trabnm1313/SDTP GitHub Wiki

สรุปบทความ

Top 10 Docker Security จาก OWASP

D01 - Secure User Mapping

  • ไม่ควร Run Application Image ไว้บน Root

D02 - Patch Management Strategy

  • Image ที่อยู่บน Production เมื่อมี Bug เกิดขึ้นควรมีการกำหนด Patch รับมือตามปกติหรือแบบที่ต้องแก้ไขฉุกเฉินไว้ด้วย

D03 - Network Segmentation And Firewalling

  • ควรมีการ Design Network ของ Container กำหนดสิทธิ์ในการเข้าถึงให้ใช้ได้แค่ใน Application ห้ามถูกเรียกจากภายนอก

D04 - Secure Defaults And Hardening

  • ตรวจสอบให้ดีว่าไม่มี Component ที่ไม่ได้ใช้อยู่ใน Container และสำหรับตัวที่ใช้ก็ควรมีการ Locked Down ไว้ด้วย

D05 - Maintain Security Contexts

  • อย่าใส่อะไรเข้าไปใน Container มั่ว ๆ และควรแยก Backend กับ Frontend ออกจากกันเพื่อ Security ที่ดีกว่า

D06 - Protect Secrets

  • Password, Tokens, Key ต่าง ๆ ที่เป็น Secret File ควรถูกต้องป้องกันให้ดีที่สุดเท่าที่จะเป็นไปได้

D07 - Resource Protection

  • คิดไว้เสมอว่า Container ทุกตัวนั้นอยู่ในอุปกรณ์ Physical ตัวเดียวกันดังนั้น ตรวจสอบให้แน่ใจว่าถ้าเกิดกรณีที่มี Container Down จะไม่กระทบต่อการทำงานของ Container ตัวอื่น

D08 - Container Image Integrity And Origin

  • บน Container ควรมี OS อยู่เสมอและควรมีการตรวจสอบด้วยว่า Image ที่อยู่ใน Container ไม่ได้ถูกเปลี่ยนแปลงไปจากที่ Build

D09 - Follow Immutable Paradigm

  • Image ที่ได้ Build มาควรเป็น Read-Only ไม่สามารถถูกแก้ไขหรือเขียนทับได้

D10 – Logging

  • ควรมีการเก็บ Log ในทุก ๆ การกระทำที่เกิดขึ้นบน Container และต้องสามารถ Remote เข้ามาดู Log ตัวนั้นได้เช่นกัน

12-Factor with Docker

12-Factor

  1. Codebase
  • ในหนึ่งแอปควรมี แค่ 1 “Codebase” ไม่อย่างนั้นมันจะไม่ใช่ Application แต่เป็น System ที่มีหลาย Application แทน
  1. Dependencies
  • Application's Dependencies ต้องประกาศและแยกออกให้เด่นชัด
  1. Configuration
  • การตั้งค่าต่าง ๆ อย่างเช่นในส่วนของ Credentials, Database Connection Dtring ควรเก็บแยกไว้ในไฟล์ Environment (.env)
  1. External Services
  • การจัดการ Service ภายนอก ควรจัดการให้เป็น ทรัพยากรภายนอกของแอปพลิเคชัน
  1. Build / Release / Run
  • ขั้นตอนการ สร้าง ปล่อย และ สั่งทำงาน ควรแยกออกจากกันอย่างเด่นชัด
  1. Processes Application
  • ควรประกอบไปด้วยหลาย ๆ ขั้นตอน และ แต่ละขั้นตอนต้องเป็นแบบ Stateless และไม่ควรใช้ที่เก็บข้อมูลภายใน ข้อมูลที่จำเป็นควรจัดเก็บแบบ Stateful เช่น ฐานข้อมูล
  1. Port Binding
  • การแสดงผลของแอปพลิเคชันสู่ภายนอก ควรมีการเรียกใช้ Dependencies เฉพาะเจาะจง (เช่น HTTP Server) และให้บริการผ่าน Port
  1. Concurrency
  • สามารถปรับ Scale แบบ Horizontal พร้อมกับมี Processes Model
  1. Disposability
  • แต่ละขั้นตอนของ Application ต้องกำจัดทิ้งได้ (Disposable)
  1. Dev / Prod Parity
  • environments (ไฟล์ Config) ที่แตกต่างกันควรอยู่ให้ใกล้กันมากที่สุด
  1. Logs
  • ประวัติการทำงาน (Logs) ควรจัดการให้เป็นลำดับเวลาและอยู่ในรูปของตัวอักษร
  1. Admin processes
  • ขั้นตอนการทำงานของผู้ดูแล ควรเป็น One-Off (ทำครั้งเดียว) ไม่ควรมีขั้นตอนที่่ต้องทำต่อเนื่องยาว ๆ

ตัวอย่างการนำไปใช้ 12-Factor with Docker

  1. Codebase
  • ใช้กำหนด Git Versioning
  1. Dependencies
  • ประกาศ Dependencies ใน package.json

  1. Configuration
  • Frontend มีการกำหนด Config ใน vue.config.js
  • Backend มีการกำหนด Config ใน .env

  1. External Services
  • การบริการภายนอกที่แอปพลิเคชันใช้คือฐานข้อมูล Firebase Firestore

  1. Build / Release / Run
  • มีไฟล์ Dockerfile ในการกำหนดขั้นตอนการสร้าง
  • มีไฟล Docker-Compose เพื่อกำหนดค่าการปล่อย
  • หลังจาก Build Image ด้วย Docker-Compose เสร็จจะสั่ง Run Container ให้พร้อมใช้งานได้เลย
  1. Port Binding
  • มีการกำหนด Port ภายในไฟล์ Docker-Compose
  • มีการกำหนด Port ภายในของ Backend ด้วย Express.js

  1. Concurrency
  • มี Process Model แบบเดียวคือ Http Server
  1. Dev / Prod Parity
  • ไฟล์ Docker-Compose รันบน Docker Host