--cap-add是唯一安全可控方式,可精准授予如net_bind_service等特定内核能力,避免--privileged全权开放引发的宿主机失控风险;必须配合--cap-drop=all白名单式最小授权,并通过/proc/self/status验证生效能力。

直接给结论:用 --cap-add 是唯一安全、可控的方式,让容器执行特定特权操作(比如绑定 80 端口),而不用开 --privileged 或全程跑 root。
为什么不能直接用 --privileged?
--privileged 相当于把整个内核能力表全塞给容器,包括 SYS_MODULE(加载内核模块)、SYS_ADMIN(挂载任意文件系统)、DAC_OVERRIDE(绕过所有文件权限)——这些在生产环境等于主动交出宿主机控制权。
常见错误现象:容器能 modprobe、能 mount /dev/sda1、甚至能读 /etc/shadow,但业务根本不需要这些。
真正需要的,只是某几个具体能力,比如:
-
CAP_NET_BIND_SERVICE:只为了监听 80/443 端口 -
CAP_SYS_TIME:仅用于 NTP 同步服务(注意:必须配合时钟源校验) -
CAP_IPC_LOCK:只为锁定内存防止 swap(如 Redis 的maxmemory-policy noeviction场景)
cap-add 和 cap-drop 必须配对使用
单独加能力不等于最小权限。Docker 默认启用约 14 个基础能力(如 CAP_CHOWN、CAP_FSETID),但其中很多你并不需要。
正确姿势是先清空,再白名单式添加:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE --cap-add=CHOWN --cap-add=DAC_OVERRIDE nginx
这个命令的实际效果是:只保留 NET_BIND_SERVICE 及其依赖的两个底层能力(否则 nginx 进程连配置文件都改不了权限),其他一律禁用。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
容易踩的坑:
-
--cap-drop=ALL后没补CAP_CHOWN→ 容器启动失败,报错Operation not permitted(尝试 chown 配置目录时) - 加了
CAP_SYS_ADMIN却没意识到它覆盖了 50+ 子功能(包括mount、umount、setns),等同于半 privileged - 在
docker-compose.yml里写成cap_add: ["NET_BIND_SERVICE"],但忘了cap_drop: ["ALL"],结果默认能力还在
如何验证容器里到底有哪些能力生效?
进容器后别猜,直接看内核暴露的位图:
cat /proc/self/status | grep CapEff
输出类似 CapEff: 00000000a80425fb,这是十六进制位图。要确认 NET_BIND_SERVICE 是否在其中,得查它对应第几位(CAP_NET_BIND_SERVICE = 10,即从 0 开始数第 10 位),然后换算:1
更省事的办法是装 libcap 工具:
apt-get update && apt-get install -y libcap2-bin<br>capsh --print
输出里 Current: = cap_net_bind_service+ep 就表示已生效且处于 effective 状态。
调试关键点:
- 报错
Permission denied时,先用strace -e trace=bind看是不是 bind 系统调用失败 - 如果是,立刻查 man 7 capabilities,确认对应 capability 名称(比如 bind 低端口 →
NET_BIND_SERVICE) - 临时加
--cap-add=ALL验证是否为能力缺失问题,但验证完必须删掉
哪些 cap-add 绝对不该上生产?
以下能力一旦启用,攻击面会指数级扩大,除非有强审计和隔离措施,否则禁止出现在生产镜像或编排配置中:
-
SYS_MODULE:可加载恶意内核模块,直接逃逸到宿主机 -
SYS_PTRACE:能 attach 到任意进程(包括 docker daemon 自身),用于注入或窃取凭证 -
NET_ADMIN:可修改主机网络路由、iptables、甚至创建 veth 对连通宿主机网络命名空间 -
SYS_ADMIN:90% 的容器逃逸漏洞利用链都依赖它,不要心存侥幸
真正难的是权衡:比如监控 agent 需要 SYS_PTRACE 抓进程栈,那就得用 seccomp 白名单限制它只能 ptrace 自己子进程,而不是靠 cap-add 一放了之。










