特权容器指什么
特权容器指运行时把容器几乎当宿主机 root 对待的配置。--privileged 会放开全部能力、设备访问与部分内核接口;--pid=host、--ipc=host、--network=host 与单独添加 CAP_SYS_ADMIN、CAP_SYS_PTRACE 等高危能力,也会明显缩小容器与宿主之间的隔离边界。这类配置不必然等于漏洞,但属于高影响配置:要么有明确业务理由并登记,要么收敛掉。
基本信息
| 适用平台 | Docker、containerd,Kubernetes 对应 privileged、hostPID、hostNetwork |
|---|---|
| 高危参数 | --privileged、--pid=host、--ipc=host、--network=host、--cap-add SYS_ADMIN 或 SYS_PTRACE |
| 等效风险 | 挂载 /var/run/docker.sock、挂载宿主根目录或设备文件 |
| 影响 | 容器被突破后可直接操作宿主机与同宿主其他容器 |
| 加固配套 | --read-only 只读根文件系统、no-new-privileges、非 root 运行 |
| 检查手段 | docker inspect、kubectl get pod -o yaml 批量盘点 |
| 管理要求 | 纳入变更评审与配置清单,定期复核业务理由 |
参数与风险
| 参数 | 风险 | 替代做法 |
|---|---|---|
| --privileged | 放开全部能力与设备访问 | 改用最小能力集,逐项申请 |
| --cap-add SYS_ADMIN | 可挂载文件系统、调整内核参数 | 评估真实需求后按需添加 |
| --cap-add SYS_PTRACE | 可调试与读取其他进程内存 | 只给必要的调试场景 |
| --pid=host | 容器内可见宿主机全部进程 | 用默认命名空间,配合进程审计 |
| --network=host | 共享宿主网络栈,绕过网络隔离 | 用端口映射或 CNI 网络 |
| 挂载 docker.sock | 等于获得宿主机容器控制权 | 改用受限的 API 代理 |
风险参数检查
风险参数检查
# Docker:单容器检查
docker inspect <容器名> --format '{{.HostConfig.Privileged}}'
docker inspect <容器名> --format '{{.HostConfig.CapAdd}}'
# 输出 true 或包含 SYS_ADMIN、SYS_PTRACE,需要业务方给出理由
# 批量盘点宿主机上的特权容器
docker ps -q | xargs -I{} docker inspect {} --format '{{.Name}} {{.HostConfig.Privileged}}'
# Kubernetes:查看各命名空间的特权与 hostNetwork 配置
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.hostNetwork}{"\n"}{end}'收敛建议
收敛建议
默认不加特权,按需最小化能力:
--cap-drop ALL 之后再 --cap-add 具体能力,逐项写清用途
禁止 --pid=host、--ipc=host,除非有明确场景并通过评审
用只读根文件系统 --read-only 与 no-new-privileges 加固
容器内进程以非 root 用户运行,避免 UID 0 直接映射
用准入控制(如 Pod Security)阻止未评审的特权工作负载典型使用场景
- 季度容器资产盘点,确认哪些容器持 privileged 或高危能力
- 新服务上线评审时核对运行时参数
- 应急排查:定位可疑容器与其挂载的宿主路径
- 迁移上云或更换运行时后的基线复核
- 演练中验证容器逃逸路径是否已被收敛
- 审计举证:说明每项高危能力的业务理由与复核时间
特权容器不是必然漏洞,但属于高影响配置。管理动作是:评审、登记、定期复核;临时为排障加的参数要在问题解决后回收。
挂载 /var/run/docker.sock 的效果接近特权:容器内进程可以创建新容器并挂载宿主目录,等于间接获得宿主机控制权,排查时不要只看 privileged 字段。