亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

深入理解docker容器中的uid和gid

2024-09-01 13:55:34
字體:
來源:轉載
供稿:網友

默認情況下,容器中的進程以 root 用戶權限運行,并且這個 root 用戶和宿主機中的 root 是同一個用戶。聽起來是不是很可怕,因為這就意味著一旦容器中的進程有了適當的機會,它就可以控制宿主機上的一切!本文我們將嘗試了解用戶名、組名、用戶 id(uid)和組 id(gid)如何在容器內的進程和主機系統之間映射,這對于系統的安全來說是非常重要的。說明:本文的演示環境為 ubuntu 16.04(下圖來自互聯網)。

docker容器,uid,gid

先來了解下 uid 和 gid

uid 和 gid 由 Linux 內核負責管理,并通過內核級別的系統調用來決定是否應該為某個請求授予特權。比如當進程試圖寫入文件時,內核會檢查創建進程的 uid 和 gid,以確定它是否有足夠的權限修改文件。注意,內核使用的是 uid 和 gid,而不是用戶名和組名。

簡單起見,本文中剩下的部分只拿 uid 進行舉例,系統對待 gid 的方式和 uid 基本相同。

很多同學簡單地把 docker 容器理解為輕量的虛擬機,雖然這簡化了理解容器技術的難度但是也容易帶來很多的誤解。事實上,與虛擬機技術不同:同一主機上運行的所有容器共享同一個內核(主機的內核)。容器化帶來的巨大價值在于所有這些獨立的容器(其實是進程)可以共享一個內核。這意味著即使由成百上千的容器運行在 docker 宿主機上,但內核控制的 uid 和 gid 則仍然只有一套。所以同一個 uid 在宿主機和容器中代表的是同一個用戶(即便在不同的地方顯示了不同的用戶名)。

注意,由于普通的用來顯示用戶名的 Linux 工具并不屬于內核(比如 id 等命令),所以我們可能會看到同一個 uid 在不同的容器中顯示為不同的用戶名。但是對于相同的 uid 不能有不同的特權,即使在不同的容器中也是如此。

如果你已經了解了 Linux 的 user namespace 技術,參考《Linux Namespace : User》,你需要注意的是到目前為止,docker 默認并沒有啟用 user namesapce,這也是本文討論的情況。筆者會在接下來的文章中介紹如何配置 docker 啟用 user namespace。

容器中默認使用 root 用戶

如果不做相關的設置,容器中的進程默認以 root 用戶權限啟動,下面的 demo 使用 ubuntu 鏡像運行 sleep 程序:

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

注意上面的命令中并沒有使用 sudo。筆者在宿主機中的登錄用戶是 nick,uid 為 1000:

docker容器,uid,gid

在宿主機中查看 sleep 進程的信息:

$ ps aux | grep sleep

 

docker容器,uid,gid

sleep 進程的有效用戶名稱是 root,也就是說 sleep 進程具有 root 權限。

然后進入容器內部看看,看到的情況和剛才一樣,sleep 進程也具有 root 權限:

docker容器,uid,gid

那么,容器內的 root 用戶和宿主機上的 root 用戶是同一個嗎?

答案是:是的,它們對應的是同一個 uid。原因我們在前面已經解釋過了:整個系統共享同一個內核,而內核只管理一套 uid 和 gid。

其實我們可以通過數據卷來簡單的驗證上面的結論。在宿主機上創建一個只有 root 用戶可以讀寫的文件:

docker容器,uid,gid

然后掛載到容器中:

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

在容器中可以讀寫該文件:

docker容器,uid,gid

我們可以通過 Dockerfile 中的 USER 命令或者是 docker run 命令的 --user 參數指定容器中進程的用戶身份。下面我們分別來探究這兩種情況。

在 Dockerfile 中指定用戶身份

我們可以在 Dockerfile 中添加一個用戶 appuser,并使用 USER 命令指定以該用戶的身份運行程序,Dockerfile 的內容如下:

FROM ubuntuRUN useradd -r -u 1000 -g appuserUSER appuserENTRYPOINT ["sleep", "infinity"]

編譯成名稱為 test 的鏡像:

$ docker build -t test .

docker容器,uid,gid

用 test 鏡像啟動一個容器:

$ docker run -d --name sleepme test

在宿主機中查看 sleep 進程的信息:

docker容器,uid,gid

這次顯示的有效用戶是 nick,這是因為在宿主機中,uid 為 1000 的用戶的名稱為 nick。再進入到容器中看看:

$ docker exec -it sleepme bash

