一尘不染

一个泊坞窗用户可以向另一个隐藏数据吗?

docker

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

系统管理员可以采取什么措施使Bob离开Alice的docker容器?

我认为这就是Alice应该根据命名的卷dockercp命令从容器中进出数据的方式。

$ 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,以便可以将文件复制到命名的卷中。该容器仅显示“确定”消息并退出。我复制输入文件,然后运行主要计算。在此示例中,它将输入复制到输出,并向其添加第二个时间戳。

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

有什么方法可以阻止Bob装载自己的容器,该容器装载了命名的卷并向其显示Alice的数据?我已经将Docker设置为使用用户名称空间,因此Alice和Bob没有对主机的根访问权限,但是我看不到如何使Alice和Bob使用不同的用户名称空间。


阅读 245

收藏
2020-06-17

共1个答案

一尘不染

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

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

用户命名空间

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

一个例子是

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

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

Docker守护程序

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

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

docker execdocker cpdocker export命令会给别人能够访问泊坞API创建的任何容器的内容。

限制Docker访问

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

docker通过sudo或提供sudo访问对docker参数进行硬编码的脚本的有限命令集:

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

对于自动化系统,可以通过附加的shim API提供访问权限,并在Docker
API之前添加适当的访问控制,然后将“受控”请求传递给Docker。dockerodedocker- py可以轻松插入REST服务并与Docker交互。

2020-06-17