真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么隔離docker容器中的用戶

這篇文章主要介紹“怎么隔離docker容器中的用戶”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么隔離docker容器中的用戶”文章能幫助大家解決問題。

創(chuàng)新互聯(lián)于2013年成立,先為修武等服務(wù)建站,修武等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為修武企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

了解 linux user namespace

linux user namespace 為正在運行的進程提供安全相關(guān)的隔離(其中包括 uid 和 gid),限制它們對系統(tǒng)資源的訪問,而這些進程卻感覺不到這些限制的存在。關(guān)于 linux user namespace 的介紹請參考筆者的《linux namespace : user》一文。

對于容器而言,阻止權(quán)限提升攻擊(privilege-escalation attacks)的最好方法就是使用普通用戶權(quán)限運行容器的應(yīng)用程序。
然而有些應(yīng)用必須在容器中以 root 用戶來運行,這就是我們使用 user namespace 的最佳場景。我們通過 user namespace 技術(shù),把宿主機中的一個普通用戶(只有普通權(quán)限的用戶)映射到容器中的 root 用戶。在容器中,該用戶在自己的 user namespace 中認為自己就是 root,也具有 root 的各種權(quán)限,但是對于宿主機上的資源,它只有很有限的訪問權(quán)限(普通用戶)。

user namespace 的用戶映射

在配置 docker daemon 啟用 user namespace 前,我需要先來了解一些關(guān)于從屬(subordinate)用戶/組和映射(remapping)的概念。從屬用戶和組的映射由兩個配置文件來控制,分別是 /etc/subuid 和 /etc/subgid。看下它們的默認內(nèi)容:在配置 docker daemon 啟用 user namespace 前,我需要先來了解一些關(guān)于從屬(subordinate)用戶/組和映射(remapping)的概念:

怎么隔離docker容器中的用戶

對于 subuid,這一行記錄的含義為:

用戶 nick,在當(dāng)前的 user namespace 中具有 65536 個從屬用戶,用戶 id 為 100000-165535,在一個子 user namespace 中,這些從屬用戶被映射成 id 為 0-65535 的用戶。subgid 的含義和 subuid 相同。

比如說用戶 nick 在宿主機上只是一個具有普通權(quán)限的用戶。我們可以把他的一個從屬 id(比如 100000 )分配給容器所屬的 user namespace,并把 id 100000 映射到該 user namespace 中的 uid 0。此時即便容器中的進程具有 root 權(quán)限,但也僅僅是在容器所在的 user namespace 中,一旦到了宿主機中,你頂多也就有 nick 用戶的權(quán)限而已。

當(dāng)開啟 docker 對 user namespace 的支持時(docker 的 userns-remap 功能),我們可以指定不同的用戶映射到容器中。比如我們專門創(chuàng)建一個用戶 dockeruser,然后手動設(shè)置其 subuid 和 subgid:

nick:100000:65536
dockeruser:165536:65536

并把它指定給 docker daemon:

{
 "userns-remap": "dockeruser"
}

請注意 subuid 的設(shè)置信息,我們?yōu)?dockeruser 設(shè)置的從屬 id 和 nick 用戶是不重疊的,實際上任何用戶的從屬 id 設(shè)置都是不能重疊的。

或者一切從簡,讓 docker 為我們包辦這些繁瑣的事情,直接把 docker daemon 的 userns-rempa 參數(shù)指定為 "default":

{
 "userns-remap": "default"
}

這時,docker 會自動完成其它的配置。

配置 docker daemon 啟用用戶隔離

這里筆者采取簡單的方式,讓 docker 創(chuàng)建默認的用戶用于 user namespace。我們需要先創(chuàng)建 /etc/docker/daemon.json 文件:

$ sudo touch /etc/docker/daemon.json

然后編輯其內(nèi)容如下(如果該文件已經(jīng)存在,僅添加下面的配置項即可),并重啟 docker 服務(wù):

{
 "userns-remap": "default"
}
$ sudo systemctl restart docker.service

下面我們來驗證幾個關(guān)于用戶隔離的幾個點。

首先驗證 docker 創(chuàng)建了一個名為 dockremap 的用戶:

怎么隔離docker容器中的用戶

然后查看 /etc/subuid 和 /etc/subgid 文件中是否添加了新用戶 dockremap 相關(guān)的項:

怎么隔離docker容器中的用戶