docker容器,uid,gid

容器中的當前用戶就是我們設置的 appuser,如果查看容器中的 /etc/passwd 文件,你會發現 appuser 的 uid 就是 1000,這和宿主機中用戶 nick 的 uid 是一樣的。

讓我們再創建一個只有用戶 nick 可以讀寫的文件:

docker容器,uid,gid

同樣以數據卷的方式把它掛載到容器中:

$ docker run -d --name sleepme -w=/testv -v $(pwd)/testv:/testv test

docker容器,uid,gid

在容器中 testfile 的所有者居然變成了 appuser,當然 appuser 也就有權限讀寫該文件。

這里到底發生了什么?而這些又這說明了什么?

首先,宿主機系統中存在一個 uid 為 1000 的用戶 nick。其次容器中的程序是以 appuser 的身份運行的,這是由我們通過 USER appuser 命令在 Dockerfile 程序中指定的。

事實上,系統內核管理的 uid 1000 只有一個,在宿主機中它被認為是用戶 nick,而在容器中,它則被認為是用戶 appuser。
所以有一點我們需要清楚:在容器內部,用戶 appuser 能夠獲取容器外部用戶 nick 的權利和特權。在宿主機上授予用戶 nick 或 uid 1000 的特權也將授予容器內的 appuser。

從命令行參數中自定用戶身份

我們還可以通過 docker run 命令的 --user 參數指定容器中進程的用戶身份。比如執行下面的命令:

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

docker容器,uid,gid

因為我們在命令行上指令了參數 --user 1000,所以這里 sleep 進程的有效用戶顯示為 nick。進入到容器內部看一下:

$ docker exec -it sleepme bash

docker容器,uid,gid

這是個什么情況?用戶名稱居然顯示為 "I have no name!"!去查看 /etc/passwd 文件,里面果然沒有 uid 為 1000 的用戶。即便沒有用戶名稱,也絲毫不影響該用戶身份的權限,它依然可以讀寫只有 nick 用戶才能讀寫的文件,并且用戶信息也由 uid 代替了用戶名:

docker容器,uid,gid

需要注意的是,在創建容器時通過 docker run --user 指定的用戶身份會覆蓋掉 Dockerfile 中指定的值。
我們重新通過 test 鏡像來運行兩個容器:

$ docker run -d test

查看 sleep 進程信息:

docker容器,uid,gid

$ docker run --user 0 -d test

再次查看 sleep 進程信息:

docker容器,uid,gid

指定了 --urser 0 參數的進程顯示有效用戶為 root,說明命令行參數 --user 0 覆蓋掉了 Dockerfile 中 USER 命令的設置。

總結

從本文中的示例我們可以了解到,容器中運行的進程同樣具有訪問主機資源的權限(docker 默認并沒有對用戶進行隔離),當然一般情況下容器技術會把容器中進程的可見資源封鎖在容器中。但是通過我們演示的對數據卷中文件的操作可以看出,一旦容器中的進程有機會訪問到宿主機的資源,它的權限和宿主機上用戶的權限是一樣的。所以比較安全的做法是為容器中的進程指定一個具有合適權限的用戶,而不要使用默認的 root 用戶。當然還有更好的方案,就是應用 Linux 的 user namespace 技術隔離用戶,筆者會在接下來的文章中介紹如何配置 docker 開啟 user namespace 的支持。

參考:

