十大 Docker 優秀實踐,望君遵守?。?/h1>
本文是關于容器安全的文章,展示了 10 種強化 Docker 基礎架構并保護容器和數據免受惡意攻擊的方法。
介紹
隨著許多公司在其基礎設施中采用 Docker,威脅參與者的攻擊面也增加了。這就需要保護 Docker 基礎設施。在本文中,提到了一些可以加強 Docker 容器安全性的要點。
要充分利用本文,必須具備以下條件:
- 熟悉 Linux 命令行
- 關于容器化和 Docker 的基本概念
什么是 Docker?
Docker 是一個開源容器化平臺。它允許開發人員將應用程序打包到容器中:標準化的可執行組件將應用程序源代碼與在運行該代碼所需的操作系統 (OS) 庫和依賴項相結合。
十大優秀實踐
Docker 文檔概述了在保護 Docker 容器時要考慮的四個主要方面:
- 內核對命名空間和 cgroup 的支持
- Docker 守護進程的攻擊面
- 容器配置錯誤
- 使用 AppArmor、SELinux 等 Linux 內核安全模塊等
我們將這些分解為可以遵循的 10 大實踐來強化 Docker 環境。
1. 經常更新主機和 Docker 守護進程
容器與主機系統共享內核。在容器上下文中執行的任何內核漏洞都會直接影響主機內核。內核提權漏洞 Dirty Cow 在容器中執行時會導致對主機的 root 訪問。因此,保持主機和 Docker 引擎最新很重要。
2. 不要暴露 Docker daemon socket
Docker 客戶端和 Docker 守護程序之間發生的所有通信都通過 Docker 守護程序套接字進行,這是一個 UNIX 套接字,通常位于/var/run/docker.sock,這允許訪問 Docker API。傳統的 UNIX 文件權限用于限制對該套接字的訪問。在默認配置中,該套接字由 root 用戶擁有。如果其他人獲得了對套接字的訪問權,將擁有對主機的 root 訪問權。
- 設置權限,以便只有 root 用戶和 docker 組可以訪問 Docker 守護進程套接字
- 使用 SSH 保護 Docker 守護進程套接字
- 使用 TLS (HTTPS) 保護 Docker 守護程序套接字。這允許通過 HTTP 以安全的方式訪問 Docker
- 不要讓守護程序套接字可用于遠程連接,除非您使用 Docker 的加密 HTTPS 套接字,它支持身份驗證
- 不要使用類似的選項運行 Docker 鏡像-v /var/run/docker.sock:/var/run/docker.sock,這會在生成的容器中公開套接字。請記住,以只讀方式安裝套接字不是解決方案,只會使其更難被破壞。docker compose 文件中的一個例子是:
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
要檢查您是否已經有一個在這種配置中運行的容器:
docker inspect --format='{{.HostConfig.Binds}}' [container id]
3. 以無 root 模式運行 Docker
可以以非 root 用戶身份運行 Docker 守護程序,以防止 Docker 中的潛在漏洞。這稱為“無 root 模式”。無 root 模式不需要 root 權限安裝 Docker 與 Docker API 通信。
在無 root 模式下,Docker 守護進程和容器在用戶命名空間中運行,默認情況下沒有 root 權限。
(1) 在無 root 模式下運行 Docker
使用 sudo 權限安裝uidmap?軟件包:
apt-get install -y uidmap
從 Docker 的網站獲取安裝腳本并運行:
curl -fSsL https://get.docker.com/rootless | sh
獲取無 root 安裝腳本:
復制以開頭的最后兩行export?并將它們粘貼到~/.bashrc?文件的末尾。這樣可以確保每次打開 Bash shell 時,都會設置這兩個變量:PATH? 和DOCKER_HOST。
.bashrc
運行source ~/.bashrc以在您當前的 shell 會話中設置這些變量。
運行systemctl --user start docker以啟動 Docker 引擎。
我們可以通過運行來檢查 docker 是否正在運行docker version:
4. 容器資源配置
控制組或 cgroups 是 Linux 內核功能,在實現容器的資源分配和限制方面起著關鍵作用。他們的工作不僅是確保每個容器獲得其公平份額的資源,如內存和 CPU,而且還要確保單個容器不會因耗盡其中一個資源而導致系統崩潰。
限制資源可防止拒絕服務攻擊。以下是一些可用于限制容器資源的 CLI 標志:
- --memory=<memory size>— 最大內存量
- --restart=on-failure:<number_of_restarts> — 重啟次數
- --memory-swap <value>— 交換內存量
- --cpus=<number>— 容器可用的最大 CPU 資源
- --ulimit nofile=<number>— 文件描述符的最大數量
- --ulimit nproc=<number>— 最大進程數
默認情況下,Docker 允許容器使用主機內核允許的盡可能多的 RAM 和 CPU 資源。因此有必要設置資源約束以防止容器和主機中的安全問題。
5. 避免使用特權容器
(1) 避免使用 --privileged 標志
Docker 具有允許容器在主機上以 root 權限運行的功能。這是通過—-privileged標志完成的。以特權模式運行的容器對主機上的所有設備都具有 root 權限。
如果攻擊者要破壞特權容器,他們就有可能輕松訪問主機上的資源。篡改系統中的安全模塊(如 SELinux)也很容易。因此,不建議在開發生命周期的任何階段以特權模式運行容器。
特權容器是主要的安全風險。濫用的可能性是無窮無盡的。攻擊者可以識別主機上運行的服務來發現和利用漏洞。他們還可以利用容器錯誤配置,例如具有弱憑據或沒有身份驗證的容器。特權容器為攻擊者提供 root 訪問權限,從而導致執行惡意代碼。避免在任何環境中使用它們。
要檢查容器是否在特權模式下運行,請使用以下命令:
docker inspect --format='{{.HostConfig.Privileged}}' [container_id]
- true意味著容器是特權的
- false表示容器沒有特權
(2) 使用 no-new-privileges 選項
在創建容器時添加??no-new-privileges?
??安全選項,以禁止容器進程使用??setuid?
??或??setgid?
?二進制文件提升其權限。這可以防止容器內的進程在執行期間獲得新的權限。因此,如果有一個設置了 setuid 或 setgid 位的程序,任何試圖通過該程序獲得特權的操作都將被拒絕。
6. 將文件系統和卷設置為只讀
Docker 中一個具有安全意識的有用功能是使用只讀文件系統運行容器。這減少了攻擊向量,因為容器的文件系統不能被篡改或寫入,除非它對其文件系統文件和目錄具有明確的讀寫權限。
以下代碼將 Docker 容器設置為只讀:
docker run --read-only alpine sh -c 'echo "read only" > /tmp'
7. Drop capabilities
Linux 內核能夠將 root 用戶的權限分解為不同的單元,稱為 capabilities。幾乎所有與 Linux root 用戶相關的特殊權限都分解為單獨的 capabilities。
capsh 顯示的特權容器的capabilities
Docker 施加了某些限制,使得使用功能變得更加簡單。文件功能存儲在文件的擴展屬性中,并且在構建 Docker 鏡像時會去除擴展屬性。這意味著您通常不必過多關注容器中的文件功能。
正如我們之前提到的,記住不要運行帶有--privileged標志的容器,因為這會將所有 Linux 內核功能添加到容器中。
最安全的設置是使用--cap-drop all 刪除所有功能,然后僅添加所需的功能。例如:
docker run --cap-drop all --cap-add CHOWN alpine
8. 使用 Linux 安全模塊
考慮使用像 seccomp 或 AppArmor 這樣的安全模塊。以下是一些眾所周知的模塊:
- Seccomp:用于允許/禁止在容器中運行的系統調用
- AppArmor:使用程序配置文件來限制單個程序的功能
- SELinux:使用安全策略,這是一組規則,告訴 SELinux 什么可以訪問或不能訪問,以強制執行策略允許的訪問。
這些安全模塊可用于為進程和用戶的訪問權限提供另一個級別的安全檢查,超出標準文件級訪問控制所提供的安全檢查。
(1) seccomp
默認情況下,容器獲取默認的 seccomp 配置文件。
https://github.com/moby/moby/blob/master/profiles/seccomp/default.json
這可以用以下命令覆蓋:
docker run --rm -it --security-opt seccomp=./seccomp/profile.json hello-world
使用 Seccomp 配置文件運行容器
使用 Seccomp 配置文件,您可以選擇容器中允許哪些系統調用以及拒絕哪些系統調用,因為在生產環境中并非全部都需要。您可以從 Docker 文檔中了解有關編寫 seccomp 配置文件的更多信息。
(2) AppArmor
默認情況下,容器使用docker-default? AppArmor 模板??梢允褂?-security-opt自定義配置文件覆蓋默認設置。
為此,您必須首先將新配置文件加載到 AppArmor 中以與容器一起使用:
apparmor_parser -r -W /path/to/custom_profile
現在使用自定義配置文件運行容器
docker run --rm -it --security-opt apparmor=custom_profile hello-world
請參閱此 wiki 以了解如何創建 AppArmor 配置文件。
https://gitlab.com/apparmor/apparmor/-/wikis/QuickProfileLanguage