แผนการเรียนรู้
/

สัปดาห์ที่ 14: Security ใน DevOps (DevSecOps) และ Best Practices

ยกระดับความปลอดภัยให้เป็นส่วนหนึ่งของดีเอ็นเอในการพัฒนาซอฟต์แวร์ และเรียนรู้วิธีปฏิบัติที่เป็นเลิศ

Agenda วันนี้

  • DevSecOps & Shift-Left: แนวคิดการขยับความปลอดภัยไปข้างหน้า
  • Pipeline Security: การทดสอบความปลอดภัยอัตโนมัติ (SAST, DAST, SCA)
  • Container Security: การสแกน Image และความปลอดภัยขณะรันไทม์
  • Configuration & Secrets: การจัดการข้อมูลความลับอย่างปลอดภัย
  • Best Practices & Anti-patterns: สิ่งที่ควรทำและสิ่งที่ควรหลีกเลี่ยงใน DevOps
DevOps Course: Week 14

ทบทวนสัปดาห์ที่ 13 (Recap)

สัปดาห์ที่แล้วเราเรียนรู้เกี่ยวกับการเฝ้าระวังขั้นสูง และการจัดการกับปัญหา (Incident)

Exporters

การใช้ Node Exporter และ Blackbox Exporter เพื่อดึง Metrics จากระบบที่ไม่ได้ออกแบบมาเพื่อ Prometheus โดยตรง

SRE Concepts

การทำความเข้าใจ SLI (ตัวชี้วัด), SLO (เป้าหมาย), และ Error Budgets (โควตาความผิดพลาด)

Troubleshooting Frameworks

การใช้ USE Method สำหรับทรัพยากรฮาร์ดแวร์ และ RED Method สำหรับ Microservices

Blameless Post-mortem

การวิเคราะห์สาเหตุของปัญหา (Root Cause) โดยไม่กล่าวโทษบุคคล แต่เน้นปรับปรุงกระบวนการ

🛡️

DevSecOps คืออะไร?

DevSecOps (Development, Security, and Operations) คือการบูรณาการความปลอดภัย (Security) เข้าไปในทุกขั้นตอนของกระบวนการพัฒนาซอฟต์แวร์ (SDLC)

  • ความปลอดภัยไม่ใช่ขั้นตอนสุดท้าย หรือหน้าที่ของทีม Security ทีมเดียวอีกต่อไป
  • เปลี่ยนจากการตรวจสอบความปลอดภัย "หลังการพัฒนา" มาเป็น "ระหว่างการพัฒนา" อย่างต่อเนื่อง
  • เน้นการใช้เครื่องมืออัตโนมัติ (Automation) เพื่อไม่ให้ความปลอดภัยไปลดความเร็วในการส่งมอบซอฟต์แวร์

ปัญหาของการทำ Security แบบดั้งเดิม

Plan
Code
Build
Test
Security Audit ⛔
Deploy

คอขวด (Bottleneck)

ในอดีต ทีม Security จะทำการตรวจสอบ (Audit หรือ Penetration Test) ในช่วงท้ายของโปรเจกต์ก่อนขึ้น Production

  • หากพบช่องโหว่ร้ายแรง ทีม Dev ต้องรื้อโค้ดแก้ใหม่ ทำให้โปรเจกต์ล่าช้า (Delay)
  • เกิดความขัดแย้งระหว่างทีม Dev (อยากรีบปล่อยของ) และทีม Sec (ห้ามปล่อยถ้าไม่ปลอดภัย)

แนวคิด Shift-Left Security ⏪

Shift-Left คือการ "เลื่อน" กระบวนการตรวจสอบและคิดเรื่องความปลอดภัยไปทาง "ซ้าย" (ช่วงเริ่มต้น) ของ Pipeline ให้เร็วที่สุดเท่าที่จะทำได้

  • เริ่มตั้งแต่การออกแบบ (Threat Modeling) และวิเคราะห์ความเสี่ยงตั้งแต่เนิ่นๆ
  • ฝังเครื่องมือสแกนความปลอดภัยไว้ใน IDE ของนักพัฒนา และใน CI/CD Pipeline ทันทีที่มีการ Commit โค้ด
  • ผลลัพธ์: พบปัญหาเร็วขึ้น แก้ไขง่ายขึ้น และส่งมอบงานได้เร็วเหมือนเดิม