Understanding how uid and gid work in Docker containers
Introduction to User Namespaces in Docker Engine
Isolate containers with a user namespace

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲91av视频| 欧美激情喷水视频| 亚洲综合日韩在线| 在线观看亚洲区| 亚洲一区二区在线播放| 亚洲免费电影一区| 欧美国产亚洲视频| 亚洲四色影视在线观看| 欧美黑人xxxx| 欧美成人性生活| 91精品成人久久| 亚洲九九九在线观看| 国产精品久久一| 久久99国产精品久久久久久久久| 日韩中文字在线| 中文字幕日韩在线观看| 有码中文亚洲精品| 色噜噜亚洲精品中文字幕| 亚洲白虎美女被爆操| 国产噜噜噜噜噜久久久久久久久| 国产精选久久久久久| 午夜精品一区二区三区在线播放| 亚洲国产97在线精品一区| 国产69精品久久久久9| 中文字幕一区二区精品| 国产精品私拍pans大尺度在线| 97精品伊人久久久大香线蕉| 中文字幕成人在线| 亚洲专区中文字幕| 亚洲人成网站999久久久综合| 91精品国产九九九久久久亚洲| 伊人亚洲福利一区二区三区| 久久影视电视剧免费网站清宫辞电视| 2019中文字幕在线| 国产欧美日韩丝袜精品一区| 国产精品免费久久久久影院| 日本成人激情视频| 国产成人精品a视频一区www| 国产成人综合一区二区三区| 一区二区欧美亚洲| 日本中文字幕久久看| 国产亚洲精品久久久久久777| 欧美日韩国产中字| 色婷婷av一区二区三区久久| 欧美日韩国内自拍| 色久欧美在线视频观看| 麻豆国产精品va在线观看不卡| 超在线视频97| 国产精品美女在线观看| 一区二区福利视频| 国产一区二中文字幕在线看| 久久久亚洲影院| 一级做a爰片久久毛片美女图片| 久久久久久久久久久国产| 久久99精品国产99久久6尤物| 两个人的视频www国产精品| 夜色77av精品影院| 欧美视频精品一区| 伊人精品在线观看| 中文字幕日韩精品有码视频| 久久久噜噜噜久噜久久| 欧美俄罗斯乱妇| 亚洲第一二三四五区| 亚洲男人的天堂在线播放| 日韩国产一区三区| 欧美亚洲日本网站| 欧美色播在线播放| 欧美午夜激情在线| 欧美性猛交xxxx免费看| 日韩av在线网址| 亚洲欧美日韩精品久久奇米色影视| 91最新国产视频| 国产区精品在线观看| 91中文在线视频| 欧美xxxwww| 91免费综合在线| 91九色国产社区在线观看| 日韩最新中文字幕电影免费看| 中文字幕日韩专区| 精品国产一区二区三区久久久| 欧美成aaa人片在线观看蜜臀| 亚洲精品久久久久中文字幕欢迎你| 国产精品一区二区性色av| 69**夜色精品国产69乱| 欧美日韩亚洲网| 午夜伦理精品一区| 欧美伊久线香蕉线新在线| 国产精品久久久久久久av电影| 成人免费观看49www在线观看| 这里只有精品在线观看| 欧美性猛交xxxx偷拍洗澡| 精品久久久香蕉免费精品视频| 国产精品情侣自拍| 欧美巨大黑人极品精男| 性视频1819p久久| 国产精品视频专区| 日韩av影视综合网| 欧美午夜久久久| 日韩美女视频免费在线观看| 亚洲嫩模很污视频| 久久久久久久国产| 久久免费精品视频| 亚洲国内精品视频| 国产日韩欧美成人| 亚洲男人的天堂在线| 中文字幕一区二区三区电影| 日韩中文字幕国产精品| 91黑丝在线观看| 久久久精品免费视频| 亚洲精品电影网| 亚洲自拍偷拍区| 日韩大片在线观看视频| 亚洲白虎美女被爆操| 成人福利在线视频| 亚洲男人第一av网站| 国产精品白嫩初高中害羞小美女| 亚洲国产高潮在线观看| 欧美大尺度在线观看| 国产成人激情小视频| 国产精品www色诱视频| 亚洲区中文字幕| 国内精品久久久久| 亚洲激情小视频| www.99久久热国产日韩欧美.com| 欧美在线欧美在线| 亚洲精品国产精品久久清纯直播| 日韩在线资源网| 中文字幕亚洲欧美日韩2019| 亚洲japanese制服美女| 91精品国产综合久久香蕉| 大桥未久av一区二区三区| 欧美影院在线播放| 亚洲女人天堂色在线7777| 中文字幕在线国产精品| 日韩麻豆第一页| 久久精品国产99国产精品澳门| 色综合五月天导航| 亚洲福利在线观看| 精品丝袜一区二区三区| 久久综合免费视频| 亚洲视频在线免费观看| 成人国产在线视频| 浅井舞香一区二区| 欧美电影在线观看| 国产精品成人国产乱一区| 日韩在线一区二区三区免费视频| 亚洲变态欧美另类捆绑| 欧美与欧洲交xxxx免费观看| 欧美黑人国产人伦爽爽爽| 国产va免费精品高清在线| 8x海外华人永久免费日韩内陆视频| 91精品一区二区| 国产精品免费网站| 日韩一区二区在线视频| 九九热在线精品视频| 国产欧美精品久久久| 日本高清+成人网在线观看| 在线国产精品视频| 国产精品久久久久久久久久东京| 欧亚精品中文字幕| 成人情趣片在线观看免费| 26uuu另类亚洲欧美日本老年| 日本一区二区在线播放| 欧洲精品毛片网站|