เสริมแกร่งซอฟต์แวร์ด้วย ️🛡 Trivy

Mr.J?D?L... | ODDS
odds.team
Published in
4 min readMar 4, 2024
Trivy Documentation

หัวข้อ: เล่าเรื่อยเปื่อย 😵

สวัสดีครับทุกคน 🙏🏻
ขอเล่าก่อนว่าบทความนี้ เกิดขึ้นมาได้อย่างไร เมื่อเดือนธันวาคมที่ผ่านมาผมได้รับโอกาสจาก
ODDS| ไปร่วมงาน “Kubeday Singapore 2023” ซึ่งก็ผ่านมาระยะนึง และผมพึ่งได้ใช้เครื่องมือตัวหนึ่งที่รู้จักจากงานครั้งนี้ ซึ่งพอนำมาลองใช้งาน ค่อนข้างว้าว 🤩 กับมันมาก จึงอยากมาส่งต่อให้กันทุกคนได้รู้จัก . . .

โดยเครื่องมือที่จะพูดถึงในวันนี้คือ “ Trivy open source security scanner ”

หัวข้อหลัก: Trivy คืออะไร ❓

https://landscape.cncf.io/guide#provisioning--security-compliance

เป็นเครื่องมือสแกนความปลอดภัยแบบ Open source ที่ออกแบบมาสำหรับการตรวจจับช่องโหว่และดูแลโดย Aqua Security ซึ่งเป็นบริษัทที่เชี่ยวชาญในด้านความปลอดภัยของแอปพลิเคชันและคลาวด์เนทีฟ (Cloud native) ซึ่งใช้งานง่ายและรวดเร็ว โดยมีฐานข้อมูลอ้างอิงที่เป็นมาตรฐาน เช่น NVD CIS OWASP อื่น ๆ อีกหลายแหล่งข้อมูลที่น่าเชื่อถือและเป็นเครื่องมือที่ได้รับการแนะนำผ่าน CNCF Landscape

National Vulnerability Database (NVD): เป็นฐานข้อมูลที่รวมถึงข้อมูลเกี่ยวกับภัยคุกคามความปลอดภัยประเภทต่าง ๆ ของรัฐบาลสหรัฐอเมริกา

Center for Internet Security (CIS Benchmarks): คือชุดแนวปฏิบัติที่ได้รับการยอมรับทั่วโลก ด้านการรักษาความมั่นคงความปลอดภัยทางสารสนเทศและการป้องกันด้านความปลอดภัยทางไซเบอร์

Open Web Application Security Project (OWASP): คือมาตราฐานความปลอดภัยของเว็บแอปพลิเคชัน จัดตั้งโดยองค์กรไม่แสวงหาผลกำไรที่มุ่งเน้นการปรับปรุงความปลอดภัยของซอฟต์แวร์ และเน้นทางด้านเว็บแอปพลิเคชัน โดยจะมี community จากทั่วทุกมุมโลกที่ทำงานร่วมกัน เพื่อสร้างเครื่องมือและเทคโนโลยีเพื่อช่วยในการระบุและลดช่องโหว่ด้านความปลอดภัยของเว็บแอปพลิเคชัน

ตอนนี้ทุกคนน่าจะรู้จัก Trivy เป็นเครื่องมือสแกนความปลอดภัย มีหลายคนมีคำถาม

Trivy สามารถสแกนอะไรได้บ้าง ?

  • สแกน Image ของคอนเทนเนอร์เพื่อหาช่องโหว่และการตั้งค่าที่ไม่ปลอดภัย (Container Image)
  • ตรวจสอบไฟล์และโฟลเดอร์เพื่อหาข้อมูล Secret หรือช่องโหว่ต่าง ๆ
    (Filesystem or Rootfs)
  • สแกนโค้ดที่ Local หรือที่ Remote เช่น GitHub, Gitlab เพื่อหาช่องโหว่ใน lib หรือในไฟล์กำหนดค่าต่าง ๆ ที่ไม่ปลอดภัย (Code Repository)
  • สแกนไฟล์การกำหนดค่าหรือไฟล์ .yml, .yaml, *.json, Dockerfile, Other
    เพื่อหาการตั้งค่าที่ไม่ปลอดภัยหรือไม่เหมาะสม ( Infrastructure as Code)
  • สแกนการตั้งค่าของ Kubernetes cluster เพื่อหาการตั้งค่าที่ไม่ปลอดภัยหรือไม่เหมาะสม (Kubernetes)
  • Other (AWS, Virtual Machine Image, SBOM)

Trivy แบ่งประเภทของปัญหาเป็นอะไรบ้าง ?

  • Vulnerability Scanner: ตรวจหาช่องโหว่ในซอฟต์แวร์
  • Misconfiguration Scanner: ตรวจหาการตั้งค่าที่ไม่ถูกต้อง
  • Secret Scanner: ค้นหาข้อมูลลับที่ไม่ควรเปิดเผย
  • License Scanner: ตรวจสอบใบอนุญาตซอฟต์แวร์

Trivy ใช้งานยังไง ?

