前言
前面我們已經守住了程式碼、依賴、基礎架構 (IaC)、還有金鑰 Secrets。
但還有一個大家常忽略的角落:容器鏡像 (Docker image)。
很多人覺得「程式打包成 Docker 就安全了」,甚至覺得 image 是一個密不透風的黑盒子。
事實上,容器就像是一個透明玻璃罐,你丟什麼進去都會被完整保存──包含老舊的系統函式庫、過期的套件、甚至已知的漏洞。
這時候,我們需要一雙能透視的眼睛,看看裡面藏了什麼。
這就是 Trivy 的用途:一個開源的容器安全掃描工具,能幫你快速掃出 image 裡的漏洞與風險。
1. 為什麼要檢查容器鏡像?
容器的好處是「一次打包,到處運行」,但壞處是:你打包什麼,漏洞就會跟著什麼。
常見的三種風險:
-
OS 層漏洞
- 許多官方 base image (例如 python:3.9, node:14) 裡,往往帶著舊版 Debian/Ubuntu。
- 這些作業系統層的套件可能存在已知 CVE,卻隨著 image 一起被部署到生產環境。
-
套件層漏洞
- 除了作業系統,容器裡還會安裝大量應用套件(pip、npm、apt)。
- 如果你沒更新,等於把已知弱點「密封」在鏡像裡。
-
供應鏈風險
- 很多人直接用 Docker Hub 上的 public image。
- 問題是,你無法保證這些 image 裡的內容是否安全,甚至可能混入惡意程式。
比喻來說,容器就像二手零食大禮包,看起來方便又便宜,但裡面可能混著過期食品或不明來源的東西。
你總不會不檢查就直接吃吧?
2. 基本用法
Trivy 是目前最常用的容器安全掃描工具之一,由 Aqua Security 開源維護。它的特點是:
-
輕量:單一二進位檔即可使用,不需要額外伺服器。
-
全方位掃描:不只 image,還能掃檔案系統、Git repo、Kubernetes YAML。
-
即時更新:漏洞資料庫每天同步更新,覆蓋 CVE 與供應鏈風險。
典型的工作流程很簡單:
- 選擇一個容器 image(例如 python:3.9 或 node:14)。
- Trivy 掃描並輸出漏洞清單,分級為 LOW / MEDIUM / HIGH / CRITICAL。
- 若有修補版本,會同時列出「目前版本」與「可更新版本」。
最重要的是,Trivy 能讓開發者直觀看到「基底 image 本身就不乾淨」。
這提醒我們:安全不能光看應用程式,還要檢查應用承載的基礎環境。
3. 自製 Dockerfile 的潛在風險
容器鏡像通常是從一個 base image(如 python:3.9、node:14)開始,再疊加安裝需求,例如:
- apt-get install ... 安裝系統套件
- pip install -r requirements.txt 安裝 Python 套件
- npm install 安裝前端套件
這些步驟每一層都可能引入漏洞:
-
Base image 本身
- 官方提供的 image 不是「乾淨」的代名詞,裡面常有舊版 libc、OpenSSL、bash 等系統函式庫。
- 這些漏洞會直接跟著 Dockerfile 打包進去。
-
應用層套件
- 透過 pip、npm 安裝的依賴,若不鎖定版本或未更新,漏洞會在鏡像裡永久存在。
- 特別是 requirements.txt / package-lock.json 沒更新時。
-
開發者自加的指令
- 有時候工程師圖快,會在 Dockerfile 裡安裝 debug 工具或多餘服務(例如 curl、vim、甚至 openssh-server)。
-
這些「方便工具」可能成為潛在攻擊面。
因此,掃描 Dockerfile 所生成的 image,不只是檢查應用程式,而是審視整個供應鏈。
你寫下的每一行指令,最後都會轉化成「能被攻擊的表面積 (attack surface)」。
4. 在 CI/CD 裡自動化
容器掃描如果只靠「開發者本地偶爾跑一下」,最後一定會被遺忘。
真正能發揮價值的地方,是把它納入 CI/CD pipeline。
在流程裡加上 Trivy,有幾個關鍵意義:
-
強制性檢查
- 每一次 Pull Request 都要經過掃描。
- 如果 image 裡有高風險漏洞,PR 直接掛紅燈,不允許合併。
- 安全變成規則,而不是「記性」。
-
即時回饋
- 開發者能在提交程式碼時立刻收到結果,而不是到上線後才發現。
-
修復成本越早越低,這就是「Shift Left」的實踐。
-
透明性與審計
- CI/CD 平台會自動紀錄掃描結果,能回顧每一次部署時的風險狀態。
- 在合規要求(金融、醫療)裡尤其重要。
比喻來說,把 Trivy 放進 CI/CD,就像遊戲副本入口的安檢門:
玩家能不能進去,不是看他想不想,而是系統會掃裝備,紅色警告就直接擋住。
結論
容器不是黑盒子,而是把作業系統、套件、工具全都打包在一起的透明罐子。
你放什麼進去,它就完整保存什麼──包括漏洞。
Trivy 的價值,就是在部署之前幫你照一張 X 光片,讓隱藏的風險無所遁形。
當這個流程被納入 CI/CD,它就不再仰賴開發者的記性,而成為規則的一部分。
就像討伐巨人前一定要檢查立體機動裝置,
上線前沒掃過容器鏡像,就等於背著壞掉的裝備衝向巨人──結果可想而知。
這不是額外的保險,而是最基本的生存條件。
因為少掃一次,就可能讓一個老舊 OpenSSL,變成打穿整個世界線的破口。