สรุปบทความ - 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
- Codebase
- ในหนึ่งแอปควรมี แค่ 1 “Codebase” ไม่อย่างนั้นมันจะไม่ใช่ Application แต่เป็น System ที่มีหลาย Application แทน
- Dependencies
- Application's Dependencies ต้องประกาศและแยกออกให้เด่นชัด
- Configuration
- การตั้งค่าต่าง ๆ อย่างเช่นในส่วนของ Credentials, Database Connection Dtring ควรเก็บแยกไว้ในไฟล์ Environment (.env)
- External Services
- การจัดการ Service ภายนอก ควรจัดการให้เป็น ทรัพยากรภายนอกของแอปพลิเคชัน
- Build / Release / Run
- ขั้นตอนการ สร้าง ปล่อย และ สั่งทำงาน ควรแยกออกจากกันอย่างเด่นชัด
- Processes Application
- ควรประกอบไปด้วยหลาย ๆ ขั้นตอน และ แต่ละขั้นตอนต้องเป็นแบบ Stateless และไม่ควรใช้ที่เก็บข้อมูลภายใน ข้อมูลที่จำเป็นควรจัดเก็บแบบ Stateful เช่น ฐานข้อมูล
- Port Binding
- การแสดงผลของแอปพลิเคชันสู่ภายนอก ควรมีการเรียกใช้ Dependencies เฉพาะเจาะจง (เช่น HTTP Server) และให้บริการผ่าน Port
- Concurrency
- สามารถปรับ Scale แบบ Horizontal พร้อมกับมี Processes Model
- Disposability
- แต่ละขั้นตอนของ Application ต้องกำจัดทิ้งได้ (Disposable)
- Dev / Prod Parity
- environments (ไฟล์ Config) ที่แตกต่างกันควรอยู่ให้ใกล้กันมากที่สุด
- Logs
- ประวัติการทำงาน (Logs) ควรจัดการให้เป็นลำดับเวลาและอยู่ในรูปของตัวอักษร
- Admin processes
- ขั้นตอนการทำงานของผู้ดูแล ควรเป็น One-Off (ทำครั้งเดียว) ไม่ควรมีขั้นตอนที่่ต้องทำต่อเนื่องยาว ๆ
ตัวอย่างการนำไปใช้ 12-Factor with Docker
- Codebase
- ใช้กำหนด Git Versioning
- Dependencies
- ประกาศ Dependencies ใน package.json
- Configuration
- Frontend มีการกำหนด Config ใน vue.config.js
- Backend มีการกำหนด Config ใน .env
- External Services
- การบริการภายนอกที่แอปพลิเคชันใช้คือฐานข้อมูล Firebase Firestore
- Build / Release / Run
- มีไฟล์ Dockerfile ในการกำหนดขั้นตอนการสร้าง
- มีไฟล Docker-Compose เพื่อกำหนดค่าการปล่อย
- หลังจาก Build Image ด้วย Docker-Compose เสร็จจะสั่ง Run Container ให้พร้อมใช้งานได้เลย
- Port Binding
- มีการกำหนด Port ภายในไฟล์ Docker-Compose
- มีการกำหนด Port ภายในของ Backend ด้วย Express.js
- Concurrency
- มี Process Model แบบเดียวคือ Http Server
- Dev / Prod Parity
- ไฟล์ Docker-Compose รันบน Docker Host