
為什麼 Docker 在啟動新容器時預設使用相同的使用者和 cgroup 命名空間?
我不明白為什麼 Docker 不設定新的使用者命名空間,以便容器中的使用者命名空間與主機上的root
不一樣。root
特別是,由於其他所有內容都是命名空間的(除了 cgroup 之外),因此預設不完全隔離容器確實沒有意義。
有人可以澄清為什麼 Docker 預設不啟用使用者命名空間嗎?
主機命名空間:
parallels@debian-gnu-linux-vm:~$ ls -la /proc/self/ns
total 0
dr-x--x--x 2 parallels parallels 0 Jan 30 17:29 .
dr-xr-xr-x 9 parallels parallels 0 Jan 30 17:29 ..
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 net -> net:[4026531957]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 pid -> pid:[4026531836]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 user -> user:[4026531837]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 uts -> uts:[4026531838]
容器命名空間:
docker run -ti --rm debian:latest
root@210189a7a164:/# ls -la /proc/self/ns
total 0
dr-x--x--x 2 root root 0 Jan 30 16:30 .
dr-xr-xr-x 9 root root 0 Jan 30 16:30 ..
lrwxrwxrwx 1 root root 0 Jan 30 16:30 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 ipc -> 'ipc:[4026532287]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 mnt -> 'mnt:[4026532285]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 net -> 'net:[4026532290]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 pid -> 'pid:[4026532288]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 uts -> 'uts:[4026532286]'
主機和容器的user
和cgroup
命名空間是相同的。
答案1
至於 Docker 決定預設不啟用使用者的具體細節,你可能需要詢問 Docker,但我可以提供一個可能的理由。
Docker 的整體設計理念似乎是支援容器的使用,同時最大限度地減少對開發工作流程的干擾和複雜性。
從底層主機掛載磁碟區時,啟用使用者命名空間可能會導致檔案/目錄權限問題,因為容器中使用的 uid/gid 可能沒有掛載目錄的權限。
當然,這可以透過仔細管理這些權限來解決,但這是一種破壞。
使用者命名空間是作為一個選項提供,因此單一組織和使用者仍然可以啟用它,只需進行設定即可。
值得注意的是,Docker 還致力於啟用「無根」Docker 支持,並且現在可以作為實驗選項提供(更多詳細資訊)這裡),這將透過確保沒有容器(或守護程序本身)以 root 身份運行來解決總體問題。
答案2
這基本上是可用性和安全性之間的經典權衡。我在之後為我的開發人員桌面配置了它CVE-2019-5736據報道,該功能可以透過用戶命名空間來緩解,並在幾個月後將其關閉。這使得使用主機磁碟區變得非常困難。對於已部署的雲端原生應用程式來說,這並不是什麼大問題,但如果您將docker 用於CI 建置或系統管理工具等devops 目的,或者用於依賴大量主機檔案的遺留應用程序,那麼這就是巨大的問題。
使問題更加複雜的是,我是唯一一個遇到問題的人,如果用戶名稱空間是您建議的預設名稱空間,那麼情況當然不會是這樣,但該功能直到 docker 1.10 才可用,然後更改了默認設定對現有用戶來說破壞性太大。