เสริมแกร่งซอฟต์แวร์ด้วย ️🛡 Trivy
หัวข้อ: เล่าเรื่อยเปื่อย 😵
สวัสดีครับทุกคน 🙏🏻
ขอเล่าก่อนว่าบทความนี้ เกิดขึ้นมาได้อย่างไร เมื่อเดือนธันวาคมที่ผ่านมาผมได้รับโอกาสจาก ODDS| ไปร่วมงาน “Kubeday Singapore 2023” ซึ่งก็ผ่านมาระยะนึง และผมพึ่งได้ใช้เครื่องมือตัวหนึ่งที่รู้จักจากงานครั้งนี้ ซึ่งพอนำมาลองใช้งาน ค่อนข้างว้าว 🤩 กับมันมาก จึงอยากมาส่งต่อให้กันทุกคนได้รู้จัก . . .
โดยเครื่องมือที่จะพูดถึงในวันนี้คือ “ Trivy open source security scanner ”
หัวข้อหลัก: Trivy คืออะไร ❓
เป็นเครื่องมือสแกนความปลอดภัยแบบ 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