接下來我們發(fā)現(xiàn)在 /var/lib/docker 目錄下新建了一個目錄: 165536.165536,查看該目錄的權(quán)限:

怎么隔離docker容器中的用戶

165536 是由用戶 dockremap 映射出來的一個 uid。查看 165536.165536 目錄的內(nèi)容:

怎么隔離docker容器中的用戶

與 /var/lib/docker 目錄下的內(nèi)容基本一致,說明啟用用戶隔離后文件相關(guān)的內(nèi)容都會放在新建的 165536.165536 目錄下。

通過上面的檢查,我們可以確認 docker daemon 已經(jīng)啟用了用戶隔離的功能。

宿主機中的 uid 與容器中 uid

在 docker daemon 啟用了用戶隔離的功能后,讓我們看看宿主機中的 uid 與容器中 uid 的變化。

$ docker run -d --name sleepme ubuntu sleep infinity

怎么隔離docker容器中的用戶

uid 165536 是用戶 dockremap 的一個從屬 id,在宿主機中并沒有什么特殊權(quán)限。然而容器中的用戶卻是 root,這樣的結(jié)果看上去很完美:

怎么隔離docker容器中的用戶

新創(chuàng)建的容器會創(chuàng)建 user namespace

在 docker daemon 啟用用戶隔離的功能前,新創(chuàng)建的容器進程和宿主機上的進程在相同的 user namespace 中。也就是說 docker 并沒有為容器創(chuàng)建新的 user namespace:

怎么隔離docker容器中的用戶

上圖中的容器進程 sleep 和宿主機上的進程在相同的 user namespace 中(沒有開啟用戶隔離功能的場景)。

在 docker daemon 啟用用戶隔離的功能后,讓我們查看容器中進程的 user namespace:

怎么隔離docker容器中的用戶

上圖中的 4404 就是我們剛啟動的容器中 sleep 進程的 pid??梢钥闯觯琩ocker 為容器創(chuàng)建了新的 user namespace。在這個 user namespace 中,容器中的用戶 root 就是天神,擁有至高無上的權(quán)力!

訪問數(shù)據(jù)卷中的文件

我們可以通過訪問數(shù)據(jù)卷中的文件來證明容器中 root 用戶究竟具有什么樣的權(quán)限?創(chuàng)建四個文件,分別屬于用戶 root 、165536 和 nick。rootfile 只有 root 用戶可以讀寫,用戶 nick 具有 nickfile 的讀寫權(quán)限,uid 165536 具有文件 165536file 的讀寫權(quán)限,任何用戶都可以讀寫 testfile 文件:

怎么隔離docker容器中的用戶

下面把這幾個文件以數(shù)據(jù)卷的方式掛載到容器中,并檢查從容器中訪問它們的權(quán)限:

$ docker run -it --name test -w=/testv -v $(pwd)/testv:/testv ubuntu

怎么隔離docker容器中的用戶

容器中的 root 用戶只能訪問 165536file 和 testfile,說明這個用戶在宿主機中只有非常有限的權(quán)限。

在容器中禁用 user namespace

一旦為 docker daemon 設(shè)置了 "userns-remap" 參數(shù),所有的容器默認都會啟用用戶隔離的功能(默認創(chuàng)建一個新的 user namespace)。有些情況下我們可能需要回到?jīng)]有開啟用戶隔離的場景,這時可以通過 --userns=host 參數(shù)為單個的容器禁用用戶隔離功能。--userns=host 參數(shù)主要給下面三個命令使用:

docker container create
docker container run
docker container exec

比如執(zhí)行下的命令:

$ docker run -d --userns=host --name sleepme ubuntu sleep infinity

查看進程信息:

怎么隔離docker容器中的用戶

進程的有效用戶又成 root 了,并且也沒有為進程創(chuàng)建新的 user namespace:

怎么隔離docker容器中的用戶

已知問題

user namespace 屬于比較高級的功能,目前 docker 對它的支持還算不上完美,下面是已知的幾個和現(xiàn)有功能不兼容的問題:

  • 共享主機的 pid 或 net namespace(--pid=host or --network=host)

  • 外部的存儲、數(shù)據(jù)卷驅(qū)動可能不兼容、不支持 user namespace

  • 使用 --privileged 而不指定 --userns=host

關(guān)于“怎么隔離docker容器中的用戶”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。


當(dāng)前文章:怎么隔離docker容器中的用戶
網(wǎng)站鏈接:http://weahome.cn/article/pjehci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部