?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
Linux名稱(chēng)空間為正在運(yùn)行的進(jìn)程提供了隔離,限制了它們對(duì)系統(tǒng)資源的訪問(wèn),而不需要運(yùn)行進(jìn)程意識(shí)到這些限制。有關(guān)linux命名空間的更多信息,請(qǐng)參見(jiàn)Linux命名空間;
防止容器內(nèi)權(quán)限升級(jí)攻擊的最佳方法是將容器的應(yīng)用程序配置為以非特權(quán)用戶(hù)的身份運(yùn)行。對(duì)于進(jìn)程必須以root
容器中的用戶(hù),您可以在Docker主機(jī)上將該用戶(hù)重新映射到特權(quán)較低的用戶(hù)。映射的用戶(hù)被分配了一個(gè)UID范圍,這些UID在命名空間中作為普通UID在0到65536之間運(yùn)行,但是在主機(jī)本身上沒(méi)有特權(quán)。
重映射本身由兩個(gè)文件處理:/etc/subuid
和/etc/subgid
每個(gè)文件的工作方式相同,但一個(gè)文件涉及用戶(hù)ID范圍,另一個(gè)文件涉及組ID范圍。中的下列條目/etc/subuid
*
testuser:231072:65536
這意味著testuser
的從屬用戶(hù)ID范圍為230172
接下來(lái)的65536個(gè)整數(shù)按順序排列。UID231072
映射到容器內(nèi)的命名空間%28中,在本例中%29映射為UID。0
%28root
29%。UID231073
映射為1
等等。如果某個(gè)進(jìn)程試圖在命名空間之外提升權(quán)限,則該進(jìn)程在主機(jī)上作為一個(gè)非特權(quán)的高數(shù)字uid運(yùn)行,它甚至不映射到真正的用戶(hù)。這意味著進(jìn)程在主機(jī)系統(tǒng)上完全沒(méi)有特權(quán)。
多重范圍 屬性中的同一用戶(hù)或組添加多個(gè)非重疊映射,從而為給定用戶(hù)或組分配多個(gè)從屬范圍。
/etc/subuid
或/etc/subgid
檔案。在這種情況下,Docker只使用六映射,這與內(nèi)核僅限制在/proc/self/uid_map
和/proc/self/gid_map
...
當(dāng)您將Docker配置為使用userns-remap
特性,您可以選擇指定現(xiàn)有用戶(hù)和/或組,也可以指定default
.如果您指定default
,用戶(hù)和組dockremap
被創(chuàng)建并用于此目的。
警告某些發(fā)行版(如rhl和CentOS 7.3)不會(huì)自動(dòng)將新組添加到
/etc/subuid
和/etc/subgid
檔案。在本例中,您負(fù)責(zé)編輯這些文件并分配不重疊的范圍。此步驟將在先決條件...
非常重要的是,范圍不能重疊,這樣進(jìn)程就不能在不同的命名空間中獲得訪問(wèn)權(quán)限。在大多數(shù)Linux發(fā)行版上,系統(tǒng)實(shí)用程序在添加或刪除用戶(hù)時(shí)為您管理范圍。
這種重新映射對(duì)容器是透明的,但是在容器需要訪問(wèn)Docker主機(jī)上的資源的情況下,例如綁定安裝到系統(tǒng)用戶(hù)無(wú)法寫(xiě)入的文件系統(tǒng)的區(qū)域時(shí),會(huì)引入一些配置復(fù)雜性。從安全的角度來(lái)看,最好避免這些情況。
從屬UID和GID范圍必須與現(xiàn)有用戶(hù)相關(guān)聯(lián),即使關(guān)聯(lián)是實(shí)現(xiàn)細(xì)節(jié)。用戶(hù)將擁有下面的命名空間存儲(chǔ)目錄。/var/lib/docker/
如果您不想使用現(xiàn)有用戶(hù),Docker可以為您創(chuàng)建一個(gè)用戶(hù)并使用它。如果要使用現(xiàn)有的用戶(hù)名或用戶(hù)ID,則必須已經(jīng)存在。通常,這意味著相關(guān)條目需要在/etc/password
和/etc/group
但是,如果您使用的是不同的身份驗(yàn)證后端,則此要求可能會(huì)有不同的轉(zhuǎn)換。
若要驗(yàn)證這一點(diǎn),請(qǐng)使用id
指揮:
$id testuser uid=1001%28 testuser%29 gid=1001%28 testuser%29組=1001%28 testuser%29
主機(jī)上處理名稱(chēng)空間重映射的方式是使用兩個(gè)文件,/etc/subuid
和/etc/subgid
這些文件通常在添加或刪除用戶(hù)或組時(shí)自動(dòng)管理,但在少數(shù)發(fā)行版(如RHEL和CentOS 7.3)上,可能需要手動(dòng)管理這些文件。
每個(gè)文件包含三個(gè)字段:用戶(hù)的用戶(hù)名或ID,后面是起始UID或GID%28,在命名空間%29中被視為UID或GID 0,以及用戶(hù)可用的UID或GID的最大值。例如,考慮到以下條目:
測(cè)試用戶(hù):231072:65536
這意味著由testuser
將由主機(jī)UID擁有。231072
%28,它看起來(lái)像UID0
在命名空間%29到296608%28231072+65536%29中。這些范圍不應(yīng)重疊,以確保命名空間進(jìn)程不能訪問(wèn)對(duì)方的命名空間。
添加用戶(hù)后,請(qǐng)檢查/etc/subuid
和/etc/subgid
若要查看用戶(hù)在每個(gè)項(xiàng)目中是否有一個(gè)條目,請(qǐng)執(zhí)行以下操作。如果不是,您需要添加它,小心避免重疊。
如果您想使用dockremap
由Docker自動(dòng)創(chuàng)建的用戶(hù),您需要檢查dockremap
這些文件中的條目后配置和重新啟動(dòng)Docker。
如果Docker主機(jī)上有任何位置需要非特權(quán)用戶(hù)寫(xiě)入,則相應(yīng)地調(diào)整這些位置的權(quán)限。如果要使用dockremap
由Docker自動(dòng)創(chuàng)建的用戶(hù),但在配置和重新啟動(dòng)Docker之前,您將無(wú)法修改權(quán)限。
使能userns-remap
將有效地屏蔽現(xiàn)有圖像和容器層,以及內(nèi)部的其他Docker對(duì)象。/var/lib/docker/
這是因?yàn)镈ocker需要調(diào)整這些資源的所有權(quán),并將它們實(shí)際存儲(chǔ)在/var/lib/docker/
最好是在新的Docker安裝上啟用此功能,而不是在現(xiàn)有的安裝上啟用此功能。
如果您禁用userns-remap
您將不會(huì)看到在啟用時(shí)創(chuàng)建的任何資源。
檢查局限性在用戶(hù)名稱(chēng)空間上,以確保您的用例是可能的。啟用userns-在守護(hù)進(jìn)程上重新映射你可以開(kāi)始dockerd
帶著--userns-remap
標(biāo)記或按照此過(guò)程使用daemon.json
配置文件。大daemon.json
推薦方法。如果使用此標(biāo)志,請(qǐng)使用以下命令作為模型:$ dockerd --userns-remap="testuser:testuser"
編輯/etc/docker/daemon.json
假設(shè)文件以前是空的,下面的條目將啟用userns-remap
使用用戶(hù)和組調(diào)用testuser
.您可以按ID或名稱(chēng)對(duì)用戶(hù)和組進(jìn)行尋址。如果組名或ID與用戶(hù)名或ID不同,則只需要指定它。如果同時(shí)提供用戶(hù)名和組名或ID,請(qǐng)用冒號(hào)%28分隔它們:
%29字符。假設(shè)UID和GID為testuser
是1001
*
- `testuser`- `testuser:testuser`- `1001`- `1001:1001`- `testuser:1001`- `1001:testuser`
{“userns-remap”:“testuser”}
注*使用dockremap
用戶(hù)和讓Docker為您創(chuàng)建它,將值設(shè)置為default
而不是testuser
...
保存文件并重新啟動(dòng)Docker。
如果您使用的是dockremap
用戶(hù),驗(yàn)證Docker使用id
命令。
$id dockremap uid=112%28 dockremap%29 gid=116%28 dockremap%29組=116%28 dockremap%29
驗(yàn)證條目是否已添加到/etc/subuid
和/etc/subgid
*
$grep dockremap/etc/subuid dockremap:296608:65536$grep dockremap/etc/subgid dockremap:296608:65536
如果這些條目不存在,請(qǐng)將文件編輯為root
用戶(hù)并分配一個(gè)起始UID和GID,這是分配最多的UID加上偏移量%28在本例中,65536
29%。小心不要讓范圍內(nèi)有任何重疊。
控件驗(yàn)證以前的圖像不可用。docker image ls
命令。輸出應(yīng)該是空的。
從hello-world
圖像。
$docker運(yùn)行Hello-world
驗(yàn)證名稱(chēng)空間目錄是否存在于/var/lib/docker/
命名為名稱(chēng)空間用戶(hù)的UID和GID,由該UID和GID擁有,而不是組或世界可讀的。一些子目錄仍然屬于root
并擁有不同的權(quán)限。
$sudo ls-ld/var/lib/docker/231072.231072/drwx。11 231072 231072 11 6月21日上午21:19/var/lib/docker/231072.231072/$sudo ls-l/var/lib/docker/231072.231072/共計(jì)14 drwx。5 231072 231072 5 6月21日6月21日上午21:19。3 231072 231072 3 6月21日上午21:21集裝箱。3根根3 6月21日21:19圖像drwxr-x-3根根3 6月21日21:19網(wǎng)絡(luò)drwx。4根根4 6月21日21:19插件drwx。2根根2,6月21日上午21:19。2 231072 231072 2 6月21日上午21:21。2根根2 6月21日21:19信任drwx。2 231072 231072 3 6月21日21:19卷
您的目錄清單可能有一些不同,特別是如果您使用的容器存儲(chǔ)驅(qū)動(dòng)程序與aufs
...
由重新映射的用戶(hù)擁有的目錄將被使用,而不是直接位于下面的相同目錄。/var/lib/docker/
和未使用的版本%28,如/var/lib/docker/tmp/
在這里的示例中,%29可以刪除。碼頭工人不會(huì)在userns-remap
已經(jīng)啟用。
如果在守護(hù)進(jìn)程上啟用用戶(hù)名稱(chēng)空間,默認(rèn)情況下,所有容器都是以啟用的用戶(hù)命名空間啟動(dòng)的。在某些情況下,例如特權(quán)容器,您可能需要禁用特定容器的用戶(hù)命名空間。見(jiàn)用戶(hù)命名空間已知限制其中一些限制。
若要禁用特定容器的用戶(hù)命名空間,請(qǐng)?zhí)砑?code>--userns=host標(biāo)志到docker create
,,,docker run
,或docker exec
命令。
以下標(biāo)準(zhǔn)Docker功能與啟用用戶(hù)命名空間的Docker守護(hù)進(jìn)程不兼容:
與主機(jī)%28共享PID或網(wǎng)絡(luò)命名空間--pid=host
或--network=host
29%。
阿--read-only
容器文件系統(tǒng)。這是Linux內(nèi)核的限制,禁止在用戶(hù)命名空間內(nèi)重新安裝帶有修改標(biāo)志的已安裝的文件系統(tǒng)。
外部%28卷或存儲(chǔ)%29驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序不知道或無(wú)法使用守護(hù)進(jìn)程用戶(hù)映射。
使用--privileged
模式標(biāo)志打開(kāi)docker run
也沒(méi)有指定--userns=host
...
用戶(hù)名稱(chēng)空間是一種高級(jí)特性,需要與其他功能進(jìn)行協(xié)調(diào)。例如,如果從主機(jī)掛載卷,則必須預(yù)先安排文件所有權(quán),需要對(duì)卷內(nèi)容進(jìn)行讀或?qū)懺L問(wèn)。
雖然用戶(hù)命名空間容器進(jìn)程中的根用戶(hù)擁有容器內(nèi)超級(jí)用戶(hù)的許多預(yù)期權(quán)限,但Linux內(nèi)核基于內(nèi)部知識(shí)施加限制,即這是一個(gè)用戶(hù)命名空間進(jìn)程。一個(gè)值得注意的限制是無(wú)法使用mknod
命令。對(duì)象運(yùn)行時(shí),將拒絕在容器內(nèi)創(chuàng)建設(shè)備的權(quán)限。root
用戶(hù)。
保安,,,命名空間
? 2017 Docker, Inc.
根據(jù)ApacheLicense,版本2.0獲得許可。
Docker和Docker標(biāo)志是Docker公司在美國(guó)和/或其他國(guó)家的商標(biāo)或注冊(cè)商標(biāo)。
Docker,Inc.和其他各方也可以在這里使用的其他術(shù)語(yǔ)中擁有商標(biāo)權(quán)。