คู่มือการติดตั้ง Trivy :
https://aquasecurity.github.io/trivy/v0.49/getting-started/installation/

ทดสอบหลังการติดตั้ง:

trivy --version

ผลลัพธ์:
หากพร้อมใช้งาน แสดงดังนี้รูปด้านล่าง

ปัจจุบัน Trivy version: 0.49 มี feature ที่ค่อนข้างเยอะมาก ๆ
วันนี้จะแนะนำตัวที่ใช้งานบ่อย ๆ และน่าสนใจให้กับทุกคนได้รู้จักกัน

1. Container images
สแกน image โดย image ที่จะนำมาสแกน node:20.11.1-alpine

trivy image node:20.11.1-alpine

ผลลัพธ์:
จะเห็นว่ามี 1 ช่องโหว่ ระดับ MEDIUM พร้อมบอกรายละเอียด lib ที่มีปัญหา
และ version ถูกแก้ไข ซึ่งหาก Upgrade ก็จะแก้ไขปัญหานี้

ซึ่งจริง ๆ แล้ว สามารถเพิ่ม Option เพื่อปรับใช้กับงานหลาย ๆ แบบเช่น

--ignore-unfixed: ตัวเลือกนี้ช่วยให้ Trivy ไม่แสดงช่องโหว่ที่ยังไม่มีการแก้ไข
--severity: ตัวเลือกนี้ระบุระดับของช่องโหว่ เช่น --severity CRITICAL,HIGH จะทำให้ Trivy แสดงเฉพาะช่องโหว่ที่มีระดับ HIGH และ CRITICAL
--format: ช่วยกำหนดรูปแบบของผลลัพธ์ที่จะแสดง เช่น --format json จะแสดงผลลัพธ์ออกมาเป็น json นอกจากนี้ยังสามารถแสดงผลเป็น table
--output: สามารถให้ output เขียนลง file เช่น --output result.txt ซึ่งต้องมีการกำหนด format ของ output ด้วย
--scanners: ใช้เพื่อระบุประเภทของการสแกนที่ต้องการ สามารถใช้ตัวเลือกนี้เมื่อต้องการจำกัดการวิเคราะห์เฉพาะด้าน เช่น วิเคราะห์เฉพาะด้านการตั้งค่าที่ไม่ถูกต้อง (misconfig) หรือวิเคราะห์เฉพาะด้านช่องโหว่ (vuln)

ระดับ Severity

CRITICAL: ช่องโหว่ที่มีผลกระทบรุนแรงมากต่อระบบหรือข้อมูลและอาจทำให้เกิดการโจมตีได้โดยง่าย 
HIGH: ช่องโหว่ที่มีผลกระทบรุนแรงต่อระบบหรือข้อมูล แม้จะไม่มีความรุนแรงเท่ากับช่องโหว่ระดับ CRITICAL แต่ก็ยังมีความสำคัญและควรระมัดระวัง
MEDIUM: ช่องโหว่ที่มีความรุนแรงระดับกลาง อาจมีผลกระทบต่อระบบหรือข้อมูลในบางกรณี แต่ไม่ถือว่ารุนแรงมากหรือเสี่ยงต่อการโจมตี
LOW: ช่องโหว่ที่มีผลกระทบน้อยหรือไม่มีผลกระทบต่อระบบหรือข้อมูล และไม่เสี่ยงต่อการโจมตี
UNKNOWN: สำหรับช่องโหว่ที่ไม่สามารถระบุระดับความรุนแรงได้ หรือไม่มีข้อมูลเพียงพอในการประเมินความรุนแรง

2. Code Repository
นอกจากสามารถสแกน Image ที่จะนำมาใช้แพ็คซอฟต์แวร์ของเราแล้ว ยังสามารถสแกน Package, Configuration และ Secret ต่าง ๆ ที่ดูไม่เหมาะสม ที่ source code ของเราให้อีกด้วย

Support Programming Language
https://aquasecurity.github.io/trivy/v0.49/docs/coverage/language/

trivy repo --ignore-unfixed .

ผลลัพธ์:
ส่วนที่ 1: จะเห็นว่าจะมีรายละเอียดของ lib ที่มีปัญหาเหมือนกับ Container image มี version ที่ถูกแก้ไข เพิ่มเติมคือแสดง file endpoint ที่ detect เจอปัญหาเพื่อให้เรารู้ต้องแก้ไขที่ตรงไหน

ส่วนที่ 2: จะเป็นส่วนที่เพิ่มเติ่มขี้นมา จะมีรายงานข้อมูล Secret ที่ไม่ควรเปิดเผย พร้อมแสดง file endpoint ที่ detect เจอปัญหา เพื่อให้เราไปรู้ว่าต้องแก้ไขที่ตรงไหน เหมือนกับส่วนที่ 1

3. Infrastructure as Code
หลังจากการตรวจสอบความปลอดภัยของ Image และ Source code มีการปรับปรุงมาตรฐานความปลอดภัยในทั้งสองด้านแล้ว

