Summary of Docker security & 12 factor - taritinth/sw-dev-tools-and-environments-project GitHub Wiki

สรุปเรื่อง Top 10 :: Docker security จาก OWASP

OWASP (Open Web Application Security Project) Docker เป็นแนวทางในการวางแผนและสร้าง container ด้วย Docker อย่างปลอดภัย

  1. D1 Secure User Mapping
    application ใน container ไม่ควร run ด้วย root

  2. D2 Patch Management Strategy
    เครื่องมือในการจัดการ container หรือเครื่อง host, base image ส่วนใหญ่จะมี security bug ทำให้ต้องมีการจัดการ patching แบบปกติและฉุกเฉิน

  3. D3 Network Separation and Firewalling
    การออกแบบ network ของเครื่องมือ และของ container ว่า container ใดจะเข้าถึงได้จากภายในหรือภายนอก

  4. D4 Secure Defaults and Hardening
    การทำให้แน่ใจว่ามีเพียงสิ่งที่เราต้องการใช้งานเท่านั้นที่ถูกติดตั้งและทำงานอยู่ ไม่ว่าจะเป็นที่ host, container และเครื่องมือในการจัดการ

  5. D5 Maintain Security Contexts
    การแยกการทำงานของแต่ละส่วนงานให้อยู่ต่างเครื่องกัน เช่น frontend กับ backend เพื่อให้สามารถจัดการความปลอดภัยแยกกัน ทำให้ช่วยลดความผิดพลาดได้ดีขึ้น

กลุ่มของเราได้แยกการพัฒนาเป็น Frontend และ Backend ทั้งในการพัฒนาและ docker

version: "3"
services:
  frontend:
    image: 808218764127/team-8-frontend
    build: ./frontend
  backend:
    image: 808218764127/team-8-backend
	build: ./backend
  1. D6 Protect Secrets
    การจัดการกับ secret ต่าง ๆ เช่น password, token และ private key

  2. D7 Resource Protection
    การจัดการใช้งาน resource ของแต่ละ container ให้อยู่ในขอบเขตที่กำหนด (limit resources) ทั้ง CPU, Memory, Disk และ Network เพื่อไม่ให้ไปกระทบต่อการทำงานของ container อื่น ๆ

  3. D8 Container Image Integrity and Origin
    การจัดการ Image ว่าจะไม่ถูกเปลี่ยนแปลงตั้งแต่ต้นจนถึงการ deploy

  4. D9 Follow Immutable Paradigm
    container ส่วนใหญ่ไม่ต้องการเขียนข้อมูลหรือ mount ไปยัง file system จึงกำหนดให้ container ทำงานแบบ read-only ก็เพียงพอ ช่วยทำให้มีความปลอดภัยมากขึ้น

  5. D10 Logging

ทุก ๆ container, host และเครื่องมือในการ deploy ไม่ว่าจะเกิดเหตุการณ์ใด ๆ ก็ตามจะต้องถูกบันทึกไว้เสมอ เพื่อให้สามารถพิสูจน์การทำงานและตัวตนได้ โดย log ไม่ได้เขียนไว้ใน container แนะนำให้เก็บแบบ remote หรือพวก centralize log ไป

สรุปเรื่องของ 12-Factor with Docker

เป็น Checklist หรือ แนวคิด ที่ใช้สำหรับการพัฒนา application โดยทั้ง docker นั้นจะตอบโจทย์และสามารถประยุกต์ตาม 12 factor ทั้งหมด

  1. Codebase
    Source Code ที่ดี ควรมีที่เก็บเพียงที่เดียว หรือคือการนำ การจัดการซอร์สโค้ด (Source Code Management) เข้ามาใช้งาน ได้แก่ Version Control ต่างๆ เช่น Git, SVN

กลุ่มของเราได้ใช้ Git Version Control ในการทำงาน sw-dev-tools-and-environments-project

  1. Dependencies
    เป็นการประกาศว่าเราจะใช้ library ตัวไหน version อะไรบ้าง และที่สำคัญ ทุกครั้งที่มีการแก้ไขเปลี่ยนแปลง Source Code และมีการ Build ใหม่ ก็จะต้องทำการเรียกใช้หรือติดตั้ง Dependency ใหม่เสมอ ดังนั้นถ้ากระบวนการเหล่านี้เป็น Automation ก็แทบจะหลีกเลี่ยงไม่ได้เลยที่จะต้องใช้เครื่องมือประเภท Package/Dependency Management เช่น Composer, Nuget, CPAN, Rubygems

กลุ่มของเรามีการประกาศ Dependencies ไว้ภายใน package.json

  1. Config
    configuration ที่ดีไม่ควรอยู่ใน Application ควรจะต้องถูกแยกออกมาอยู่ใน System environment, configuration server หรือ remote configuration เพื่อที่จะสามารถแก้ไขได้ โดยที่จะไม่กระทบกับ code ใน application

กลุ่มของเรามีการกำหนด Configuration ไว้ภายใน .env

  1. Backing services
    ระบบการทำงานต้องมีความง่ายต่อการ deploy สามารถเปลี่ยนได้ง่าย เช่น ถ้าหากต้องการเปลี่ยน Database หรือ File system ของ service ก็สามารถเปลี่ยนได้ โดยมี Downtime ให้น้อยที่สุด

  2. Build, release, run
    ควรแยก process ในการ Build, Release, Run ออกจากกัน การ build คือการเอา source code ทุกอย่างมาทำ software test จากนั้นก็ ค่อย release แล้ว run ให้จบไปเป็น step step ไป จะไม่รวมกันเป็น step เดียว เพราะว่า ถ้ามีการผิดพลาดในแต่ละขั้นตอนแล้ว เราจะสามารถแก้ไขได้ง่าย และรู้ได้ว่าเกิดข้อผิดพลาดจากตรงไหนได้ง่ายขึ้น

กลุ่มของเรามีการใช้ docker และสร้าง pipeline ในกระบวนการ

  1. Processes
    ทุก ๆ service ควรทำให้เป็น stateless process

  2. Port binding
    สามารถที่จะรัน port เดียวกันได้ หลายตัวบนเครื่องเดียวกัน โดยหากต้องการใช้ port ก็ expose port ออก มา ก็จะสามารถเรียกใช้งานได้ ทำให้ไม่ต้องแก้ port เพื่อให้ service ต่างๆทำงานได้

  3. Concurrency
    เป็น model ในการ scale ตามแต่ละ service ถ้า service ไหนที่การใช้งานเยอะ ก็ scale เฉพาะ service นั้นให้มีจำนวนเครื่องที่ใช้ให้เหมาะสมตามการใช้งานของ service

  4. Disposability
    ระบบงานต้อง start ได้เร็วและจบลงได้สวย เพื่อลด Downtime

  5. Dev/prod parity ควรทำให้โครงสร้างของ environment เหมือนกัน

  6. Logs
    ทำ centralized log พยายามคิดว่า log ต่างๆ เป็น steam โดยที่อยากจะเก็บอะไรก็ค่อยเอา tool ต่าง ๆ มาเก็บข้อมูลที่เราอยากจะเก็บ

  7. Admin processes
    ถ้า admin ต้องการจะทำอะไรควรทำผ่านช่องทางหรือชุดคำสั่งที่กำหนดไว้ เพื่อลดปัญหาในการเปลี่ยนแปลงที่จะไม่เหมือนกันในแต่ละ environment