docker系列使用非root用戶安裝及啟動docker(rootless模式運行)

      網友投稿 2524 2022-05-30

      通過我之前的文章已經可以驗證,在root用戶下安裝啟動的容器存在安全問題。究其原因是因為:

      容器內的root用戶就是宿主機的root用戶,容器內uid=1000的用戶就是宿主機uid=1000的用戶

      docker的守護進程是root權限的

      既然我們知道了原因,那么我們就來解決一下這兩個問題。

      文章目錄

      一、容器用戶與宿主機用戶映射

      二、在非root用戶下運行docker守護進程

      2.1.docker版本要求

      2.2. 前置條件

      2.3.開始rootless模式安裝

      2.4.啟動守護進程運行容器

      三、存在若干已知的限制。

      四、卸載Rootless docker

      一、容器用戶與宿主機用戶映射

      docker是使用--userns-remap容器用戶映射宿主機用戶的方式來解決問題,具體的方法描述如下:

      用戶和組的映射由兩個配置文件來控制,分別是/etc/subuid和/etc/subgid。

      echo "zimug:100000:65536" | tee /etc/subuid; echo "zimug:100000:65536" | tee /etc/subgid;

      1

      2

      subuid(sub子uid用戶id):對于subuid的這一行表示,宿主機用戶zimug的用戶ip段為[100000,10000+65535]。也就是說,使用zimug這個宿主機啟動容器,容器內的用戶uid與宿主機內的用戶uid存在關系。也就是說按照上面的配置:

      zimug這個用戶的容器子用戶id(subuid),只能在[100000-165535]之間進行分配。[0-99999]這個區間范圍內的uid仍然保留給宿主機進行使用。

      使用zimug啟動的第一個容器,容器用戶root(uid=0)對應的宿主機用戶應該是uid=100000(不是宿主機root用戶)

      使用zimug啟動的第二個容器,容器用戶root(uid-0)對應的宿主機用戶可能是uid=101000(也不是宿主機root用戶)

      subgid表示的是用戶組id的映射關系,映射原理和uid是一致的。

      二、在非root用戶下運行docker守護進程

      2.1.docker版本要求

      既然root用戶的提權問題解決了,我們就要解決下一個問題:docker的守護進程是root權限的,即運行docker守護進程的用戶仍然是root。我們需要做如下修正:

      也就是我們要在非root用戶下安裝docker,并啟動docker守護進程,這種安裝及運行模式被稱為“RootLess”模式。可以安裝但是存在先決條件:“RootLess”模式是在 Docker Engine v19.03 中作為實驗性功能引入的,從 Docker Engine v20.10 開始提供正式使用。

      2.2. 前置條件

      【docker系列】使用非root用戶安裝及啟動docker(rootless模式運行)

      需要安裝newuidmap和newgidmap工具shadow-utils,即配置上文中的/etc/subuid和/etc/subuid需要這兩個工具的支持。安裝之前使用yum list installed shadow-utils確認下是否已經安裝過或者操作系統自帶,如果存在就不要安裝了,但第三步的配置是需要的。

      第一步:添加一個軟件包安裝源,該源下面包含shadow-utils46-newxidmap

      curl -o /etc/yum.repos.d/vbatts-shadow-utils-newxidmap-epel-7.repo https://copr.fedorainfracloud.org/coprs/vbatts/shadow-utils-newxidmap/repo/epel-7/vbatts-shadow-utils-newxidmap-epel-7.repo

      1

      第二步: yum install -y shadow-utils46-newxidmap

      第三步:在/etc/sysctl.conf文件中修改系統參數user.max_user_namespaces = 28633,修改完成之后執行sysctl --system命令讓參數生效。

      echo user.max_user_namespaces=28633 >> /etc/sysctl.d/userns.conf; sudo sysctl -p /etc/sysctl.d/userns.conf;

      1

      2

      該參數默認值是0,即不允許操作系統用戶存在subuid空間。上面的操作完成之后使用sysctl --all --pattern user_namespaces命令驗證修改的結果。

      2.3.開始rootless模式安裝

      root用戶下確保已經執行下列命令進行用戶id關系配置

      echo "zimug:100000:65536" | tee /etc/subuid; echo "zimug:100000:65536" | tee /etc/subgid;

      1

      2

      我已經新建了一個linux用戶zimug,使用su - zimug切換到該用戶下,執行安裝腳本,該安裝腳本需要連網。

      curl -fsSL https://get.docker.com/rootless | sh

      1

      腳本執行完成之后,顯示的內容如下:

      將上圖中安裝過程提示的export內容添加到 ~/.bashrc 文件中,添加完使用source ~/.bashrc命令使環境變量生效。注意:你的環境變量和我的一定不一致,要copy上圖中紅色部分。

      export XDG_RUNTIME_DIR=/home/zimug/.docker/run export PATH=/home/zimug/bin:$PATH export DOCKER_HOST=unix:///home/zimug/.docker/run/docker.sock

      1

      2

      3

      2.4.啟動守護進程運行容器

      在zimug用戶下使用下面的腳本啟動docker守護進程,該腳本在上文中的環境變量PATH目錄下,所以我們不用寫全路徑。注意:我們這里使用了 --experimental --storage-driver vfs參數啟動,因為我的linux內核版本比較低所以需要加這個參數,后文我會說明原因。

      dockerd-rootless.sh --experimental --storage-driver vfs

      1

      啟動一個容器我們嘗試一下,注意宿主機映射的端口不能小于1024,因為linux非root用戶不能使用1024以下的端口。

      docker run -d --name nginx-zimug -p 8080:80 nginx

      1

      訪問nginx服務看到界面就證明nginx服務沒有問題,同時注意宿主機防火墻開放8080端口訪問,這個我就不說了。

      三、存在若干已知的限制。

      官方文檔說的是known-limitations,也就是已知的受限因素是下面這些,未知的受限因素還不一定有多少呢。所以筆者針對rootless模式目前也只是研究,還沒有在生產上能夠正式使用(2022年4月6日)。雖然它很安全,但是如果坑太多的話,我也受不了啊。

      目前僅支持以下存儲驅動程序:

      overlay2(僅當使用內核 5.11 或更高版本或 Ubuntu 發行版本的內核運行時,才能夠支持這個存儲驅動)。上文中我的內核版本是3.10達不到要求。

      fuse-overlayfs(僅當使用內核 4.18 或更高版本運行并fuse-overlayfs被安裝時)

      btrfs(僅當使用內核 4.18 或更高版本運行,或者~/.local/share/docker使用user_subvol_rm_allowed掛載選項掛載時)

      vfs 兼容性最好,但這個存儲驅動目前僅能用于實驗,不能用于生產。

      只有在使用 cgroup v2 和 systemd 運行時才支持 Cgroup。

      不支持以下功能:

      AppArmor

      Checkpoint

      Overlay網絡模式

      暴漏SCTP 端口

      四、卸載Rootless docker

      在非root用戶(我用的是zimug用戶)下執行下列命令,完成docker rootless卸載

      第一步:

      rootlesskit rm -rf ~/.local/share/docker

      1

      第二步:

      $ cd ~/bin $ rm -f containerd containerd-shim containerd-shim-runc-v2 ctr docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh rootlesskit rootlesskit-docker-proxy runc vpnkit

      1

      2

      第三步: 把上文中在 ~/.bashrc 文件中添加的環境變量刪掉。

      Docker Linux 容器

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:擺平各類目標檢測識別AI應用,有它就夠了!
      下一篇:深入掌握 SAP Fiori Elements 工作原理的前提條件:理解 Smart Field
      相關文章
      91嫩草亚洲精品| 精品亚洲永久免费精品| 亚洲视频欧洲视频| 亚洲av无码乱码国产精品| 亚洲精品字幕在线观看| 亚洲乱码中文字幕久久孕妇黑人| 国产成人亚洲综合无码| 曰韩亚洲av人人夜夜澡人人爽| 亚洲美女高清一区二区三区| 亚洲av无码国产精品色在线看不卡 | 亚洲国产福利精品一区二区| 亚洲精品日韩专区silk| 亚洲手机中文字幕| 亚洲一区二区三区免费视频 | 久久久久se色偷偷亚洲精品av | 日本亚洲免费无线码| 亚洲avav天堂av在线网爱情| ww亚洲ww在线观看国产| 亚洲精品123区在线观看| 亚洲人成网站日本片| 97久久国产亚洲精品超碰热| 亚洲色欲啪啪久久WWW综合网| 亚洲熟妇无码一区二区三区| 亚洲 欧洲 日韩 综合在线| 亚洲成a人片在线观| 日本亚洲免费无线码| 色窝窝亚洲AV网在线观看| 亚洲AV无码一区二区三区鸳鸯影院| WWW亚洲色大成网络.COM| 亚洲精品无码成人片在线观看| 久久精品国产精品亚洲| 亚洲最大AV网站在线观看| 国产精品亚洲精品日韩已满| 亚洲国产精品久久久久婷婷软件| 久久亚洲春色中文字幕久久久| 亚洲精品国产高清不卡在线| 亚洲精品午夜无码电影网| 久久亚洲国产成人精品性色| 亚洲乱码在线卡一卡二卡新区| 久久精品国产亚洲av瑜伽| 国产亚洲情侣一区二区无码AV |