Docker服務端的防護
執行一個容器或應用程式的核心是透過 Docker 服務端。Docker 服務的執行目前需要 root 權限,因此其安全性十分關鍵。
首先,確保只有可信的使用者才可以存取 Docker 服務。Docker 允許使用者在主電腦和容器間共享的檔案夾,同時不需要限制容器的存取許可,這就容易讓容器突破資源限制。例如,惡意使用者啟動容器的時候將主電腦的根目錄/
對應到容器的 /host
目錄中,那麼容器理論上就可以對主電腦的檔案系統進行任意修改了。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系統都允許類似的資源共享,而沒法禁止使用者共享主電腦根檔案系統到虛擬機系統。
這將會造成很嚴重的安全後果。因此,當提供容器建立服務時(例如透過一個 web 伺服器),要更加注意進行參數的安全檢查,防止惡意的使用者用特定參數來建立一些破壞性的容器。
為了加強對服務端的保護,Docker 的 REST API(用戶端用來跟服務端通信)在 0.5.2 之後使用本地的 Unix 通訊端機制替代了原先繫結在 127.0.0.1 上的 TCP 通訊端,因為後者容易遭受跨站指令碼攻擊。現在使用者使用 Unix 權限檢查來加強通訊端的存取安全。
使用者仍可以利用 HTTP 提供 REST API 存取。建議使用安全機制,確保只有可信的網路或 VPN,或證書保護機制(例如受保護的 stunnel 和 ssl 認證)下的存取可以進行。此外,還可以使用 HTTPS 和證書來加強保護。
最近改進的 Linux 命名空間機制將可以實作使用非 root 使用者來執行全功能的容器。這將從根本上解決了容器和主電腦之間共享的檔案系統而引起的安全問題。
終極目標是改進 2 個重要的安全內容屬性:
- 將容器的 root 使用者對應到本地主電腦上的非 root 使用者,減輕容器和主電腦之間因權限提升而引起的安全問題;
- 允許 Docker 服務端在非 root 權限下執行,利用安全可靠的子處理序來代理執行需要特權權限的作業。這些子處理序將只允許在限定範圍內進行作業,例如僅僅負責虛擬網路設定或檔案系統管理、設定作業等。
最後,建議採用私人的伺服器來執行 Docker 和相關的管理服務(例如管理服務比如 ssh 監控和處理序監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去執行。