ทำไม Shift-Left ถึงสำคัญ? (Cost of Change)

ต้นทุนและเวลาในการแก้ไขช่องโหว่จะเพิ่มขึ้นทวีคูณ หากเราพบมันช้าลง

1x
Coding
10x
Testing/CI
30x
Staging
100x
Production
หากพบช่องโหว่ขณะกำลังเขียนโค้ด นักพัฒนาสามารถแก้ได้ทันทีใน 5 นาที แต่ถ้าช่องโหว่นั้นหลุดไปถึง Production การแก้ไขจะต้องผ่านกระบวนการประชุม, การสร้าง Patch, การหยุดระบบชั่วคราว, และอาจสร้างความเสียหายทางธุรกิจมหาศาล

ความปลอดภัยใน CI/CD Pipeline

การสร้าง DevSecOps Pipeline คือการเพิ่ม Gate การตรวจสอบความปลอดภัยในทุกจุด

1. Code / Commit

Pre-commit Hooks

IDE Security Plugins

Secret Scanning

2. Build (CI)

SAST

SCA

Unit Tests

3. Test & Deploy (CD)

DAST

Container Scan

IaC Scan

4. Operate

Runtime Protection

Monitoring & Alerts

Penetration Test

SAST (Static Application Security Testing)

SAST คือการสแกน Source Code หรือ Bytecode เพื่อหาจุดบกพร่องด้านความปลอดภัย "โดยไม่ต้องรันโปรแกรม" (White-box testing)

  • ค้นหา Pattern ของโค้ดที่ไม่ปลอดภัย เช่น SQL Injection, XSS, การจัดการ Buffer ผิดพลาด
  • ทำงานได้เร็วมากและมักจะรวมอยู่ใน CI Pipeline ทันทีที่มีการเปิด Pull Request
  • ช่วยระบุบรรทัดของโค้ดที่มีปัญหาได้อย่างแม่นยำ ทำให้นักพัฒนาแก้ไขได้ทันที
  • เครื่องมือยอดนิยม: SonarQube, Semgrep, Checkmarx, Bandit

DAST (Dynamic Application Security Testing)

DAST คือการสแกนความปลอดภัย "ขณะที่แอปพลิเคชันกำลังทำงานอยู่ (Runtime)" โดยการจำลองการโจมตีจากภายนอก (Black-box testing)

  • ค้นหาช่องโหว่ที่เกิดขึ้นเมื่อระบบประกอบร่างกันแล้ว เช่น ปัญหาเรื่อง Authentication, API endpoints หรือการตั้งค่า Server ผิดพลาด
  • มักจะทำงานในสเตจ Staging ก่อนขึ้น Production
  • ไม่สามารถบอกได้ว่าโค้ดบรรทัดไหนผิด แต่บอกได้ว่า URL หรือ Request ไหนมีช่องโหว่
  • เครื่องมือยอดนิยม: OWASP ZAP, Burp Suite

SAST vs DAST ต่างกันอย่างไร?

คุณสมบัติ SAST (Static) DAST (Dynamic)
วิธีการสแกน วิเคราะห์ Source Code (White-box) ยิง Request โจมตีระบบที่รันอยู่ (Black-box)
ช่วงเวลา (Pipeline) ทำได้ทันทีในขั้นตอน Build หรือ PR ต้องรอแอป Deploy ลง Staging ก่อน
สิ่งที่ค้นพบ บอกได้ถึงระดับบรรทัดโค้ด บอกช่องโหว่ของ HTTP/API, รหัสผ่านหลุดรอด
จุดอ่อน อาจเจอ False Positives เยอะ และไม่เห็นคอนฟิกตอนรัน ใช้เวลาสแกนนาน หาต้นตอในโค้ดยาก

