前兩天講了幾個比較重要的 Dockerfile best practice 之後,今天要來說一說怎麼用工具做弱點掃描。因為對 Dockerfile/image 做弱描的工具還滿多的,這邊就介紹已經被 Docker 加進 CLI 的 Snyk,他可以把你的環境、安裝的套件丟到他們資料庫去做搜尋,看有哪些潛在的危險
譬如說我手邊有幾個多年前用 Node.js 寫的 express server,Dockerfile 長這樣,看到開頭的 node:9.2.0
就知道真的是多年前XD,現在都已經快要 Node 16 了(是說我第一次寫 Node.js 時還在 0.12.x,當時聽過他的人還不多,只能說時間過得真快啊)
FROM node:9.2.0
COPY index.js package.json /app/
WORKDIR /app
RUN npm install && npm cache clean --force
CMD node index.js
先用 docker build . -t app
把 image 建出來後,接著就可以下 docker scan app
對他做掃描。因為我用的是古早古早以前的 node:9.2.0
,所以光 Base Image 的部分掃出來就有 1039 個漏洞,而且其中 99 是屬於 critical 等級的,嚇都嚇死
除了告訴你有多少漏洞之外,他還會把每個漏洞給列出來,並且告訴你那些漏洞分別在哪些版本修掉了,有空也可以點網址進去看那些漏洞的報告,其實都不長
譬如說我們來看看下面 SNYK-UPSTREAM-NODE-72326
這個漏洞的說明,他在 Overview 裡面就有提到在 Node 9.2.0 中,如果攻擊者在 TLS handshake 期間發送一些重複或預期外的訊息,那就會導致你的 HTTPS server 直接炸掉,因此只要有心很輕易就可以讓你的服務掛掉,所以才被歸類為 critical 等級的漏洞
而且因為攻擊者也會去看這些漏洞報告,所以像這種 critical 等級的大漏洞一但被回報出來了,而你的 server 又遲遲不更新,那下一個遭殃的可能就是你
雖然知道要更新,但我怎麼知道哪些 image 比較安全呢?這點 Snyk 也幫你做好了,就算你懶得去細看那些漏洞,也可以直接滑到最底下看他給你的建議
譬如這邊他就建議把 base image 升級到 node:16.7.0
,若是不一定要 full image ,那 node:16-bullseye-slim
也是不錯的選項,因為安裝的東西更少,所以漏洞自然也更少(Debian bullseye 是今年八月剛發佈的版本,可能比較不穩定)
所以平常沒事就可以掃一下自己的 image 有沒有什麼比較大的漏洞,可以的話直接在 CI 裡面做掃描更好,這樣就能讓自己的服務維持在一個最安全的狀態
今天介紹了怎麼用 Docker 的內建工具來做弱點掃描,這部分是很多人都會忽略的,而且服務跑了好幾年都好好的沒事也不會想去掃描XD。但安全性這種事等到出事就已經太晚了,所以建議還是每個月或每半年定期掃描一下,真的懶的話就丟 CI(反正掃描很快),然後定期上去看一下漏洞數有沒有增加就好了~
另外,關於今天的內容有什麼問題歡迎在下方留言,沒有的話鐵人賽終於到了最後幾天了,大家一起衝啊~