特权容器意味着什么
--privileged 会给容器近乎宿主 root 的能力:放开全部 capabilities、允许访问所有设备、关闭默认的 seccomp 与 AppArmor 约束,并可与内核接口交互。它只应该用在明确受控且有硬性需求的场景。多数需求其实可以换成按需放权:加单项能力、指定具体设备、精确放开某条安全策略。
基本信息
| 风险面 | 全部 capabilities、设备访问、默认安全策略被关闭 |
|---|---|
| 替代做法 | --cap-add 单项 / --device 指定设备 / --security-opt 精确放开 |
| 检查方式 | docker inspect 的 HostConfig.Privileged 字段 |
| 影响范围 | 可读写宿主设备与内核接口,等同宿主机高权限 |
| 适用平台 | Docker Engine(Linux 宿主) |
典型使用场景
- 容器内运行网络诊断工具,需要操作网络栈
- 需要访问特定设备:GPU、串口、tun 设备
- 做文件系统相关操作的运维容器
- 排查非特权容器的 operation not permitted,定位缺哪项能力
- 审计存量容器,找出不必要的高权限配置
审计与按需放权
审计与按需放权
# 审计运行中容器的特权情况
docker ps -q | xargs -r docker inspect -f '{{.Name}} privileged={{.HostConfig.Privileged}}'
# 先拆解需求,再逐项放开而不是整体开特权
docker run --rm --cap-add=NET_ADMIN --device=/dev/net/tun alpine true
docker run --rm --cap-add=SYS_ADMIN alpine true # 按单项能力验证
docker inspect -f '{{.HostConfig.Privileged}} {{.HostConfig.CapAdd}}' 容器名两种做法对照
| 维度 | --privileged | 按需放权 |
|---|---|---|
| 能力集 | 全部 capabilities | --cap-add 单项或几项 |
| 设备访问 | 全部设备 | --device 指定路径 |
| 安全策略 | seccomp 与 AppArmor 默认约束被关闭 | 保留默认约束,必要时精确放开 |
| 适用场景 | 内核级操作、受控调试 | 绝大多数生产负载 |
能说清「为什么需要特权、具体需要哪些能力」,通常就已经能把配置缩到按需放权,这一步比直接开特权更有价值。
特权容器如果还挂载了宿主目录,容器内的写入会直接作用在宿主文件系统上,操作窗口与审计要求要相应收紧。
特权开关属于创建时参数,只能通过停旧容器、建新容器来收敛,热改配置不会生效。