【问题标题】:Can one docker user hide data from another?一个 docker 用户可以隐藏另一个用户的数据吗?
【发布时间】:2018-03-17 17:11:15
【问题描述】:

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

系统管理员可以做些什么来让 Bob 远离 Alice 的 docker 容器?

根据named volumesdocker cp command,我认为Alice 应该如何从她的容器中获取数据,如this questionthis 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 使用不同的用户命名空间。

【问题讨论】:

    标签: docker permissions


    【解决方案1】:

    Alice 和 Bob 通过位于 docker 组中被授予对主机的虚拟 root 访问权限。

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

    用户命名空间

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

    一个例子是

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

    因为用户现在只在容器内,他们将无法在主机上修改彼此的文件。假设如果两个容器都映射了相同的主机卷,那么没有世界读/写/执行的文件将对彼此的容器是安全的。由于他们无法控制守护进程,因此他们无法采取任何措施来突破。

    Docker 守护进程

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

    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
    

    对于自动化系统,可以通过额外的 shim API 提供访问权限,该 API 在 Docker API 前面具有适当的访问控制,然后将“受控”请求传递给 Docker。 dockerodedocker-py 可以轻松插入 REST 服务并与 Docker 接口。

    【讨论】:

    • 感谢@Matt 提供的详细信息。您能否澄清您对用户命名空间隔离的评论?我的理解是,它允许您在容器内以 root 用户身份运行应用程序,而无需授予您对主机的 root 访问权限。例如,在已安装的卷上。这不是避免给 docker 组的成员对主机的 root 访问权限,还是他们可以在启动 docker 命令时覆盖用户命名空间?
    • 当用户在容器内时,用户命名空间的工作方式与此类似,但如果您尝试限制的用户拥有 Docker 本身的控制权,他们可以做任何事情。我在答案中进一步充实了这一点。
    • 感谢您提供更多详细信息。我在 Python 中写了一个wrapper,它创建一个卷、复制输入文件、运行请求的图像、复制输出文件和清理。然后我授予 Alice 和 Bob sudo 访问指定图像的包装器的权限。这应该让他们远离麻烦。
    • 酷!如果您厌倦了与 shell-isms 打交道,也可以使用 docker-py 直接对 API 执行 docker 命令
    • 哦,我知道我在重复自己了 =)
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2015-12-30
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多