在以 root 用戶(hù)身份運(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 用戶(hù)身份運(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 用戶(hù)身份運(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用戶(hù)身份運(yùn)行容器:最佳實(shí)踐是在容器中以非root用戶(hù)的身份運(yùn)行應(yīng)用程序。這可以通過(guò)在容器中指定普通用戶(hù)來(lái)實(shí)現(xiàn),并避免使用USER指令將容器進(jìn)程切換到 root 用戶(hù)。
?限制容器的權(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用戶(hù)連接到docker套接字。相當(dāng)于允許用戶(hù)以 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用戶(hù)身份來(lái)管理 Docker 守護(hù)進(jìn)程和容器,以降低潛在的安全漏洞風(fēng)險(xiǎn)。在這種模式下,即使在 Docker 安裝期間,也無(wú)需使用root權(quán)限。這有助于提高容器的安全性,因?yàn)橐苑翘貦?quán)用戶(hù)身份運(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),特別是在多租戶(hù)環(huán)境中或需要更嚴(yán)格的容器隔離時(shí),這種模式非常有用。
Rootless 模式允許以非 root 用戶(hù)身份運(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 用戶(hù)和 Docker 守護(hù)進(jìn)程(dockerd)用戶(hù)映射到宿主機(jī)的非特權(quán)用戶(hù)范圍內(nèi)。Docker 此前已經(jīng)提供了--userns-remap標(biāo)志支持了相關(guān)能力,提升了容器的安全隔離性。Rootless 模式在此之上,讓 Docker 守護(hù)進(jìn)程也運(yùn)行在重映射的用戶(hù)名空間中。
用戶(hù)命名空間自 Linux 內(nèi)核 v3.8 以來(lái)就已存在,因此該功能在 Docker 中已經(jīng)存在很長(zhǎng)時(shí)間了 。
img
Rootless 模式在用戶(hù)名稱(chēng)空間內(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,它們是允許在用戶(hù)名稱(chēng)空間中使用多個(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ò)名稱(chēng)空間中命名。這意味著如果不nsenter進(jìn)入網(wǎng)絡(luò)名稱(chēng)空間,則無(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)建普通用戶(hù)
$useraddrootless $echo123456|passwdrootless--stdin
安裝依賴(lài)
Rootless 模式可以在沒(méi)有 root 權(quán)限的情況下運(yùn)行 Docker 守護(hù)進(jìn)程和容器, 但是需要安裝newuidmap和newgidmap工具,以便在用戶(hù)命名空間下創(chuàng)建從屬(subordinate)用戶(hù)和組的映射(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 映射配置
從屬用戶(hù)和組的映射由兩個(gè)配置文件來(lái)控制,分別是/etc/subuid和/etc/subgid。使用以下命令為 rootless 用戶(hù)設(shè)置 65536 個(gè)從屬用戶(hù)和組的映射。
echo"rootless65536"|tee/etc/subuid echo"rootless65536"|tee/etc/subgid
對(duì)于 subuid,這一行記錄的含義為:用戶(hù) rootless,在當(dāng)前的 user namespace 中具有 65536 個(gè)從屬用戶(hù),用戶(hù) ID 為 100000-165535,在一個(gè)子 user namespace 中,這些從屬用戶(hù)被映射成 ID 為 0-65535 的用戶(hù)。subgid 的含義和 subuid 相同。
比如說(shuō)用戶(hù) rootless 在宿主機(jī)上只是一個(gè)具有普通權(quán)限的用戶(hù)。我們可以把他的一個(gè)從屬 ID (比如 100000 )分配給容器所屬的 user namespace,并把 ID 100000 映射到該 user namespace 中的 uid 0。此時(shí)即便容器中的進(jìn)程具有 root 權(quán)限,但也僅僅是在容器所在的 user namespace 中,一旦到了宿主機(jī)中,頂多也就有 rootless 用戶(hù)的權(quán)限而已。
安裝 Rootless Docker
切換到 rootless 用戶(hù)。
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與客戶(hù)端使用的目錄不同。
sudo loginctl enable-linger $(whoami)解釋
這個(gè)命令是用于啟用用戶(hù)的 linger(保持)設(shè)置,讓用戶(hù)的會(huì)話(huà)在用戶(hù)注銷(xiāo)后繼續(xù)運(yùn)行。讓我詳細(xì)解釋一下這個(gè)命令的各個(gè)部分:
1.sudo:sudo是一個(gè)用于以超級(jí)用戶(hù)權(quán)限執(zhí)行命令的工具。在這里,它用于確保我們有足夠的權(quán)限來(lái)執(zhí)行后續(xù)的命令。
2.loginctl:loginctl是一個(gè)用于管理 Linux 登錄會(huì)話(huà)和用戶(hù)登錄狀態(tài)的工具。它可以用于查看、控制和管理用戶(hù)登錄會(huì)話(huà)。
3.enable-linger: 這是loginctl的一個(gè)子命令,用于啟用用戶(hù)的 linger 設(shè)置。Linger 是一個(gè)控制登錄會(huì)話(huà)是否在用戶(hù)注銷(xiāo)后繼續(xù)運(yùn)行的機(jī)制。啟用 linger 后,用戶(hù)注銷(xiāo)后,其登錄會(huì)話(huà)將繼續(xù)運(yùn)行,直到手動(dòng)停止。
4.$(whoami): 這部分是一個(gè)命令替換,它會(huì)被當(dāng)前登錄用戶(hù)的用戶(hù)名所替代。whoami命令用于獲取當(dāng)前登錄用戶(hù)的用戶(hù)名。
因此,整個(gè)命令的目的是以超級(jí)用戶(hù)權(quán)限啟用當(dāng)前登錄用戶(hù)的 linger 設(shè)置,使其登錄會(huì)話(huà)在用戶(hù)注銷(xiāo)后繼續(xù)運(yùn)行。這在某些情況下可能會(huì)很有用,例如,如果你希望在用戶(hù)注銷(xiāo)后繼續(xù)運(yùn)行某些后臺(tái)任務(wù)或服務(wù)。請(qǐng)謹(jǐn)慎使用這個(gè)命令,因?yàn)樗赡軙?huì)導(dǎo)致系統(tǒng)資源被占用,特別是在多用戶(hù)環(huán)境中。
方式2:沒(méi)有systemd
dockerd-rootless.sh
必須設(shè)置以下環(huán)境變量:
?$HOME:用戶(hù)目錄
?$XDG_RUNTIME_DIR:臨時(shí)目錄,只有預(yù)期的用戶(hù)可以訪問(wèn),例如~/.docker/run。該目錄應(yīng)在每次主機(jī)關(guān)閉時(shí)刪除。該目錄可以位于tmpfs上,但是不應(yīng)位于之/tmp下。在此/tmp目錄下,可能容易受到TOCTOU攻擊。
客戶(hù)端
需要明確指定套接字路徑或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名稱(chēng)空間
dockerd-rootless.sh腳本,會(huì)在其自己的user,mount和network 名稱(chēng)空間中執(zhí)行dockerd。
為了進(jìn)行調(diào)試,你可以通過(guò)以下明立進(jìn)入名稱(chēng)空間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)程以普通用戶(hù)身份運(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)注
4文章
1468瀏覽量
42874 -
Linux
+關(guān)注
關(guān)注
88文章
11760瀏覽量
219020 -
容器
+關(guān)注
關(guān)注
0文章
531瀏覽量
22965 -
root
+關(guān)注
關(guān)注
1文章
86瀏覽量
22099 -
Docker
+關(guān)注
關(guān)注
0文章
532瀏覽量
14243
原文標(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ò)的基本概念和原理與用法
Docker Rootless的基本概念 Rootless模式如何運(yùn)作
評(píng)論