--privileged 到底多“特权”?这篇把默认容器、--privileged 和只加 SYS_ADMIN 放在一起,对比 capability、seccomp、设备、/proc/sys 与 /sys 的挂载,并验证特权容器能读到虚拟机的磁盘设备。
默认:
capability 14 个(不含 sys_admin,不含 sys_module,不含 sys_rawio)
NoNewPrivs: 0 Seccomp: 2
/dev 条目数 15;块设备 0
/proc/sys 有单独的挂载,选项:ro
/sys 挂载选项:ro
mount -t tmpfs 退出码 1:mount: permission denied (are you root?)
--privileged:
capability 41 个(含 sys_admin,含 sys_module,含 sys_rawio)
NoNewPrivs: 0 Seccomp: 0
/dev 条目数 169;块设备 12
/proc/sys 没有单独的挂载(随 /proc:rw)
/sys 挂载选项:rw
mount -t tmpfs 退出码 0:--privileged 同时放开多件事:全部 capability、关掉 seccomp、把宿主的设备都放进 /dev、/proc/sys 与 /sys 变成可写,docker inspect 里还多了 label=disable。我没有逐项测 AppArmor / SELinux。
--cap-add SYS_ADMIN:
capability 15 个(含 sys_admin,不含 sys_module,不含 sys_rawio)
NoNewPrivs: 0 Seccomp: 2
/dev 条目数 15;块设备 0
/proc/sys 有单独的挂载,选项:ro
/sys 挂载选项:ro
mount -t tmpfs 退出码 0:只加 SYS_ADMIN 就已经能 mount,但 seccomp、/dev、/proc/sys 的限制仍在。能用单个 capability 或 --device 解决的需求,不要上 --privileged。
--privileged:/dev/vd* = vda vda1 vdb;读 /dev/vda1 偏移 1080 处的 2 个字节 = 53 ef(ext4 超级块的魔数是 53 ef) 默认:/dev/vd* = 不存在;/dev/vda1:不存在
特权容器里能看到虚拟机的磁盘设备,读到了 ext4 的魔数。我只读了 2 个字节;至于在特权容器里能对虚拟机做多少事,我没有做更多实验。我在这个系列里用它的唯一目的是读取虚拟机里的信息,没有改动任何东西。
HostConfig.Privileged = true;CapAdd = [];SecurityOpt = [label=disable]
HostConfig.Privileged 是 true,而 CapAdd 是空的:特权不是靠一个个 CapAdd 实现的。