83

如果我在特权模式下运行容器,它是否具有所有内核功能,还是我需要单独添加它们?

4

3 回答 3

87

在特权模式下运行确实为容器提供了所有功能。但始终为容器提供所需的最低要求是一种很好的做法。

Docker 运行命令文档引用了这个标志:

完整的容器功能(--privileged)

--privileged 标志为容器提供了所有功能,它还解除了设备 cgroup 控制器实施的所有限制。换句话说,容器几乎可以做主机可以做的所有事情。存在此标志以允许特殊用例,例如在 Docker 中运行 Docker。

--cap-add您可以使用标志提供特定功能。有关这些功能的更多信息,请参阅man 7 capabilities。可以使用文字名称,例如--cap-add CAP_FOWNER.

于 2016-04-06T04:36:43.430 回答
62

你永远不想使用--privileged.

我在有 NVMe 驱动器的笔记本电脑上执行此操作,但它适用于任何主机:

docker run --privileged -t -i --rm ubuntu:latest bash

首先让我们做点小事,测试 /proc 文件系统

从容器:

root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60
root@507aeb767c7e:/# echo "61" > /proc/sys/vm/swappiness    
root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60

好的,它是为容器还是为主机更改它?

$ cat /proc/sys/vm/swappiness
61

哎呀!我们可以任意改变hosts内核参数。但这只是DOS情况,让我们看看我们是否可以从父主机收集特权信息。

让我们遍历/sys树并找到引导磁盘的主要次要编号。

注意:我有两个 NVMe 驱动器,容器在另一个驱动器上的 LVM 下运行

root@507aeb767c7e:/proc# cat /sys/block/nvme1n1/dev
259:2

好的,让我们在 dbus 规则不会自动扫描的位置创建一个设备文件:

root@507aeb767c7e:/proc# mknod /devnvme1n1 b 259 2
root@507aeb767c7e:/proc# sfdisk -d /devnvme1n1 
label: gpt
label-id: 1BE1DF1D-3523-4F22-B22A-29FEF19F019E
device: /devnvme1n1
unit: sectors
first-lba: 34
last-lba: 2000409230
<SNIP>

好的,我们可以读取引导盘,让我们为其中一个分区制作一个设备文件。虽然我们无法挂载它,因为它将打开,我们仍然可以使用dd它来复制它。

root@507aeb767c7e:/proc# mknod /devnvme1n1p1 b 259 3
root@507aeb767c7e:/# dd if=devnvme1n1p1 of=foo.img
532480+0 records in
532480+0 records out
272629760 bytes (273 MB, 260 MiB) copied, 0.74277 s, 367 MB/s

好的,让我们安装它,看看我们的努力是否奏效!!!

root@507aeb767c7e:/# mount -o loop foo.img /foo
root@507aeb767c7e:/# ls foo
EFI
root@507aeb767c7e:/# ls foo/EFI/
Boot  Microsoft  ubuntu

因此,基本上,您允许任何人在其上启动--privileged容器的任何容器主机都与授予他们对该主机上每个容器的 root 访问权限相同。

不幸的是,Docker 项目选择了受信任的计算模型,并且在 auth 插件之外没有办法防止这种情况发生,所以总是在添加所需功能而不是使用--privileged.

于 2017-05-21T19:31:22.107 回答
5

RedHat有一篇很好的文章对此进行了介绍

虽然以“root”身份运行的 docker 容器在主机上的权限低于 root,但根据您的用例(用作开发环境与共享生产集群),它仍可能需要强化。

于 2016-04-05T17:20:31.597 回答