允许非root用户使用一些Docker命令

允许非root用户使用一些Docker命令

我有一个用户restricted,该用户只能访问自己的文件。它是非 root 用户,因此无法使用 Docker(执行docker run foo=> docker: Got permission denied while trying to connect to the Docker daemon socket...)。

我想允许该用户仅从其文件空间创建自己的 Docker 映像,并且只能删除/rmi 自己制作的映像。此外,他们只能运行自己的映像并停止自己的映像容器。

从我读过的问题来看,发生这种情况的唯一方法是将 root 用户添加到非 root 用户所在的组中,这会带来巨大的漏洞风险。

答案1

从这里找到的优秀答案:

好消息:新版 docker(版本 19.03(目前为实验版))将能够以无根方式运行,从而消除使用 root 用户可能出现的问题。不再需要处理提升的权限、root 以及任何可能在您不想打开计算机时打开的东西。

关于此内容的视频来自[DockerCon 2019] 使用 Rootless 模式强化 Docker 守护进程

关于 rootless Docker 模式的一些注意事项

Docker 工程师表示,rootless 模式不能被视为 Docker 引擎全套功能的替代品。rootless 模式的一些限制包括:

  • cgroups 资源控制、apparmor 安全配置文件、检查点/恢复、覆盖网络等在无根模式下不起作用。
  • 从容器公开端口目前需要手动的 socat 帮助进程。
  • 仅基于 Ubuntu 的发行版支持无根模式下的覆盖文件系统。
  • 无根模式当前仅适用于夜间构建,可能不如您习惯的那么稳定。

从 docker 19.3 开始,这个已经过时了(并且比需要的更危险):

docker 手册对此有这样的看法:

授予非 root 访问权限

docker 守护进程始终以 root 用户身份运行,并且从 Docker 版本 0.5.2 开始,docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字由用户 root 拥有,因此,默认情况下,您可以使用 sudo 访问它。

从 0.5.3 版开始,如果您(或您的 Docker 安装程序)创建一个名为 docker 的 Unix 组并向其添加用户,则 docker 守护程序将在守护程序启动时使 Unix 套接字的所有权由 docker 组读取/写入。docker 守护程序必须始终以 root 用户身份运行,但如果您以 docker 组中的用户身份运行 docker 客户端,则无需向所有客户端命令添加 sudo。从 0.9.0 开始,您可以使用 -G 选项指定除 docker 之外的组应拥有 Unix 套接字。

警告:docker 组(或用 -G 指定的组)与 root 等效;请参阅Docker Daemon 攻击面详细信息以及这篇博文为什么我们不允许非 root 用户在 CentOS、Fedora 或 RHEL 中运行 Docker(感谢 michael-n)。

在最近发布的GitHub 上的实验性无根模式,工程师提到 rootless 模式允许以非特权用户身份运行 dockerd,使用 user_namespaces(7)、mount_namespaces(7)、network_namespaces(7)。

用户需要运行dockerd-rootless.sh而不是dockerd。

$ dockerd-rootless.sh --experimental

由于 Rootless 模式尚处于实验阶段,用户需要始终使用 –experimental 运行 dockerd-rootless.sh。


重要阅读:Linux 的安装后步骤(它还链接到Docker Daemon 攻击面详细信息)。

以非 root 用户身份管理 Docker

docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归 root 用户所有,其他用户只能使用 sudo 访问它。docker 守护进程始终以 root 用户身份运行。

如果您不想在使用 docker 命令时使用 sudo,请创建一个名为 docker 的 Unix 组并向其添加用户。当 docker 守护进程启动时,它会使 Unix 套接字的所有权由 docker 组读写。


  • 如果不存在,请添加 docker 组:

     sudo groupadd docker
    
  • 将连接的用户“$USER”添加到 docker 组。如果不想使用当前用户,请将用户名更改为您首选的用户:

     sudo gpasswd -a $USER docker
    
  • 执行newgrp docker或注销/登录以激活对组的更改。

  • 您可以使用

     docker run hello-world
    

    检查是否可以在不使用 sudo 的情况下运行 docker。

答案2

根据官方 Docker 文档

使用 Docker 运行容器(和应用程序)意味着运行 Docker 守护进程。除非您选择加入 Rootless 模式(实验性),否则此守护进程需要 root 权限...

此模式的说明可以在 GitHub 上找到:

https://github.com/docker/engine/blob/v19.03.0-rc3/docs/rootless.md

我想允许该用户仅从他们的文件空间创建他们自己的 Docker 映像,并且只能删除/rmi他们自己制作的映像。

如果你只是想构建容器,可以尝试使用img

独立、无守护进程、非特权 Dockerfile 和 OCI 兼容的容器映像构建器。

该工具可用于构建容器,无需权限即可运行默认情况下

此外,他们只能运行自己的图像并停止自己的图像容器。

不幸的是,如前所述,img无法运行容器,只能构建它们。

也可以看看:https://rootlesscontaine.rs

答案3

docker run foo => docker: Got permission denied while trying to connect to the Docker daemon socket...

好像是在创建套接字时没有为docker组授予足够的权限。错误一次又一次地出现,并且每次都重新执行命令。这确实很难chmod在每次重启后打开安全漏洞。

问题来自 SystemD,因为套接字只能使用 创建root:root。你可以使用以下命令进行检查:

ls -l /lib/systemd/system/docker.socket

如果这是好的,你应该看到这root:docker一点root:root

解决方案这个问题.你可以尝试做这个工作:

$sudo chgrp docker /lib/systemd/system/docker.socket
$sudo chmod g+w /lib/systemd/system/docker.socket
$sudo chmod 666 /var/run/docker.sock

如果您处于图形环境中并且可能是计算机上的唯一用户,则此操作应该有效。这种情况下需要重新启动。

希望这可以帮助。

答案4

以非 root 用户身份管理 Docker 默认情况下,Unix 套接字归用户 root 所有,其他用户只能使用 sudo 访问它。docker 守护进程始终以 root 用户身份运行。如果您在使用 docker 命令时不想使用 sudo,请创建一个名为 docker 的 Unix 组并向其中添加用户。

相关内容