docker - 一个 docker 用户可以隐藏另一个用户的数据吗?

标签 docker permissions

Alice 和 Bob 都是同一主机上 docker 组的成员。 Alice 想在 docker 容器中运行一些长时间运行的计算,然后将结果复制到她的主文件夹。 Bob 非常多管闲事,Alice 不希望他能够读取她的计算所使用的数据。

系统管理员有什么办法可以让 Bob 远离 Alice 的 docker 容器吗?

以下是我认为 Alice 应该如何根据 named volumes 将数据传入和传出她的容器和 docker cp command ,如 this question 中所述和 this one .

$ pwd
/home/alice
$ date > input1.txt
$ docker volume create sandbox1
sandbox1
$ docker run --name run1 -v sandbox1:/data alpine echo OK
OK
$ docker cp input1.txt run1:/data/input1.txt
$ docker run --rm -v sandbox1:/data alpine sh -c "cp /data/input1.txt /data/output1.txt && date >> /data/output1.txt"
$ docker cp run1:/data/output1.txt output1.txt
$ cat output1.txt
Thu Oct  5 16:35:30 PDT 2017
Thu Oct  5 23:36:32 UTC 2017
$ docker container rm run1
run1
$ docker volume rm sandbox1
sandbox1
$ 

我创建了一个输入文件 input1.txt 和一个命名卷 sandbox1。然后我启动一个名为 run1 的容器,这样我就可以将文件复制到指定的卷中。该容器只是打印一条“OK”消息并退出。我复制输入文件,然后运行主要计算。在此示例中,它将输入复制到输出并向其添加第二个时间戳。

计算完成后,我复制输出文件,然后删除容器和命名卷。

有什么方法可以阻止 Bob 加载他自己的容器,该容器安装了指定的卷并向他显示 Alice 的数据?我已将 Docker 设置为使用 a user namespace ,所以 Alice 和 Bob 没有主机的 root 访问权限,但我看不出如何让 Alice 和 Bob 使用不同的用户命名空间。

最佳答案

Alice 和 Bob 在 docker 组中被授予对主机的虚拟根访问权限。

docker 小组授予他们通过套接字文件访问 Docker API 的权限。目前 Docker 中没有区分 Docker API 用户的功能。 Docker 守护进程以 root 身份运行,并且凭借 Docker API 允许的功能,Alice 和 Bob 将能够绕过您确实尝试设置的任何障碍。

用户命名空间

使用user namespace isolation停止容器内部的用户以特权用户或其他用户身份脱离容器,因此实际上容器进程现在以非特权用户身份运行。

一个例子是

  • Alice 被授予 ssh 访问在 namespace_a 中运行的容器 A 的权限。
  • Bob 获得了对 namespace_b 中容器 B 的 ssh 访问权限。

因为用户现在只在容器内,他们将无法修改主机上的其他文件。假设两个容器都映射相同的主机卷,则没有世界读/写/执行的文件对于彼此的容器是安全的。由于他们无法控制守护进程,因此他们无能为力。

Docker 守护进程

命名空间不保护 Docker 守护进程和 API 本身,这仍然是一个特权进程。绕过用户 namespace 的第一种方法是在命令行上设置主机 namespace :

docker run --privileged --userns=host busybox fdisk -l

docker execdocker cpdocker export 命令将向有权访问 Docker API 的人提供任何已创建容器的内容。

限制 Docker 访问

可以限制对 API 的访问,但您不能在 docker 组中拥有具有 shell 访问权限的用户。

通过 sudo 允许一组有限的 docker 命令或提供 sudo 访问硬编码 docker 参数的脚本:

#!/bin/sh
docker run --userns=whom image command

对于自动化系统,可以通过在 Docker API 前面具有适当访问控制的附加填充 API 提供访问权限,然后将“受控”请求传递给 Docker。 dockerodedocker-py可以很容易地插入 REST 服务并与 Docker 接口(interface)。

关于docker - 一个 docker 用户可以隐藏另一个用户的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46596523/

相关文章:

mysql - 您能否将初始数据添加到 Docker 中的卷中,该卷在拉取时可用?

docker - 删除了 Kubernetes 部署但节点(docker)容器不断重新创建自己

用户输入的 Python 安全限制

android - 用户获取未包含在 list 中的权限请求

android - 从没有读/写权限的内部存储读取文件?

docker - 具有root权限在/docker-entrypoint-initdb.d下执行脚本

azure - Jenkins - 无法创建用户数据目录 :/var/lib/jenkins/snap/docker/: Read-only file system

docker - Pycharm Docker 端口绑定(bind)

已授予 Android 权限但仍被拒绝

php - 如何设置从 PHP 创建文件的最低权限