SCA (Software Composition Analysis)

แอปพลิเคชันยุคใหม่มักมีโค้ดที่เราเขียนเองเพียง 10-20% ที่เหลือคือ 3rd Party Libraries (Open Source)

SCA คือเครื่องมือวิเคราะห์และสแกน Dependency เหล่านี้ (เช่น ไฟล์ package.json , requirements.txt ) เพื่อตรวจสอบว่า:

  • มี Library ตัวไหนที่มีช่องโหว่ (CVEs - Common Vulnerabilities and Exposures) ที่ถูกเปิดเผยแล้วหรือไม่?
  • มีปัญหาเรื่องลิขสิทธิ์ (License Risks) หรือไม่?
  • เครื่องมือยอดนิยม: Snyk, Dependabot, npm-audit

*SCA เป็นปราการด่านสำคัญในการป้องกัน Supply Chain Attacks

การรักษาความปลอดภัยให้ระบบ CI/CD

เป้าหมายชั้นดีของแฮกเกอร์

CI/CD Server (เช่น Jenkins) มีสิทธิ์ในการดึง Source Code และมีรหัสผ่านในการเข้าถึง Production Server หาก CI/CD โดนแฮก ระบบทั้งหมดก็จะโดนยึด!

  • การแยก Network (Isolation): ควรแยกเครื่อง Development และ CI Server ออกจากเครือข่ายหลักขององค์กร
  • Least Privilege: บัญชีที่ใช้เชื่อมต่อ (Service Accounts) ต้องมีสิทธิ์เท่าที่จำเป็น (Read-only access กับ Repo)
  • Review Third-party Plugins: ปลั๊กอินภายนอกที่ติดตั้งใน CI ต้องได้รับการประเมินความเสี่ยงและอัปเดตเสมอ

ความปลอดภัยของ Container 🐳

ถึงแม้ Container จะให้ความสามารถในการแยกส่วน (Isolation) แต่มันไม่ได้ปลอดภัย 100% โดยธรรมชาติ เพราะมันยังใช้ Kernel เดียวกับเครื่องโฮสต์ (Host OS)

ความปลอดภัยของ Container (Container Security) แบ่งออกเป็น 2 ส่วนหลักๆ คือ:

  • Image Security: การทำให้แน่ใจว่าของที่แพ็กมาใน Container (Image) นั้นสะอาดและปราศจากช่องโหว่
  • Runtime Security: การควบคุมพฤติกรรมของ Container ขณะที่มันกำลังทำงานอยู่ เพื่อป้องกันการถูกเจาะระบบ

Container Image Scanning

ก่อนที่จะนำ Image ขึ้นไปรันบน K8s เราต้องสแกนหาช่องโหว่ใน OS packages และไลบรารีที่ฝังอยู่ข้างในเสียก่อน

แนวปฏิบัติที่ดี (Best Practices)

  • สแกนอัตโนมัติใน CI Pipeline ก่อน Push ขึ้น Container Registry
  • สแกน Registry อย่างต่อเนื่อง (เพราะช่องโหว่ใหม่ๆ ถูกค้นพบทุกวัน)
  • เลือกใช้ Minimal Base Images (เช่น Alpine Linux หรือ Distroless) เพื่อลดขนาดพื้นที่เสี่ยง

# ตัวอย่างการใช้ Trivy สแกน image

$ trivy image nginx:latest

Total: 45 (UNKNOWN: 0, LOW: 10, MEDIUM: 25, HIGH: 8, CRITICAL: 2)

*เครื่องมือยอดนิยม: Trivy, Clair, Anchore

การรับรองความถูกต้องของ Image (Image Signing)

การป้องกัน Supply Chain Attacks

