在現代軟體交付中,容器幾乎已經成為主流的部署方式。
然而,Image 本身往往隱含著安全風險,可能來自基底映像檔、應用程式套件,甚至是開發過程中未清理的殘留檔案。
因此,若沒有對映像檔進行安全檢查,CI/CD 交付到生產環境的成品可能就暗藏漏洞。
1.基底映像檔漏洞
常見的 Ubuntu、Debian、Alpine 等 OS 基底映像檔,可能帶有已知漏洞。
2.應用層套件漏洞
Python、Node.js 等應用依賴套件若有安全問題,也會被一起打包進去。
3.映像檔肥大與未清理風險
沒有移除不必要的檔案、Cache,容易放大攻擊面,也讓鏡像不必要地龐大。
目前社群常用的容器安全檢查工具包含:
1.Trivy:輕量、好上手,支援多種輸出格式。
2.Grype:由 Anchore 推出,專注於漏洞掃描。
3.Clair:CoreOS 推出的漏洞檢測工具,常見於 Harbor registry 中。
其中 Trivy 最容易入門,也適合直接整合到 CI/CD Pipeline。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Trivy Scan Demo!"
FROM python:3.10-slim
# 設定工作目錄
WORKDIR /app
# 複製需求與程式
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 如果 main.py 在專案根目錄,直接複製整個專案
COPY . .
# 啟動應用
CMD ["python", "main.py"]
flask==2.3.2
requests==2.28.1
以下範例示範如何在 CI/CD 中掃描 Docker Image:
name: CI with Trivy Scan
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build-and-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
run: docker build -t my-app:latest .
- name: Run Trivy Scan
uses: aquasecurity/trivy-action@master
with:
image-ref: my-app:latest
format: table
exit-code: 0
🔹image-ref: 指定要掃描的映像檔。
🔹format: 設定輸出格式,可選 table, json, sarif。
🔹exit-code: 控制遇到漏洞時是否中斷流程(例如設成 1,就會讓 CI 失敗)。
💻展示 Trivy 掃描步驟在 CI pipeline 裡的流程位置(Run Trivy Scan step)。
👉說明:Trivy action 會在 Docker build 之後執行。
👉 說明:基底映像檔(OS 層)往往會有不少 LOW/MEDIUM 等級漏洞。
👉 說明:應用程式依賴(例如 requests, urllib3, setuptools)也會被掃描,這是 Trivy 的優勢。
Image 本身就是最終的交付物,若不進行安全檢查,就等於把不可信的黑箱丟到生產環境。
透過像 Trivy 這樣的工具,我們能在 CI/CD Pipeline 自動化地守住容器安全,確保交付物的可靠性與可信度。
👉 下一篇 Day 28|Secrets 管理進階:從 Kubernetes Secret 到加密存放