Docker安全

1) 容器內核

Docker 容器中沒有沒有包含內核,Docker 容器共享宿主機內核,一旦宿主內核存在可以橫向越權或者提權漏洞,那麼儘管Docker使用普通用戶執行,一旦容器被入侵,攻擊者還是可以利用內核漏洞逃逸到宿主,做更多事情。

 

2) 容器用戶

容器和宿主機共享一個內核,且內核控制的 uid 和 gid 只有一套。所以同一個 uid 在宿主機和容器中代表的是同一個用戶(即便在不同的地方顯示了不同的用戶名),它的權限和宿主機上用戶的權限是一樣的。

容器中默認使用 root 用戶,容器內的 root 用戶和宿主機上的 root 用戶是同一個。所以比較安全的做法是爲容器中的進程指定一個具有合適權限的用戶,而不要使用默認的 root 用戶。我們可以通過 Dockerfile 中的 USER 命令或者是  docker run 命令的 --user 參數指定容器中進程的用戶身份。

當然還有更好的方案,就是應用 Linux 的 user namespace 技術隔離用戶。方法可參考:https://docs.docker.com/engine/security/userns-remap/

 

3) 鏡像源

Docker提供了docker hub可以讓用戶上傳創建的鏡像,以便其他用戶下載,快速搭建環境。但同時也帶來了一些安全問題。下載的鏡像被惡意植入後門,傳輸的過程中鏡像被篡改, 鏡像所搭建的環境是否本身就包含漏洞等等。

Docker Content Trust

Docker 1.8中引入了 Content Trust。這是 Docker 允許發佈者對其內容進行簽名,從而實現可信分發的機制。當用戶從存儲庫中提取鏡像時,用戶將收到一個證書,其中包含發佈者的公鑰,從而允許用戶驗證鏡像來自發布者。

當啓用Content Trust,Docker Engine 將只對已簽名的鏡像進行操作,並拒絕運行簽名或摘要不匹配的鏡像。

$ export DOCKER_CONTENT_TRUST=1

Content Trust 目前已在Docker 官方Hub上啓用, 如果需求在本地Registry上使用 Content trust,需要部署Notray,具體可參考:https://github.com/theupdateframework/notary

 

4) 容器間局域網

同一主機上的容器之間可以構成局域網,因此針對局域網的ARP欺騙,嗅探,廣播風暴等攻擊方式便可以用上。所以在一個主機上部署多個容器需要合理的配置網絡,可以通過以下方式實現:

  1. 關閉容器間通信(inter-container communication),這可以防止被入侵的容器能夠連接其他容器,但是任何顯式鏈接的容器仍然能夠通信。設置守護進程使用--icc=false,並根據需要在docker run時指定-link,或通過 --export=port暴露容器的一個端口。
  2. 使用Iptables規則來控制容器之間的通信。

$ cat /etc/default/docker | grep DOCKER_OPTS=

DOCKER_OPTS="--iptables=true --icc=false"

 

5) 容器DDoS攻擊

Docker容器也會遭受DDoS攻擊,導致宿主機資源耗盡從而影響到同一宿主機的其它容器。限制單一容器資源即可避免此類問題。

限制內存

docker run 命令 -m 和 -memory-swap 參數可以限制內存和swap大小。

限制CPU

可以通過設置 --cpu-period 和 --cpu-quota參數,使用CFS (Completely Fair Scheduler) 限制單個容器CPU使用。

設置容器ulimits

還可以通過設置 --ulimit 來限制容器可使用的資源,方法可參考:https://docs.docker.com/engine/reference/commandline/run/#set-ulimits-in-container---ulimit

 

6) 容器能力(Capabilities)限制

默認情況下,Docker 容器使用宿主機 kernel 提供的 capabilities 子集運行,Docker默認的能力包括:chown、dac_override、fowner、kill、setgid、setuid、setpcap、net_bind_service、net_raw、sys_chroot、mknod、setfcap、和audit_write。在啓動容器時,可以通過 --cap-add 或 --cap-drop 進行控制。例如:

$ docker run --cap-drop setuid --cap-drop setgid -ti <container_name> /bin/sh

 

7) 容器隔離

通過宿主機分割容器,將不同安全級別的容器放在不同的宿主機中,如果發生容器逃逸,攻擊者仍然處於分割的宿主機無法輕鬆訪問屬於其他用戶的容器或數據。例如,處理敏感數據的容器或數據庫容器應該與直接向終端用戶的前端應用程序的容器分割開,放在不同的宿主機。

 

8) 容器基線掃描

Docker Bench for Security是一個腳本,用於檢查在生產環境中部署Docker容器的幾十個常見的最佳實踐,測試都是自動化的,基於 CIS Docker 1.13 標準。項目地址:https://github.com/docker/docker-bench-security

使用方法:

git clone https://github.com/docker/docker-bench-security.git

cd docker-bench-security

sudo sh docker-bench-security.sh

 

9) 容器漏洞掃描

Clair是一個用於靜態分析應用程序容器中的漏洞的開源項目。Clair首先對鏡像進行特徵的提取,然後再將這些特徵匹配CVE漏洞庫,若發現漏洞則進行提示,其功能側重於掃描容器中的 OS 及 APP 的CVE 漏洞。Clair鏡像分析是按鏡像Layer層級來進行的,如果某一層的軟件有漏洞,在上層被刪除了,該漏洞還是存在的。

VMware開源的Docker鏡像倉庫Harbor v1.2以後集成了Clair,但不是默認安裝的,安裝Harbor時需指定Clair 模塊。

./install.sh --with-clair

安裝方法可參見:https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md#installation-with-clair

安裝完成後,就可以對Harbor中的鏡像進行漏洞掃描。使用方法可參見:https://github.com/goharbor/harbor/blob/master/docs/user_guide.md#vulnerability-scanning-via-clair

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章