เมื่อ Build และ Scan Image เสร็จแล้ว เราจะรู้ได้อย่างไรว่า Image ตัวนี้ไม่ได้ถูกแฮกเกอร์แอบสับเปลี่ยนระหว่างทางก่อนนำไป Deploy?

  • การทำ Digital Signature ให้กับ Binary หรือ Image
  • เมื่อ Kubernetes จะดึง Image ไปรัน Admission Controller จะทำการตรวจสอบ Signature (Verify) ก่อน ถ้าไม่ใช่ของแท้ จะบล็อกไม่ให้รัน
  • เครื่องมือมาตรฐานใหม่ที่ได้รับความนิยมคือ Sigstore (Cosign)

ความปลอดภัยขณะทำงาน (Runtime Security)

เมื่อ Container กำลังทำงานอยู่ เราต้องเฝ้าระวังพฤติกรรมที่ผิดปกติ (Anomalies)

สิ่งที่ต้องจับตาดู:

  • มีการพยายามยกระดับสิทธิ์ (Privilege Escalations) ภายใน Container หรือไม่?
  • มีการรันโปรเซสที่แปลกประหลาด เช่น โปรแกรมขุดเหรียญคริปโต หรือ Reverse Shell หรือไม่?
  • มีการเชื่อมต่อเครือข่ายไปยัง IP ปลายทางที่ไม่รู้จักหรือไม่?

*เครื่องมืออย่าง Falco (eBPF-based) สามารถตรวจจับและบล็อกพฤติกรรมเหล่านี้ได้แบบ Real-time

หลักการ Immutability & Least Privilege

Immutable Containers

Container ไม่ควรถูกแก้ไขขณะรันไทม์ ห้ามใช้คำสั่ง apt-get ติดตั้งของเพิ่ม ห้ามแก้ไขไฟล์โค้ดข้างใน

Best Practice: กำหนดให้ Filesystem เป็นแบบ Read-only (Read-only root filesystem) เพื่อป้องกันแฮกเกอร์ฝังมัลแวร์

Least Privilege

อย่ารัน Container ด้วยสิทธิ์ root เด็ดขาด! เพราะถ้าหลุดออกจาก Container ได้ (Container Breakout) จะกลายเป็น root ของเครื่องโฮสต์ทันที

Best Practice: สร้าง non-root user ใน Dockerfile เสมอ (เช่น USER 1000)

ความปลอดภัยของ Configuration & IaC ⚙️

ช่องโหว่จำนวนมากเกิดจากการ "ตั้งค่าผิด (Misconfigurations)" ไม่ใช่เพราะเขียนโค้ดแย่

  • Infrastructure as Code (IaC) Security: การสแกนไฟล์ Terraform, K8s YAML หรือ CloudFormation ก่อนนำไปสร้างจริง
  • ค้นหาจุดผิดพลาด เช่น การเปิด S3 Bucket ให้เป็น Public หรือการให้สิทธิ์ IAM Roles มากเกินไป (Overly permissive)
  • เครื่องมือยอดนิยม: KICS, Checkov, OPA (Open Policy Agent)

Secrets Management: ปัญหาการหลุดของรหัสผ่าน

กฎเหล็ก: "ห้าม Hardcode ข้อมูลความลับ (Secrets) ลงใน Source Code เด็ดขาด!"

Secrets ได้แก่ รหัสผ่าน Database, API Keys, SSH Keys, SSL Certificates หากหลุดเข้าไปใน Git Repository ต่อให้เป็น Private Repo ก็มีความเสี่ยงสูงที่จะโดนขโมย และจะอยู่ใน History ตลอดไป

# ตัวอย่างสิ่งที่ห้ามทำ (Anti-Pattern)

DB_PASSWORD = "mySuperSecretPassword123!"

AWS_ACCESS_KEY = "AKIAIOSFODNN7EXAMPLE"

เครื่องมือและแนวทางจัดเก็บ Secrets

แล้วเราควรเก็บ Secrets ไว้ที่ไหน?

1. การใช้ Secrets Vault

ใช้ระบบจัดเก็บความลับโดยเฉพาะ เช่น HashiCorp Vault, AWS Secrets Manager, หรือ Azure Key Vault ระบบเหล่านี้จะทำการเข้ารหัส และสามารถหมุนเวียนรหัส (Rotate) ได้อัตโนมัติ

