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



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

系统管理员能做些什么让Bob远离Alice的docker容器吗?

以下是我认为Alice应该如何根据命名卷和docker cp命令将数据进出她的容器,如本问题和本问题中所述。

$ 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设置为使用用户名称空间,所以Alice和Bob没有对主机的root访问权限,但我不知道如何让Alice和鲍勃使用不同的用户名称空间。

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

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

用户命名空间

用户命名空间隔离的使用阻止容器内的用户以特权用户或不同用户的身份脱离容器,因此实际上容器进程现在以非特权用户的身份运行。

就是一个例子

  • Alice可以通过ssh访问在namespace_A中运行的容器A
  • Bob可以通过ssh访问namespace_B中的容器B

因为用户现在只在容器内,他们将无法修改主机上的其他文件。假设两个容器都映射了同一个主机卷,那么没有全局读/写/执行的文件将对其他容器是安全的。由于他们无法控制守护进程,所以他们无法采取任何措施来爆发。

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

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

最新更新