Docker容器中用戶權(quán)限管理
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
作者 | 周知非
來源 | urlify.cn/ve6bAv
在Linux系統(tǒng)中有一部分知識(shí)非常重要,就是關(guān)于權(quán)限的管理控制;Linux系統(tǒng)的權(quán)限管理是由uid和gid負(fù)責(zé),Linux系統(tǒng)會(huì)檢查創(chuàng)建進(jìn)程的uid和gid,以確定它是否有足夠的權(quán)限修改文件,而非是通過用戶名和用戶組來確認(rèn)。同樣,在docker容器中主機(jī)上運(yùn)行的所有容器共享同一個(gè)內(nèi)核也可以理解為共享權(quán)限管理方式。
Docker容器的權(quán)限管理方式分為了三種情況:
1.默認(rèn)使用的root權(quán)限
不管是以root用戶還是以普通用戶(有啟動(dòng)docker容器的權(quán)限)啟動(dòng)docker容器,容器進(jìn)程和容器內(nèi)的用戶權(quán)限都是root!
新建了sleep用戶,以sleep用戶權(quán)限啟動(dòng)容器并在有root權(quán)限的磁盤進(jìn)行權(quán)限測(cè)試。
docker run -v /data/sleep:/sleep -d --name sleep-1 ubuntu sleep infinity在宿主機(jī)中/data/sleep路徑新建了leo_zhou文件并在文件寫入“docker”,然后進(jìn)入sleep-1容器
docker exec -it sleep-1 bash
依然可以正常操作擁有root權(quán)限的文件。
2.限制Docker容器啟動(dòng)的用戶
新增--user參數(shù),使容器啟動(dòng)用戶變成指定的sleep用戶,發(fā)現(xiàn)并不能操作擁有root權(quán)限的文件了。會(huì)發(fā)現(xiàn)容器中的uid號(hào)和實(shí)際主機(jī)中的uid號(hào)一樣,也驗(yàn)證了docker容器使用宿主機(jī)的內(nèi)核??梢砸欢ǔ潭冗M(jìn)行權(quán)限管理。
3.使用namespace隔離技術(shù)
namespace是一種隔離技術(shù),docker就是使用隔離技術(shù)開啟特定的namespace創(chuàng)建出一些特殊的進(jìn)程,不過使用namespace是有條件的。系統(tǒng)會(huì)創(chuàng)建dockremap,通過/etc/subuid和/etc/subuid對(duì)應(yīng)的id值,映射到容器中去;實(shí)際情況還是使用的是dockremap普通權(quán)限,達(dá)到自動(dòng)隔離的效果。
①開啟Centos內(nèi)核中關(guān)閉的user namespace的功能。
grubby --args="namespace.unpriv_enable=1 user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
echo "user.max_user_namespaces=15076" >> /etc/sysctl.conf②修改/etc/docker/daemon.json配置,新增"userns-remap": "default"選項(xiàng),default默認(rèn)就是docker自動(dòng)創(chuàng)建的用戶dockremap,然后重啟docker。
修改此項(xiàng)配置需要慎重,如果是已經(jīng)部署了一套docker環(huán)境,啟用此選項(xiàng)后,會(huì)切換到隔離環(huán)境,以前的docker容器將無法使用!
③Centos需要手動(dòng)輸入id值映射范圍
最后systemctl restart docker后再次測(cè)試效果,發(fā)現(xiàn)文件權(quán)限已經(jīng)變成nobody,但docker容器內(nèi)部依然是以"root"的權(quán)限管理,但實(shí)際只有普通用戶的權(quán)限,從而達(dá)到權(quán)限隔離的效果。