2. การใช้ Environment Variables

แอปพลิเคชันควรอ่าน Secrets จาก Environment Variables ณ ตอนรันไทม์ โดยดึงค่ามาจาก Vault อีกที

3. Secret Scanning (ป้องกันหลุด)

ตั้งค่า CI/CD ให้มีเครื่องมือดักจับ Secrets (เช่น git-secrets, TruffleHog, Gitleaks) เพื่อตรวจหา API Key ก่อนที่จะถูก Commit

DevOps Best Practices

"ทำ DevOps อย่างไรให้ประสบความสำเร็จและยั่งยืน"

  • Everything as Code: ทำทุกอย่างให้เป็นโค้ด (Infrastructure, Pipeline, Configuration) เพื่อให้ตรวจสอบย้อนหลังและทำซ้ำได้เสมอ
  • Continuous Feedback: รับ Feedback อย่างรวดเร็วผ่าน Monitoring และ Alerting ที่มีประสิทธิภาพ
  • Incremental Threat Modeling: แบ่งการวิเคราะห์ความเสี่ยงด้านความปลอดภัยออกเป็นส่วนย่อยๆ และทำไปพร้อมกับการวางแผนฟีเจอร์ใน Agile (ไม่ทำทีเดียวตอนจบ)

DevOps Anti-Patterns คืออะไร?

Anti-Patterns คือรูปแบบการปฏิบัติหรือวิธีแก้ปัญหาที่ "ดูเหมือนจะเป็นความคิดที่ดีในตอนแรก" แต่สุดท้ายกลับสร้างปัญหาหรือทำให้ระบบแย่ลงในระยะยาว

การนำ DevOps หรือ เครื่องมือ CI/CD มาใช้ ไม่ได้หมายความว่าคุณกำลังทำ DevOps ที่ถูกต้อง หากคุณยังมีพฤติกรรมแบบ Anti-patterns เหล่านี้

Anti-Pattern 1: Silos & The Wall of Confusion

Dev Team
เน้นความเร็ว
กำแพง
Ops Team
เน้นความเสถียร

ปัญหา: ถึงแม้จะมีเครื่องมือ CI/CD แต่ทีมพัฒนากับทีมดูแลระบบยังทำงานแยกกัน โยนโค้ดข้ามกำแพงให้กัน หากระบบพัง ก็ชี้นิ้วโทษกัน (Blame game)

วิธีแก้: สร้างวัฒนธรรมการทำงานร่วมกัน (Collaboration) ให้ Dev รับผิดชอบสิ่งที่ตัวเองรัน (You build it, you run it) และ Ops ช่วยสร้าง Platform ให้ Dev ทำงานง่ายขึ้น

Anti-Pattern 2: การใช้บัญชีแชร์ร่วมกัน (Shared Accounts)

ปัญหา (The Problem)

การใช้อีเมลส่วนกลางหรือ User เดียว (เช่น admin/admin) ล็อกอินเข้าระบบ CI Server (เช่น Jenkins) หรือ Version Control ร่วมกันทั้งทีม

ทำให้ไม่สามารถตรวจสอบได้เลยว่าใครเป็นคนกดยกเลิก Build หรือใครเป็นคนแอบเปลี่ยนค่า Configuration (สูญเสียความสามารถในการ Audit)

วิธีแก้ (The Solution)

บัญชีผู้ใช้ต้องเป็นรายบุคคลเสมอ! เพื่อให้ระบบสามารถบันทึก Log และ Audit ได้อย่างชัดเจน

และใช้ระบบ Role-Based Access Control (RBAC) ให้อำนาจเฉพาะสิทธิ์ที่จำเป็นตามตำแหน่งหน้าที่ (Least Privilege)

Anti-Pattern 3: Security เป็นตัวขัดขวาง (Gatekeeper)

ปัญหา: ทีม Security สร้างกฎที่เข้มงวดและต้องมารออนุมัติแบบ Manual (Manual Approval)

