在以 root 用戶身份運(yùn)行 Docker 會(huì)帶來(lái)一些潛在的危害和安全風(fēng)險(xiǎn),這些風(fēng)險(xiǎn)包括:
1.容器逃逸:如果一個(gè)容器以 root 權(quán)限運(yùn)行,并且它包含了漏洞或者被攻擊者濫用,那么攻擊者可能會(huì)成功逃出容器,并在宿主系統(tǒng)上執(zhí)行惡意操作。這會(huì)導(dǎo)致宿主系統(tǒng)的安全性受到威脅。
2.特權(quán)升級(jí):在以 root 用戶身份運(yùn)行 Docker 的情況下,容器內(nèi)的進(jìn)程可能會(huì)嘗試特權(quán)升級(jí),獲取宿主系統(tǒng)的 root 權(quán)限。這可能會(huì)導(dǎo)致嚴(yán)重的安全問(wèn)題,因?yàn)楣粽呖赡軙?huì)利用這些權(quán)限來(lái)控制宿主系統(tǒng)。
3.文件系統(tǒng)訪問(wèn):以 root 用戶身份運(yùn)行的容器可以訪問(wèn)宿主系統(tǒng)上的文件系統(tǒng),這可能會(huì)導(dǎo)致機(jī)密文件的泄漏或文件的損壞。
4.網(wǎng)絡(luò)權(quán)限:容器以 root 權(quán)限運(yùn)行時(shí),可能會(huì)濫用網(wǎng)絡(luò)權(quán)限,例如進(jìn)行端口掃描、DDoS 攻擊等惡意行為。
為了減少這些風(fēng)險(xiǎn),推薦采取以下做法:
?以非root用戶身份運(yùn)行容器:最佳實(shí)踐是在容器中以非root用戶的身份運(yùn)行應(yīng)用程序。這可以通過(guò)在容器中指定普通用戶來(lái)實(shí)現(xiàn),并避免使用USER指令將容器進(jìn)程切換到 root 用戶。
?限制容器的權(quán)限:使用 Docker 的安全配置選項(xiàng),如--security-opt,可以限制容器的能力,例如禁止容器訪問(wèn)宿主系統(tǒng)的特定目錄、文件和設(shè)備。
?更新和監(jiān)控容器:定期更新容器的基礎(chǔ)鏡像和應(yīng)用程序,以確保安全漏洞得到修復(fù)。同時(shí),使用容器監(jiān)控和審計(jì)工具來(lái)檢測(cè)不尋常的活動(dòng)。
?限制容器能力:使用 Docker 的能力(capabilities)設(shè)置來(lái)限制容器的權(quán)限,僅提供所需的最小權(quán)限來(lái)運(yùn)行應(yīng)用程序。
什么東西看似Rootless ,實(shí)則不然
?docker run --user foo:它允許你以非 root 身份在容器中執(zhí)行進(jìn)程。值得注意的是,你無(wú)法執(zhí)行包安裝等特權(quán)活動(dòng)。runc、containerd 等仍以 root 身份運(yùn)行。
?usermod -aG docker foo:允許非root用戶連接到docker套接字。相當(dāng)于允許用戶以 root 身份運(yùn)行。
?sudo docker和chmod +s dockerd: 無(wú)需解釋
?dockerd --userns-remap:它允許你以非 root 身份運(yùn)行容器。runc、containerd 等仍然以 root 身份運(yùn)行。
Docker Rootless 基本概念
Docker Rootless 是一種在非特權(quán)模式下運(yùn)行 Docker 的方式,允許以非root用戶身份來(lái)管理 Docker 守護(hù)進(jìn)程和容器,以降低潛在的安全漏洞風(fēng)險(xiǎn)。在這種模式下,即使在 Docker 安裝期間,也無(wú)需使用root權(quán)限。這有助于提高容器的安全性,因?yàn)橐苑翘貦?quán)用戶身份運(yùn)行容器可以限制容器內(nèi)部的特權(quán)操作。對(duì)于特權(quán)模式的 Docker 容器,攻擊者可能會(huì)利用宿主機(jī)文件讀寫(xiě)權(quán)限等漏洞來(lái)逃逸,因此非特權(quán)模式更為安全。
同時(shí),在 Docker 中,容器可以選擇是否以特權(quán)模式運(yùn)行,通過(guò)設(shè)置--privileged=false可以將容器切換為非特權(quán)模式??偟膩?lái)說(shuō),Docker Rootless 模式提供了一種更加安全的方式來(lái)運(yùn)行 Docker 容器,降低了潛在的安全風(fēng)險(xiǎn),特別是在多租戶環(huán)境中或需要更嚴(yán)格的容器隔離時(shí),這種模式非常有用。
Rootless 模式允許以非 root 用戶身份運(yùn)行 Docker 守護(hù)進(jìn)程(dockerd)和容器,以緩解 Docker 守護(hù)進(jìn)程和容器運(yùn)行時(shí)中潛在的漏洞。
Rootless 模式是在 Docker v19.03 版本作為實(shí)驗(yàn)性功能引入的,在 Docker v20.10 版本 GA。
Rootless 模式如何運(yùn)作
Rootless 模式利用 user namespaces 將容器中的 root 用戶和 Docker 守護(hù)進(jìn)程(dockerd)用戶映射到宿主機(jī)的非特權(quán)用戶范圍內(nèi)。Docker 此前已經(jīng)提供了--userns-remap標(biāo)志支持了相關(guān)能力,提升了容器的安全隔離性。Rootless 模式在此之上,讓 Docker 守護(hù)進(jìn)程也運(yùn)行在重映射的用戶名空間中。
用戶命名空間自 Linux 內(nèi)核 v3.8 以來(lái)就已存在,因此該功能在 Docker 中已經(jīng)存在很長(zhǎng)時(shí)間了 。
img
Rootless 模式在用戶名稱空間內(nèi)執(zhí)行Docker守護(hù)程序和容器。這與userns-remapmode非常相似,除了模式之外,userns-remap守護(hù)進(jìn)程本身以root特權(quán)運(yùn)行,而在Rootless 模式下,守護(hù)程序和容器都在沒(méi)有root特權(quán)的情況下運(yùn)行。
Rootless 模式不使用具有SETUID位或文件功能的二進(jìn)制文件,除了newuidmap和newgidmap,它們是允許在用戶名稱空間中使用多個(gè)UID / GID所必需的。
Rootless 模式已知限制
?僅支持以下存儲(chǔ)驅(qū)動(dòng)程序:
?overlay2(僅在以5.11或更高版本的內(nèi)核,Ubuntu風(fēng)格的內(nèi)核或Debian風(fēng)格的內(nèi)核運(yùn)行時(shí))
?fuse-overlayfs(僅在與內(nèi)核4.18或更高版本一起運(yùn)行且fuse-overlayfs已安裝的情況下)
?btrfs(僅在使用內(nèi)核4.18或更高版本運(yùn)行,或~/.local/share/docker通過(guò)user_subvol_rm_allowedmount選項(xiàng)安裝時(shí))
?vfs
?僅當(dāng)與cgroup v2和systemd一起運(yùn)行時(shí),才支持Cgroup。請(qǐng)參閱限制資源。
?不支持以下功能:
?AppArmor
?檢查站
?疊加網(wǎng)絡(luò)
?暴露SCTP端口
?要使用該ping命令,請(qǐng)參閱路由ping數(shù)據(jù)包。
?要公開(kāi)特權(quán)TCP / UDP端口(<1024),請(qǐng)參閱公開(kāi)特權(quán)端口。
?IPAddress顯示在中,docker inspect并在RootlessKit的網(wǎng)絡(luò)名稱空間中命名。這意味著如果不nsenter進(jìn)入網(wǎng)絡(luò)名稱空間,則無(wú)法從主機(jī)訪問(wèn)IP地址。
?主機(jī)網(wǎng)絡(luò)(docker run --net=host)。
Rootless 模式實(shí)踐
實(shí)踐環(huán)境
本文使用 Centos 7.5 操作系統(tǒng)的虛擬機(jī)進(jìn)行實(shí)驗(yàn)。
$cat/etc/redhat-release CentOSLinuxrelease7.5.1804(Core)
創(chuàng)建普通用戶
$useraddrootless $echo123456|passwdrootless--stdin
安裝依賴
Rootless 模式可以在沒(méi)有 root 權(quán)限的情況下運(yùn)行 Docker 守護(hù)進(jìn)程和容器, 但是需要安裝newuidmap和newgidmap工具,以便在用戶命名空間下創(chuàng)建從屬(subordinate)用戶和組的映射(remapping)。通過(guò)以下命令安裝newuidmap和newgidmap工具。
cat</etc/sysctl.conf user.max_user_namespaces=28633 EOT sysctl--system EOF
注意事項(xiàng)
CentOS 7
?添加user.max_user_namespaces=28633到/etc/sysctl.conf(或/etc/sysctl.d)并運(yùn)行sudo sysctl --system。
?systemctl --user默認(rèn)情況下不起作用。dockerd-rootless.sh不使用systemd直接運(yùn)行。
CentOS 8 / Fedora
?fuse-overlayfs建議安裝。運(yùn)行sudo dnf install -y fuse-overlayfs。
?你可能需要sudo dnf install -y iptables。
?啟用SELinux后,你可能會(huì)遇到can't open lock file /run/xtables.lock: Permission denied錯(cuò)誤。解決此問(wèn)題的方法是sudo dnf install -y policycoreutils-python-utils && sudo semanage permissive -a iptables_t。此問(wèn)題已在moby / moby#41230中進(jìn)行了跟蹤。
?已知可在CentOS 8和Fedora 33上工作。
Ubuntu
?無(wú)需準(zhǔn)備。
?overlay2默認(rèn)情況下啟用存儲(chǔ)驅(qū)動(dòng)程序(特定于Ubuntu的內(nèi)核補(bǔ)?。?。
?已知可在Ubuntu 16.04、18.04和20.04上運(yùn)行
UID/GID 映射配置
從屬用戶和組的映射由兩個(gè)配置文件來(lái)控制,分別是/etc/subuid和/etc/subgid。使用以下命令為 rootless 用戶設(shè)置 65536 個(gè)從屬用戶和組的映射。
echo"rootless65536"|tee/etc/subuid echo"rootless65536"|tee/etc/subgid
對(duì)于 subuid,這一行記錄的含義為:用戶 rootless,在當(dāng)前的 user namespace 中具有 65536 個(gè)從屬用戶,用戶 ID 為 100000-165535,在一個(gè)子 user namespace 中,這些從屬用戶被映射成 ID 為 0-65535 的用戶。subgid 的含義和 subuid 相同。
比如說(shuō)用戶 rootless 在宿主機(jī)上只是一個(gè)具有普通權(quán)限的用戶。我們可以把他的一個(gè)從屬 ID (比如 100000 )分配給容器所屬的 user namespace,并把 ID 100000 映射到該 user namespace 中的 uid 0。此時(shí)即便容器中的進(jìn)程具有 root 權(quán)限,但也僅僅是在容器所在的 user namespace 中,一旦到了宿主機(jī)中,頂多也就有 rootless 用戶的權(quán)限而已。
安裝 Rootless Docker
切換到 rootless 用戶。
su-rootless
執(zhí)行以下命令安裝 Rootless Docker。
curl-fsSLhttps://get.docker.com/rootless|sh
安裝成功后顯示如下內(nèi)容。
$curl-fsSLhttps://get.docker.com/rootless|sh #Installingstableversion24.0.5 #Executingdockerrootlessinstallscript,commit:b9139c0 %Total%Received%XferdAverageSpeedTimeTimeTimeCurrent DloadUploadTotalSpentLeftSpeed 10066.5M10066.5M001235k0055055----1373k %Total%Received%XferdAverageSpeedTimeTimeTimeCurrent DloadUploadTotalSpentLeftSpeed 10019.4M10019.4M001096k0018018----1233k +PATH=/home/rootless/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/rootless/.local/bin:/home/rootless/bin +/home/rootless/bin/dockerd-rootless-setuptool.shinstall [INFO]systemdnotdetected,dockerd-rootless.shneedstobestartedmanually: PATH=/home/rootless/bin:/sbin:/usr/sbin:$PATHdockerd-rootless.sh [INFO]CreatingCLIcontext"rootless" Successfullycreatedcontext"rootless" [INFO]UsingCLIcontext"rootless" Currentcontextisnow"rootless" [INFO]Makesurethefollowingenvironmentvariable(s)areset(oraddthemto~/.bashrc): #WARNING:systemdnotfound.YouhavetoremoveXDG_RUNTIME_DIRmanuallyoneverylogout. exportXDG_RUNTIME_DIR=/home/rootless/.docker/run exportPATH=/home/rootless/bin:$PATH [INFO]Someapplicationsmayrequirethefollowingenvironmentvariabletoo: exportDOCKER_HOST=unix:///home/rootless/.docker/run/docker.sock
將以下內(nèi)容添加到 ~/.bashrc 文件中,添加完以后使用source ~/.bashrc命令使環(huán)境變量生效。
exportXDG_RUNTIME_DIR=/home/rootless/.docker/run exportPATH=/home/rootless/bin:$PATH exportDOCKER_HOST=unix:///home/rootless/.docker/run/docker.sock
啟動(dòng) Docker 守護(hù)進(jìn)程
方式1:帶systemd(強(qiáng)烈推薦)
systemd文件默認(rèn)位置為~/.config/systemd/user/docker.service。
使用systemctl --user管理守護(hù)程序的生命周期:
$systemctl--userstartdocker
要在系統(tǒng)啟動(dòng)時(shí)啟動(dòng)守護(hù)程序,請(qǐng)啟用systemd服務(wù)并持續(xù)進(jìn)行以下操作:
$systemctl--userenabledocker $sudologinctlenable-linger$(whoami)
即使使用User=指令,也不支持將Rootless Docker作為全系統(tǒng)范圍的服務(wù)(/etc/systemd/system/docker.service)啟動(dòng)。
關(guān)于目錄路徑的說(shuō)明:
?套接字默認(rèn)路徑為$XDG_RUNTIME_DIR/docker.sock。$XDG_RUNTIME_DIR通常設(shè)置為/run/user/$UID。
?數(shù)據(jù)目錄默認(rèn)設(shè)置為~/.local/share/docker。數(shù)據(jù)目錄不應(yīng)位于NFS上。
?守護(hù)程序配置目錄默認(rèn)設(shè)置為~/.config/docker。此目錄~/.docker與客戶端使用的目錄不同。
sudo loginctl enable-linger $(whoami)解釋
這個(gè)命令是用于啟用用戶的 linger(保持)設(shè)置,讓用戶的會(huì)話在用戶注銷后繼續(xù)運(yùn)行。讓我詳細(xì)解釋一下這個(gè)命令的各個(gè)部分:
1.sudo:sudo是一個(gè)用于以超級(jí)用戶權(quán)限執(zhí)行命令的工具。在這里,它用于確保我們有足夠的權(quán)限來(lái)執(zhí)行后續(xù)的命令。
2.loginctl:loginctl是一個(gè)用于管理 Linux 登錄會(huì)話和用戶登錄狀態(tài)的工具。它可以用于查看、控制和管理用戶登錄會(huì)話。
3.enable-linger: 這是loginctl的一個(gè)子命令,用于啟用用戶的 linger 設(shè)置。Linger 是一個(gè)控制登錄會(huì)話是否在用戶注銷后繼續(xù)運(yùn)行的機(jī)制。啟用 linger 后,用戶注銷后,其登錄會(huì)話將繼續(xù)運(yùn)行,直到手動(dòng)停止。
4.$(whoami): 這部分是一個(gè)命令替換,它會(huì)被當(dāng)前登錄用戶的用戶名所替代。whoami命令用于獲取當(dāng)前登錄用戶的用戶名。
因此,整個(gè)命令的目的是以超級(jí)用戶權(quán)限啟用當(dāng)前登錄用戶的 linger 設(shè)置,使其登錄會(huì)話在用戶注銷后繼續(xù)運(yùn)行。這在某些情況下可能會(huì)很有用,例如,如果你希望在用戶注銷后繼續(xù)運(yùn)行某些后臺(tái)任務(wù)或服務(wù)。請(qǐng)謹(jǐn)慎使用這個(gè)命令,因?yàn)樗赡軙?huì)導(dǎo)致系統(tǒng)資源被占用,特別是在多用戶環(huán)境中。
方式2:沒(méi)有systemd
dockerd-rootless.sh
必須設(shè)置以下環(huán)境變量:
?$HOME:用戶目錄
?$XDG_RUNTIME_DIR:臨時(shí)目錄,只有預(yù)期的用戶可以訪問(wèn),例如~/.docker/run。該目錄應(yīng)在每次主機(jī)關(guān)閉時(shí)刪除。該目錄可以位于tmpfs上,但是不應(yīng)位于之/tmp下。在此/tmp目錄下,可能容易受到TOCTOU攻擊。
客戶端
需要明確指定套接字路徑或CLI上下文。
要指定套接字路徑,請(qǐng)使用$DOCKER_HOST:
$exportDOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock $dockerrun-d-p8080:80nginx
要指定CLI上下文,請(qǐng)使用docker context:
$dockercontextuserootless rootless Currentcontextisnow"rootless" $dockerrun-d-p8080:80nginx
運(yùn)行容器
使用以下命令啟動(dòng)一個(gè) nginx 容器,并將 80 端口映射到宿主機(jī)的 8080 端口。
dockerrun-d-p8080:80nginx
查看容器。
[rootless@demo~]$dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES f3b204c97a84nginx"/docker-entrypoint.…"9minutesagoUp9minutes0.0.0.0:8080->80/tcp,:::8080->80/tcpbold_stonebraker
訪問(wèn)容器。
$curlhttp://localhost:8080 #返回結(jié)果Nginx歡迎界面Welcometonginx! Welcometonginx!
Ifyouseethispage,thenginxwebserverissuccessfullyinstalledand working.Furtherconfigurationisrequired.
Foronlinedocumentationandsupportpleasereferto nginx.org.
Commercialsupportisavailableat nginx.com.Thankyouforusingnginx.
Rootless 模式調(diào)試技巧
進(jìn)入dockerd名稱空間
dockerd-rootless.sh腳本,會(huì)在其自己的user,mount和network 名稱空間中執(zhí)行dockerd。
為了進(jìn)行調(diào)試,你可以通過(guò)以下明立進(jìn)入名稱空間Rootless 模式
nsenter-U--preserve-credentials-n-m-t$(cat$XDG_RUNTIME_DIR/docker.pid)
Rootless 模式卸載
要?jiǎng)h除Docker守護(hù)程序的systemd服務(wù),請(qǐng)運(yùn)行dockerd-rootless-setuptool.sh uninstall:
dockerd-rootless-setuptool.sh默認(rèn)位置:/home/rootless/bin/dockerd-rootless-setuptool.sh
$dockerd-rootless-setuptool.shuninstall +systemctl--userstopdocker.service +systemctl--userdisabledocker.service Removed/home/testuser/.config/systemd/user/default.target.wants/docker.service. [INFO]Uninstalleddocker.service [INFO]ThisuninstallationtooldoesNOTremoveDockerbinariesanddata. [INFO]Toremovedata,run:`/usr/bin/rootlesskitrm-rf/home/testuser/.local/share/docker`
要?jiǎng)h除數(shù)據(jù)目錄,請(qǐng)運(yùn)行rootlesskit rm -rf ~/.local/share/docker。
要?jiǎng)h除二進(jìn)制文件,docker-ce-rootless-extras請(qǐng)?jiān)谲浖芾砥髦邪惭b了Docker的情況下刪除軟件包。如果你使用https://get.docker.com/rootless安裝了Docker,請(qǐng)刪除以下二進(jìn)制文件`~/bin`:
$cd~/bin $rm-fcontainerdcontainerd-shimcontainerd-shim-runc-v2ctrdockerdocker-initdocker-proxydockerddockerd-rootless-setuptool.shdockerd-rootless.shrootlesskitrootlesskit-docker-proxyruncvpnkit
Rootless Docker 與 Podman
RedHat Inc 的 Podman 是另一種流行的容器引擎,用于運(yùn)行和管理容器。它被譽(yù)為以Rootless 運(yùn)行是其相對(duì)于 docker 引擎的功能之一。通過(guò)Rootless Docker ,彌合了差距,現(xiàn)在它們具有幾乎相同的功能和幾乎相同的性能。他們之間還使用大量相同的代碼。
Rootless Docker 不支持指定docker run --net=host 。但如果你確實(shí)需要使用docker run --net=host,Podman 可能是你更好的選擇。
總結(jié)
Docker Rootless模式是官方提供的一種安全解決方案,可以讓Docker守護(hù)進(jìn)程以普通用戶身份運(yùn)行,從而避免容器應(yīng)用利用Docker漏洞獲得宿主機(jī)root權(quán)限的風(fēng)險(xiǎn)。
另外,要注意的是因?yàn)镈ocker作為容器本身需要利用很多系統(tǒng)高級(jí)特性,因此Docker守護(hù)進(jìn)程以非Root身份運(yùn)行實(shí)際上也會(huì)導(dǎo)致一些功能受限。這點(diǎn)可以參與官方文檔詳細(xì)了解。
審核編輯:湯梓紅
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1416瀏覽量
41444 -
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213845 -
容器
+關(guān)注
關(guān)注
0文章
511瀏覽量
22458 -
root
+關(guān)注
關(guān)注
1文章
86瀏覽量
21734 -
Docker
+關(guān)注
關(guān)注
0文章
515瀏覽量
12971
原文標(biāo)題:容器快了,卻不安全了,Rootless 安排上
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
智能天線的基本概念
缺省適配器模式基本概念
對(duì)象適配器模式基本概念
ESP8266 WIFI模塊基本概念與工作模式簡(jiǎn)析
時(shí)序分析基本概念介紹—花一樣的“模式”

線性穩(wěn)壓器和開(kāi)關(guān)模式電源(SMPS)的基本概念

Docker網(wǎng)絡(luò)的基本概念和原理與用法

評(píng)論