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