เมื่อมีเครื่องมือสแกน (เช่น SAST/DAST) แต่ไม่มีคนคอยปรับจูน ปล่อยให้มันแจ้งเตือนผิดพลาด (False Positives) เยอะๆ ทำให้นักพัฒนาเกิดอาการ "Alert Fatigue" หรือความเหนื่อยล้าจากการแจ้งเตือน สุดท้ายก็จะเพิกเฉยต่อการแจ้งเตือนนั้นไปเลย

วิธีแก้:

บูรณาการเครื่องมืออัตโนมัติเข้ากับ Pipeline (DevSecOps) คัดกรอง Alert เฉพาะที่สำคัญจริงๆ (User Impact) และส่งเสริมให้ Security เป็น "ผู้สนับสนุน" ไม่ใช่ "ตำรวจ"

ความปลอดภัยคือความรับผิดชอบร่วมกัน

People, Process, and Technology

"เทคโนโลยีและเครื่องมือที่ดี ไม่สามารถอุดช่องโหว่ได้ทั้งหมด หากปราศจากกระบวนการที่ถูกต้องและวัฒนธรรมทีมที่ดี"

"Hire the right people and treat them right."

DevSecOps ที่แท้จริงคือการสร้างวัฒนธรรมที่พนักงานทุกคน (Dev, Ops, Sec) มีความรู้ความเข้าใจ ตระหนักถึงความเสี่ยง และทำงานร่วมกันในกระบวนการที่โปร่งใสและตรวจสอบได้ (Blameless Culture)

สรุปบทเรียน (Summary)

Shift-Left Security: การตรวจหาและแก้ไขช่องโหว่ตั้งแต่ช่วงเริ่มต้นของ SDLC เพื่อลดต้นทุนและประหยัดเวลา
Pipeline Security: การใช้ SAST (วิเคราะห์โค้ด) และ DAST (ทดสอบขณะรันไทม์) อัตโนมัติ
Container & IaC Security: สแกนหา CVEs ใน Image, ใช้ Least Privilege และตรวจสอบ Configuration เสมอ
Secrets Management: เลิก Hardcode ข้อมูลความลับ หันมาใช้ Vault หรือ Environment Variables
Culture: หลีกเลี่ยง Anti-patterns ปรับใช้ Blameless Culture เพื่อให้ DevSecOps ยั่งยืน

เตรียมตัวทำ Lab! 🔍

Next: Image Scanning และการประเมินความปลอดภัย

ในส่วนปฏิบัติการของสัปดาห์นี้ เราจะมาทดลองทำหน้าที่ตรวจประเมินความปลอดภัยของแอปพลิเคชันที่เราสร้างขึ้นมา

  • ✅ แนะนำและติดตั้งเครื่องมือสแกน Docker Image (เช่น Trivy หรือ Docker Scout)
  • ✅ ทดลองสแกน Docker Image ที่สร้างไว้จากสัปดาห์ก่อนๆ และอ่านผลวิเคราะห์ (Vulnerabilities Report)
  • ✅ ร่วมอภิปรายช่องโหว่ที่พบ (Critical / High) และสรุปแนวทางแก้ไขเพื่อให้โค้ดปลอดภัยยิ่งขึ้น
เตรียม Terminal และ Docker Desktop ของคุณให้พร้อม แล้วเจอกันในชั่วโมง Lab ครับ!

Lab: Image Scanning & Security Assessment 🛡️

ค้นหาช่องโหว่ที่ซ่อนอยู่ใน Docker Image ของคุณ และเรียนรู้วิธีการอุดรอยรั่วก่อนนำไปใช้งานจริง

🎯 เป้าหมายของ Lab นี้

  • ✅ ทำความรู้จักและใช้งานเครื่องมือ Docker Scout และ Trivy
  • ✅ ทดลองสแกนหาช่องโหว่ (Vulnerabilities) ใน Docker Image เก่า
  • ✅ อ่านและวิเคราะห์ผลลัพธ์จากรายงาน (CVEs)
  • ✅ แก้ไขปัญหาโดยการเปลี่ยน Base Image และสแกนซ้ำ
  • ✅ อภิปรายสรุป Best Practices ในการทำ Container Security

