Alice和Bob都是同一主机上docker组的成员。爱丽丝想在Docker容器中运行一些长时间运行的计算,然后将结果复制到她的主文件夹中。鲍勃非常爱管闲事,爱丽丝不希望他能够读取她的计算所使用的数据。
系统管理员可以采取什么措施使Bob离开Alice的docker容器?
我认为这就是Alice应该根据命名的卷和dockercp命令从容器中进出数据的方式。
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,以便可以将文件复制到命名的卷中。该容器仅显示“确定”消息并退出。我复制输入文件,然后运行主要计算。在此示例中,它将输入复制到输出,并向其添加第二个时间戳。
input1.txt
sandbox1
run1
计算完成后,我复制输出文件,然后删除容器和命名的卷。
有什么方法可以阻止Bob装载自己的容器,该容器装载了命名的卷并向其显示Alice的数据?我已经将Docker设置为使用用户名称空间,因此Alice和Bob没有对主机的根访问权限,但是我看不到如何使Alice和Bob使用不同的用户名称空间。
通过在docker组中,Alice和Bob已被授予对主机的虚拟根访问权限。
docker
该docker组授予他们通过套接字文件访问Docker API的权限。Docker中目前没有工具可以区分Docker API的用户。Docker守护程序以root身份运行,并且借助Docker API的允许,Alice和Bob将能够解决您尝试设置的所有障碍。
使用用户名称空间隔离可以阻止容器 内 的用户以特权用户或其他用户身份脱离容器,因此实际上,容器进程现在以非特权用户身份运行。
一个例子是
由于用户现在仅位于容器内,因此他们将无法修改主机上的其他文件。假设两个容器都映射了相同的主机卷,那么没有世界范围的读/写/执行的文件对于彼此来说是安全的。由于他们无法控制守护程序,因此他们无能为力。
命名空间无法保护Docker守护进程和API本身,而Docker守护进程和API本身仍然是一个特权进程。解决用户名空间的第一种方法是在命令行上设置主机名称空间:
docker run --privileged --userns=host busybox fdisk -l
的docker exec,docker cp并docker export命令会给别人能够访问泊坞API创建的任何容器的内容。
docker exec
docker cp
docker export
可以限制对API的访问,但是您不能在docker组中拥有具有shell访问权限的用户。
docker通过sudo或提供sudo访问对docker参数进行硬编码的脚本的有限命令集:
sudo
#!/bin/sh docker run --userns=whom image command
对于自动化系统,可以通过附加的shim API提供访问权限,并在Docker API之前添加适当的访问控制,然后将“受控”请求传递给Docker。dockerode或docker- py可以轻松插入REST服务并与Docker交互。
dockerode
docker- py