容器安全雖然是乙個很寬泛的問題,但其實有很多小技巧可以幫助我們降低使用的風險。編寫 dockerfile 時遵循一些規則就是乙個很好的出發點。
保密字典(secrets)的發布是乙個棘手的問題,很容易出錯。對於容器化的應用,可以通過掛載卷或者環境變數的方式顯示它們。
使用env
儲存 secrets 則是一種糟糕的做法,因為 dockerfile 通常會和應用一起發布,所以這樣就和把 secrets 硬編碼到**裡沒區別了。
容器化應用的**鏈攻擊來自於構建容器本身的分層結構。
很明顯,罪魁禍首就是所用的基礎映象。使用不可信的基礎映象會帶來很高的風險,應盡量避免。
docker 為大多數作業系統和應用提供了官方的基礎映象。使用它們,可以最大程度地降低被破壞的風險。
使用固定的版本作為基礎映象的標籤,可以保證正在構建的容器的預期性。
使用 latest 作為標籤會隱性地繼承公升級包,這種情況輕則可能會影響應用的可靠性,重則可能引入漏洞。
從網上拉取東西再在 shell 中執行是一種很糟糕的做法。不幸的是,它是乙個簡化軟體安裝的普遍解決方案。
wget | sh
**鏈攻擊的風險與此相同,歸根結底是信任問題。如果你真的需要在 bash 中執行 curl,請正確執行以下操作:
這點可能有些誇張,但原因如下:你想固定軟體依賴包的版本,但在執行apt-get upgrade
後,這些依賴包會公升級到最新版本。
進行公升級並使用 latest 作為基礎映象的標籤,會增加依賴樹的不可**性。
你要做的就是固定基礎映象的版本,僅執行apt/apk update
。
add
指令的乙個功能是構建時獲取遠端 url 的內容。
add
諷刺的是,官方文件建議使用 curl 作為替代方案。
從安全的角度來看,我給出同樣的建議:不要用add
。先獲取所需的內容,驗證好再使用copy
指令。如果非用不可,請使用安全鏈結訪問受信任的源。
容器裡的 root 使用者與宿主機相同,但受 docker 守護程序配置的限制。無論有什麼限制,如果使用者突破了容器, 他就有辦法獲取到對宿主機的完全控制權。
所以不要忽略以 root 使用者身份執行所帶來的風險。
因此,最好始終指定乙個普通使用者:
user hopefullynotroot
請注意,在 dockerfile 顯示設定使用者只是一層防護,並不能解決整個執行問題。
相反,我們可以也應該採用深度防禦的方案,並在整個堆疊中進一步降低風險:嚴格配置 docker 的守護程序或者使用無 root 使用者的容器,限制執行時的配置(可以的話,設定--privileged
引數)等。
既然不使用 root 使用者,那麼也不應該使用 sudo 命令。
即使你使用的是普通使用者,也請檢查下sudoers
檔案,確保該使用者沒有特權。
references
[1] 文章:
[2] 清單:
dockerfile最佳實踐
1 使用.dockerignore檔案 早多數情況下,最好把dockerfile放在乙個空的目錄中,然後在該目錄中新增所需要的檔案,為了提高構建的效能,可以通過新增.dockerignore來排除一些檔案 怎麼建立乙個.dockerignore檔案,可以參考該文件.dockerignore 2 避免...
Dockerfile 最佳實踐
reference intro guide to dockerfile best practices 本文涉及以下幾方面 在一次發布過程中,映象可能會經過多次重建 rebuild 最後發布 release docker 映象在構建過程中,會保留快取 cache 在重建的過程中可以降低構建時間.所以,...
Dockerfile之最佳實踐
docker 是乙個開源,輕量級的應用容器引擎,基於 golang 語言開發,用於建立 管理和編排容器。與 vmware 虛擬機器相比,docker 使用容器承載應用程式,而不使用作業系統,所以它的開銷很少,效能很高。但是 docker 對應用程式的隔離不如虛擬機器徹底,所以它並不能完全取代 vmw...