Step 1: แนะนำเครื่องมือ Image Scanning

ใน Lab นี้เราจะโฟกัสที่ 2 เครื่องมือยอดนิยมสำหรับการสแกนหาช่องโหว่ (Software Composition Analysis - SCA)

1. Docker Scout

ฟีเจอร์ที่ถูกผนวกเข้ามาใน Docker Desktop โดยตรง ช่วยวิเคราะห์ Supply Chain และให้คำแนะนำในการแก้ไข (Remediation) ทันที

ใช้งานผ่าน GUI ของ Docker Desktop หรือคำสั่ง:
$ docker scout cves <image>

2. Trivy (by Aqua Security)

เครื่องมือ Open-source ยอดนิยมอันดับ 1 สำหรับ CI/CD ใช้งานง่าย สแกนได้ทั้ง OS packages และไลบรารีภาษาต่างๆ (npm, pip, requirements.txt)

ใช้งานผ่าน CLI:
$ trivy image <image>

Step 2: เตรียม Image ที่มีช่องโหว่เพื่อการทดสอบ

เพื่อให้เห็นภาพชัดเจน เราจะจงใจดาวน์โหลด Base Image เวอร์ชันเก่าที่ตกรุ่นไปแล้ว ซึ่งมักจะเต็มไปด้วยช่องโหว่

# 1. Pull Nginx เวอร์ชัน 1.14 (เก่าหลายปีแล้ว)

$ docker pull nginx:1.14

1.14: Pulling from library/nginx

Digest: sha256:485b610fefec7ff6c463ffcd3edef...


# 2. ตรวจสอบว่า Image ถูกโหลดมาเรียบร้อย

$ docker images | grep nginx

nginx 1.14 ... 109MB

Step 3: สแกนด้วย Docker Scout

วิธีที่ 1: ผ่าน GUI ของ Docker Desktop

  1. เปิดโปรแกรม Docker Desktop ไปที่เมนู Images ทางซ้ายมือ
  2. ค้นหาภาพ nginx:1.14
  3. สังเกตคอลัมน์ "Vulnerabilities" ระบบอาจกำลังสแกน หรือให้คลิกเข้าไปดูรายละเอียด
  4. คุณจะเห็นกราฟและรายการแพ็กเกจที่มีช่องโหว่แบ่งตามสี (Critical, High, Medium)

วิธีที่ 2: ผ่าน Command Line

$ docker scout cves nginx:1.14

... Analyzing image...

✗ CRITICAL: 15

✗ HIGH: 48

✗ MEDIUM: 70

What's Next? View base image update recommendations with:

docker scout recommendations nginx:1.14

Step 4: สแกนด้วย Trivy

หากคุณไม่ได้ติดตั้ง Trivy ไว้ในเครื่อง สามารถใช้ Docker มารันตัว Trivy Container เพื่อสแกน Image ในเครื่องเราได้เลย!

# รัน Trivy ผ่าน Docker โดยทำการ Mount docker.sock เพื่อให้ Trivy มองเห็น Image ในเครื่องเรา

$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image nginx:1.14


2026-04-09T10:00:00Z INFO Need to update DB

2026-04-09T10:00:05Z INFO Vulnerability scanning...

nginx:1.14 (debian 9.8)

=========================

Total: 250 (UNKNOWN: 0, LOW: 90, MEDIUM: 100, HIGH: 45, CRITICAL: 15)


LIBRARYVULNERABILITY IDSEVERITYINSTALLEDFIXED IN
aptCVE-2020-3810HIGH1.4.91.4.10
opensslCVE-2021-3711CRITICAL1.1.0j1.1.1l

Step 5: วิเคราะห์ผลลัพธ์ (Analysis)

