如何用 Rootless 模式实现普通用户运行 Docker 容器

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

4994b65ac61e6c9cc26a0f630a1d9450.png

Docker Rootless 基本概念

Rootless 模式允许以非 root 用户身份运行 Docker 守护进程(dockerd)和容器,以缓解 Docker 守护进程和容器运行时中潜在的漏洞。Rootless 模式是在 Docker v19.03 版本作为实验性功能引入的,在 Docker v20.10 版本 GA。

Rootless 模式目前对 Cgroups 资源控制,Apparmor 安全配置,Overlay 网络,存储驱动等还有一定的限制,暂时还不能完全取代 “Rootful” Docker。关于 Docker Rootless 的详细信息参见 Docker 官方文档 [ Run the Docker daemon as a non-root user (Rootless mode)] (https://docs.docker.com/engine/security/rootless/#limiting-resources)

Rootless 模式利用 user namespaces 将容器中的 root 用户和 Docker 守护进程(dockerd)用户映射到宿主机的非特权用户范围内。Docker 此前已经提供了 --userns-remap 标志支持了相关能力,提升了容器的安全隔离性。Rootless 模式在此之上,让 Docker 守护进程也运行在重映射的用户名空间中。

f51e292b61c003a2bd1fe5403b9dfeaf.png

实践验证

环境准备

本文使用 Centos 7.5 操作系统的虚拟机进行实验。

[root@demo ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

创建用户

useradd rootless
echo 123456 | passwd rootless --stdin

安装依赖

Rootless 模式可以在没有 root 权限的情况下运行 Docker 守护进程和容器, 但是需要安装 newuidmapnewgidmap 工具,以便在用户命名空间下创建从属(subordinate)用户和组的映射(remapping)。通过以下命令安装 newuidmap 和 newgidmap 工具。

cat <<EOF | sudo sh -x
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
yum install -y shadow-utils46-newxidmap
cat <<EOT >/etc/sysctl.conf
user.max_user_namespaces = 28633
EOT
sysctl --system
EOF

UID/GID 映射配置

从属用户和组的映射由两个配置文件来控制,分别是 /etc/subuid 和 /etc/subgid。使用以下命令为 rootless 用户设置 65536 个从属用户和组的映射。

echo "rootless:100000:65536" | tee /etc/subuid
echo "rootless:100000:65536" | tee /etc/subgid

对于 subuid,这一行记录的含义为:用户 rootless,在当前的 user namespace 中具有 65536 个从属用户,用户 ID 为 100000-165535,在一个子 user namespace 中,这些从属用户被映射成 ID 为 0-65535 的用户。subgid 的含义和 subuid 相同。

比如说用户 rootless 在宿主机上只是一个具有普通权限的用户。我们可以把他的一个从属 ID (比如 100000 )分配给容器所属的 user namespace,并把 ID 100000 映射到该 user namespace 中的 uid 0。此时即便容器中的进程具有 root 权限,但也仅仅是在容器所在的 user namespace 中,一旦到了宿主机中,顶多也就有 rootless 用户的权限而已。

安装 Rootless Docker

切换到 rootless 用户。

su - rootless

执行以下命令安装 Rootless Docker。

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

安装成功后显示如下内容。

2f322e450a95802249a6086cbb0beb4f.png

将以下内容添加到 ~/.bashrc 文件中,添加完以后使用 source ~/.bashrc 命令使环境变量生效。

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

启动 Docker 守护进程

使用以下命令启动 Docker 守护进程。

dockerd-rootless.sh

运行容器

使用以下命令启动一个 nginx 容器,并将 80 端口映射到宿主机的 8080 端口。

docker run -d -p 8080:80 nginx

查看容器。

[rootless@demo ~]$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
f3b204c97a84   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   bold_stonebraker

访问容器。

[rootless@demo ~]$ curl http://localhost:8080

# 返回结果 Nginx 欢迎界面
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

参考资料

  • [容器安全拾遗 - Rootless Container初探] (https://developer.aliyun.com/article/700923)

  • [Run the Docker daemon as a non-root user (Rootless mode)] (https://docs.docker.com/engine/security/rootless/)

  • [Experimenting with Rootless Docker] (https://medium.com/@tonistiigi/experimenting-with-rootless-docker-416c9ad8c0d6)

  • [浅谈Docker的安全性支持(下篇)] (http://blog.itpub.net/31559359/viewspace-2645966/)

  • [ Docker v20.10 核心功能介绍和实践] (https://mp.weixin.qq.com/s/iMF211vWL722Wqxw9mRf7A)

  • [shadow-utils-newxidmap] (https://copr.fedorainfracloud.org/coprs/vbatts/shadow-utils-newxidmap/)

  • [Hardening Docker Daemon with Rootless Mode] (https://www.youtube.com/watch?v=uWURUtqLiqQ)

  • [Linux Namespace : User] (https://www.cnblogs.com/sparkdev/p/9462838.html)

  • [理解 docker 容器中的 uid 和 gid] (https://www.cnblogs.com/sparkdev/p/9614164.html)

  • [隔离 docker 容器中的用户] (https://www.cnblogs.com/sparkdev/p/9614326.html)

本文转载自:「Se7en的架构笔记」,原文:https://url.hi-linux.com/l4JGg,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

4bc2d0aab761eb16874b702c7c99eff0.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

7a065f631c347cb52503c4105a15eca0.png

你可能还喜欢

点击下方图片即可阅读

8ce70e1f02d2b734ecd9a35c680dda7c.png

如何优雅的抛弃 CentOS 7

34fcf4a4d35dc6814be47405ce7e8b6b.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

503c2578e080066cd3e0a3a4441d4fde.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>