Gitlab-ci กล้วยๆ: มาแสกน Vulnerability ใน Container Image กัน
คนที่เขียน Dockerfile บรรทัดแรกสุดก็คือ FROM
เพื่อดึง Image มาใช้งานใช่ไหม? แล้วเราจะมั่นใจได้ยังไงว่า Image ที่เรานำมาใช้งานปลอดภัยไม่มีช่องโหว่ (Vulnerability) เกิดขึ้น
หรือตอนแรกนำมาใช้อาจจะปลอดภัย แต่นานๆ ไปมันจะปลอดภัยเหมือนเดิมไหม เราไม่รู้เลย ดังนั้นผมจะมาแนะนำเครื่องมือที่จะมาช่วยเราแสกนหาช่องโหว่กัน และเราจะนำมาใช้บน Gitlab-ci ด้วยเพื่อให้มันแสกนค้นหาช่องโหว่ทุกครั้ง เพื่อให้เราได้ตัดสินใจว่าเราจะยังคงใช้ Image ตัวเดิมอยู่หรือไม่
Grype คืออะไร
เครื่องมือที่ว่านั้นก็คือ grype ก็คือ เครื่องมือที่ไว้สแกนช่องโหว่สำหรับ Container image และ Filesystems
รองรับการแสกน OS ได้แก่
- Alpine
- Amazon Linux
- BusyBox
- CentOS
- CBL-Mariner
- Debian
- Distroless
- Oracle Linux
- Red Hat (RHEL)
- Ubuntu
รองรับการแสกน packages ของภาษาต่างๆ ได้แก่
- Ruby (Gems)
- Java (JAR, WAR, EAR, JPI, HPI)
- JavaScript (NPM, Yarn)
- Python (Egg, Wheel, Poetry, requirements.txt/setup.py files)
- Dotnet (deps.json)
- Golang (go.mod)
- PHP (Composer)
- Rust (Cargo)
ติดตั้ง Grype ยังไง?
แนะนำก็คือ
$ curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
Homebrew (OSX)
$ brew tap anchore/grype
$ brew install grype
วิธีใช้งาน Grype
$ grype <image>
Grype + Gitlab-ci
เราสามารถนำมาใช้คู่กับ gitlab-ci ได้เพื่อให้มันทำการแสกน Image ที่เราจะนำมาใช้งานทุกครั้ง
รูปแบบไฟล์ gitlab-ci.yml
จะได้แบบนี้
sbom:
stage: scan
image:
name: alpine:latest
entrypoint: [""]
variables:
DOCKERFILE_IMAGE: node:18-alpine
before_script:
- apk add --no-cache curl
- curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
script:
- grype $DOCKERFILE_IMAGE --fail-on medium
allow_failure: true
ในส่วนของ --fail-on medium
จะเป็นการบอกว่าถ้าแสกนเจอ severity ในระดับ medium ขึ้นไปให้ Error ออกมา
ตัวอย่างใน Gitlab-ci
อุ๊บ... อย่างในภาพคือ node:18-alpine
image ที่ผมใช้ประจำ....
บทสรุป
หากกำลังมองหาเครื่องมือสแกนช่องโหว่ของ Image ที่ง่ายที่สุดในตอนนี้ ผมยกให้ Grype เนื่องจากคำสั่งใช้งานง่าย และยังเป็นเครื่องมือที่มีน่าเชื่อถือได้ เพื่อเตือนให้เรารู้ว่า Image ที่เราวางแผนจะใช้งานมีช่องโหว่หรือไม่ และหากพบ จะมีความรุนแรงเพียงใด
ความปลอดภัยของ Container ทุกอย่างเริ่มต้น (แต่ไม่สิ้นสุด) จาก FROM
บรรทัดแรกสุดของ Dockerfile 😅
Thanks: https://github.com/anchore/grype