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

时间:2017-10-06 00:13:51

标签: docker permissions

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

系统管理员可以做些什么来阻止Bob离开Alice的docker容器吗?

根据named volumesdocker cp command,我认为Alice应该如何根据this question和{{3}中的内容获取数据进出容器}。

$ 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设置为使用this one,因此Alice和Bob无权访问主机,但我无法看到如何让Alice和Bob使用不同的用户名称空间

1 个答案:

答案 0 :(得分:2)

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 Daemon

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

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

docker execdocker cpdocker export命令可以让访问Docker API的人拥有所有已创建容器的内容。

限制Docker访问

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

通过docker允许一组有限的sudo命令,或者提供sudo对硬编码泊坞号参数的脚本的访问权限:

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

对于自动化系统,可以通过附加的填充程序API提供访问,并在Docker API前面提供适当的访问控制,然后将“受控”请求传递给Docker。 dockerodedocker-py可以轻松插入到REST服务和Docker接口中。