bigywater.tech
Docker · 49

--privileged:它到底打开了什么

--privileged 到底多“特权”?这篇把默认容器、--privileged 和只加 SYS_ADMIN 放在一起,对比 capability、seccomp、设备、/proc/sys 与 /sys 的挂载,并验证特权容器能读到虚拟机的磁盘设备。

14 → 41
默认与 --privileged 的 capability 个数
15 → 169
/dev 里的条目数
53 ef
特权容器读 /dev/vda1 偏移 1080 处得到的 ext4 魔数(默认容器里这个设备不存在)

整套放开

实测 · 本机执行输出
  默认:
    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 个字节;至于在特权容器里能对虚拟机做多少事,我没有做更多实验。我在这个系列里用它的唯一目的是读取虚拟机里的信息,没有改动任何东西。

inspect 里的样子

实测 · 本机执行输出
  HostConfig.Privileged = true;CapAdd = [];SecurityOpt = [label=disable]

HostConfig.Privileged 是 true,而 CapAdd 是空的:特权不是靠一个个 CapAdd 实现的。

分步演示

特权模式
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。capability 来自 /proc/self/status 的 CapEff 解码(名字表同 c40);挂载和设备信息读自容器内的 /proc/mounts 与 /dev;读磁盘设备只读取偏移 1080 处的 2 个字节;每种配置运行一次;实验后已删除容器
    • 没有验证:AppArmor / SELinux 的差别、--device 单独放行设备、特权容器里挂载磁盘并读写(会修改虚拟机,不做)、Linux 宿主机上的 --privileged 范围、Docker-in-Docker(见后面的 DinD 一篇)
    京ICP备2026067502号-1京公网安备11010502063487号