無根二叉樹 無根Podman如何工作?

2021-10-08 04:36:02 字數 3171 閱讀 1271

無根二叉樹

文章中 ,我討論了如何使用podman命令來啟動具有不同使用者名稱空間的不同容器,從而使容器之間的分隔更好。 podman還利用使用者名稱空間來以無根模式執行。 基本上,當非特權使用者執行podman時,該工具將設定並加入使用者名稱空間。 在podman成為使用者名稱空間內部的根之後,允許podman掛載某些檔案系統並設定容器。 請注意,除了使用者可用的其他uid之外,此處沒有特權公升級,如下所述。

當前大多數linux發行版都包含乙個影子實用程式版本,該版本使用/ etc / subuid/ etc / subgid檔案來確定使用者名稱空間中使用者可以使用哪些uid和gid。

$ cat /etc/subuid

dwalsh:100000:65536

test:165536:65536

$ cat /etc/subgid

dwalsh:100000:65536

test:165536:65536

useradd程式自動為新增到系統中的每個使用者分配65536個uid。 如果系統上已有使用者,則需要自己分配uid。 這些檔案的格式為使用者名稱:startuid:totaluids。 在我的情況下,這意味著為dwalsh分配了100000至165535的uid以及我的預設uid,該預設id恰好是在/ etc / passwd中定義的3265。 分配這些uid範圍時,請注意它們與系統上的任何實際uid都不重疊。 如果您有乙個列為uid 100001的使用者,那麼我(dwalsh)將能夠成為此uid並可能讀取/寫入/執行該uid擁有的檔案。

shadow-utils還新增了兩個setuid程式(或setfilecap)。 在fedora上,我有:

$ getcap /usr/bin/newuidmap

/usr/bin/newuidmap = cap_setuid+ep

$ getcap /usr/bin/newgidmap

/usr/bin/newgidmap = cap_setgid+ep

podman執行這些檔案以設定使用者名稱空間。 您可以通過從無根容器內部檢查/ proc / self / uid_map和/ proc / self / gid_map來檢視對映。

$ podman run alpine cat /proc/self/uid_map /proc/self/gid_map

0       3267            1

1       100000          65536

0       3267            1

1       100000          65536

如上所示,podman預設將容器的根對映到您當前的uid(3267),然後將分配的uid / gid範圍對映到/ etc / subuid和/ etc / subgid中,從1開始。這意味著在我的示例中,uid = 1容器中的值是uid 100000,uid = 2是uid 100001,一直到65536,即165535。

uid或gid所擁有的,未對映到使用者名稱空間的,來自使用者名稱空間之外的任何專案似乎都屬於在kernel.overflowuidsysctl中配置的使用者,預設情況下為35534,即我的/ etc / passwd檔案說名字沒有人。 由於您的程序無法以未對映的id身份執行,因此所有者和組許可權不適用,因此您只能基於它們的「其他」許可權來訪問這些檔案。 這包括執行容器的系統上的真實根目錄所有的檔案,因為根目錄未對映到使用者名稱空間。

buildah命令具有乙個很酷的功能,buildah unshare。 這使您處於podman執行所在的使用者名稱空間中,但無需輸入容器的檔案系統,因此您可以列出主目錄的內容。

$ ls -ild /home/dwalsh

8193 drwx--x--x. 290 dwalsh dwalsh 20480 jan 29 07:58 /home/dwalsh

$ buildah unshare ls -ld /home/dwalsh

drwx--x--x. 290 root root 20480 jan 29 07:58 /home/dwalsh

注意,當在使用者名稱空間之外列出home dir屬性時,核心將所有權報告為dwalsh,而在使用者名稱空間內部,核心將目錄報告為root擁有。 這是因為主目錄歸3267所有,並且在使用者名稱空間內,我們將該uid視為根目錄。

podman使用容器/儲存來拉出容器映像,並且容器/儲存足夠聰明,可以將映像中由根擁有的所有檔案對映到使用者名稱空間的根,以及將不同uid擁有的任何其他檔案對映到其使用者名稱空間uid。 預設情況下,此內容被寫入〜/ .local / share / containers / storage。 容器儲存可以在無根模式下與vfs模式或overlay一起工作。 注意:僅當安裝了fuse-overlayfs可執行檔案時,才支援覆蓋。

如果使用保險絲覆蓋,則podman會安裝容器的儲存; 如果儲存驅動程式正在使用vfs,則無需安裝。 不過,vfs上的podman需要大量空間,因為每個容器都會複製整個基礎檔案系統。

然後podman掛載/ proc和/ sys以及一些tmpfs,並在容器中建立裝置。

為了使用除主機網路之外的網路,podman使用slirp4netns程式為非特權網路命名空間設定使用者模式網路。 slirp4netns允許podman將容器內的埠暴露給主機。 請注意,核心仍將不允許非特權程序繫結到小於1024的埠。繫結埠需要podman-1.1或更高版本。

無根podman可以使用使用者名稱空間進行容器分離,但是您只能訪問/ etc / subuid檔案中定義的uid。

podman工具使人們能夠在不犧牲系統安全性的情況下構建和使用容器。 您可以授予開發人員所需的訪問許可權,而無需授予他們root許可權。

而且,當您將容器投入生產時,您可以利用使用者名稱空間提供的額外安全性,以使工作負載彼此隔離。

翻譯自:

無根二叉樹

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...