ในขั้นตอนถัดไป ควรจะมีการตรวจสอบเรื่องความปลอดภัยเช่นกัน ซึ่งปัจจุบันนิยม รัน Service บน Kubernetes cluster นั้นหมายความว่าควรจะมีการสแกนความปลอดภัยใน Infrastructure as Code งั้นเรามาสแกน Manifest file ที่ใช้ในการกำหนดค่าต่าง ๆ ในการ Deploy Services ของเรากัน

โดยจะสร้าง Manifest file ที่จะใช้ในการสแกนดังนี้

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: Always
ports:
- containerPort: 8080

และทำการรันคำสั่งสแกน Manifest

trivy config --severity CRITICAL,HIGH  . #สามารถเปลี่ยน . เป็น path file หรือ directory 

ผลลัพธ์:
รอบนี้มีการกำหนด Severity แสดง CRITICAL,HIGH เนื่องจากถ้าแสดงทุกระดับ
จะทำให้ดูค่อนข้างยาก และอาจจะไม่จำเป็นต้องแก้ไขทันที

จากคำแนะนำแก้ไขที่พบคือ Container nginx ใน Deployment: nginx-deployment ควรจะต้องตั้งค่า securityContext.readOnlyRootFilesystem เป็น true การตั้งค่านี้จะทำให้ root filesystem ของ container เป็นแบบอ่านอย่างเดียว (read-only), ซึ่งช่วยป้องกันไม่ให้แอปพลิเคชันภายใน Container เขียนหรือแก้ไขไฟล์ใด ๆ ใน
root system

การทำเพิ่ม Config นี้จะช่วยลดความเสี่ยงจากการถูกโจมตีที่พยายามเปลี่ยนแปลงไฟล์ระบบหรือเพิ่มไฟล์มัลแวร์ลงในระบบไฟล์ของ Container

แก้ไขปัญหานี้ในไฟล์ Deployment.yaml ควรเพิ่ม readOnlyRootFilesystem: true ภายใต้ securityContext ของ container nginx ดังนี้:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: Always
ports:
- containerPort: 80
securityContext: #แก้ไขตาม Security Scan
readOnlyRootFilesystem: true #แก้ไขตาม Security Scan

ผลลัพธ์:

ตอนนี้ไม่มีการแจ้งเตือนปัญหาก่อนหน้าและ Manifest ของเรามี Security เพิ่มขึ้น 🎉

สำหรับใครที่อ่านมาถึงตรงผมเชื่อว่าน่าจะเข้าใจ Trivy ระดับนึงแล้ว แต่ยังไม่รู้ว่าเราจะเอาใช้งานรูปแบบไหน เอาไปอยู่ส่วนไหนของ Project

4. Integration with Continuous integration (CI)
สามารถนำไปใช้งานได้หลากหลายสถานการณ์ ตัวอย่างเช่น

Pull request:

Build pipeline:

Base image scan:

ตัวอย่าง Github Action:
นำ Scan เมื่อมีการ Pull request

name: Security scan with Pull request

on:
pull_request:
branches:
- main
- master

jobs:
trivy_scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Set up Trivy
uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
input: './'
format: 'table'
exit-code: '1'
ignore-unfixed: true
severity: 'CRITICAL,HIGH'

# Add other CI steps here

นอกเหนือจากส่วนนี้ยังมี feature อื่น ๆ ที่น่าสนใจ
- Kubernetes
- Filesystem
- Report (json, table, html)

โดยทุกคนสามารดูเพิ่มเติม
👉
https://aquasecurity.github.io/trivy/v0.49/docs/

ผมมีแผนจะเขียนอีก 3 ตัว ซึ่งน่าสนใจไม่แพ้กันนั้นก็คือ

1. Kubescape (Security and Compliance)
2. Chaos Engineering
3. Observability
ซึ่งผมเห็น Blog ที่น่าสนใจ ที่จะอธิบายเรื่องนี้ให้เข้าใจเกี่ยวกับเรื่องนี้ได้เป็นอย่างดี สามารถไปอ่านที่นี้ได้เลยครับ
👉
Observability หน่วยสอดแนมที่จะช่วยชีวิต Devให้ไม่ต้องขอบตาดำ

สุดท้ายและท้ายสุด
ขอขอบคุณพี่ ๆ น้อง ๆ และทุกคนที่คอยสนับสนุนเสมอมา และขอบคุณ ODDS| ที่มอบโอกาสนี้ให้ครับ

งาน Kubeday Singapore 2023 Speakers ชื่อ Prerit Munjal พูดในหัวข้อ
“ Expanding Your Kubernetes Arsenal: Essential Tools and Utilities” แนะนำเกี่ยวเครื่องมือสำคัญ ที่นำมาใช้ร่วมกับ Kubernetes และเป็นเครื่องมือที่นิยมใช้ในการพัฒนา software ซึ่งนอกเหนือจากเครื่องมือข้างต้น ที่พูดมายังมีอีกหลายตัวที่น่าสนใจ สามารถไปดูได้ที่นี้เลยครับ
👉
Essential Tools and Utilities

Speaker: Prerit Munjal — KubeDay Singapore

--

--