การอ่านรายงาน CVE (Common Vulnerabilities and Exposures)

  • VULNERABILITY ID: รหัสสากลของช่องโหว่ สามารถนำไปค้นหาใน Google เพื่อดูว่าแฮกเกอร์โจมตีผ่านมันได้อย่างไร
  • SEVERITY: ระดับความรุนแรง (Critical, High, Medium, Low) ทีม DevSecOps มักตั้งกฎว่า "ห้าม Deploy หากมี Critical/High โผล่มา"
  • FIXED IN: นี่คือข้อมูลที่มีค่าที่สุด! มันบอกว่าเวอร์ชันไหนของแพ็กเกจที่ผู้พัฒนาได้อุดรอยรั่วนี้แล้ว
⚠️ คำถามอภิปราย: ในฐานะนักพัฒนา เราควรจะไล่ apt-get upgrade ทีละแพ็กเกจใน Dockerfile ของเราหรือไม่?
คำตอบ: ไม่ควร! วิธีที่ถูกต้องและยั่งยืนกว่าคือการ อัปเดต Base Image ให้เป็นเวอร์ชันใหม่ที่มีการ Patch แล้ว

Step 6: การอุดช่องโหว่ (Remediation)

เราจะเปลี่ยนไปใช้ Base Image ที่มีขนาดเล็กที่สุด (Minimal Base Image) และเป็นเวอร์ชันใหม่ เพื่อลดพื้นที่โจมตี

# 1. ลอง Pull image nginx รุ่น Alpine (เล็กและใหม่)

$ docker pull nginx:alpine


# 2. นำภาพใหม่ไปสแกนด้วย Trivy

$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image nginx:alpine


nginx:alpine (alpine 3.18)

=========================

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

🎉 สังเกตว่า Vulnerabilities กลายเป็น 0 ทันที เพียงแค่เราเปลี่ยน Base Image!

อภิปรายสรุป: Best Practices ด้านความปลอดภัยของ Container

1. ใช้ Minimal Base Images

หลีกเลี่ยง Image ที่พ่วง OS เต็มรูปแบบ (เช่น Ubuntu เต็ม) เปลี่ยนไปใช้ Alpine หรือ Distroless เพื่อลดของที่ไม่จำเป็นทิ้ง (ลด Attack Surface)

2. Least Privilege (Rootless)

ห้ามรันคอนเทนเนอร์ด้วยสิทธิ์ Root กำหนด USER 1000 หรือ USER node ไว้เสมอ เพื่อป้องกัน Container Breakout

3. สแกนอัตโนมัติใน CI/CD

ผูกคำสั่ง Trivy ไว้ใน GitHub Actions หรือ GitLab CI และสั่งให้หยุดกระบวนการ Deploy ทันที (Fail the build) หากพบช่องโหว่ Critical/High

4. Image Signing

เซ็นชื่อกำกับ Image (เช่นใช้ Cosign/Sigstore) และตรวจสอบ Signature ก่อนรันใน Production ป้องกัน Supply Chain Attack

🎖️

Lab Complete! การส่งงาน

สิ่งที่ต้องส่ง (Submission):

  • ภาพที่ 1: ผลสแกน Image ที่มีช่องโหว่

    ภาพ Terminal ที่รันคำสั่ง trivy หรือ docker scout กับ nginx:1.14 โดยโชว์ให้เห็นจำนวน CRITICAL และ HIGH ที่พบ

  • ภาพที่ 2: ผลสแกนหลังจากการ Remediation

    ภาพ Terminal ที่รันสแกนกับ nginx:alpine ซึ่งแสดงผลลัพธ์ว่าปราศจากช่องโหว่ (Total: 0)

  • รายงานสรุป (1 ย่อหน้า):

    สรุปด้วยภาษาของคุณเองว่า "ทำไมการเปลี่ยน Base Image ถึงเป็นวิธีแก้ปัญหาช่องโหว่ที่ดีกว่าการพยายามรัน apt-get update ภายใน Container"

อย่าลืมลบ Image ที่ไม่ได้ใช้ทิ้งด้วย docker rmi nginx:1.14 เพื่อประหยัดพื้นที่ดิสก์!