应从--cap-drop=all起步,按需添加如cap_net_bind_service等必要能力;用strace定位eperm错误对应系统调用,再结合capsh --print验证,确保仅授予进程真实所需的能力。

直接从“最小能力起点”开始,而不是在默认权限上做减法。Linux Capabilities 的核心价值,是让进程只拥有它真正需要的那几个内核级操作许可,而非依赖 root 身份硬扛全部权限。
先确认进程真实需要哪些能力
别靠猜测,用行为反推。关键看它执行哪些系统调用时被拒绝:
- 启动时提示 Operation not permitted,且发生在
bind()上(端口 CAP_NET_BIND_SERVICE - 调用
clock_settime()失败 → 需要CAP_SYS_TIME -
mount()或umount()报错 → 先评估是否真需运行时挂载;多数场景可用--tmpfs或预绑定 volume 替代,避免引入CAP_SYS_ADMIN - 抓包工具(如 tcpdump)无法打开 raw socket → 查看
strace -e trace=socket,bind,setuid输出,通常只需CAP_NET_RAW,而非CAP_NET_ADMIN
用 setcap 精准“钉住”二进制文件
能力必须绑定到可执行文件本身,不是脚本、不是软链接:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 给 nginx 绑定低端口权限:
sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx - 只允许子进程继承(主进程不启用):
sudo setcap 'cap_net_raw=i' /usr/local/bin/sniffer - 验证是否生效:
getcap /usr/sbin/nginx应输出类似/usr/sbin/nginx = cap_net_bind_service+ep - 注意:若文件同时有 setuid 位(
ls -l显示s),capability 会被内核忽略,需先sudo chmod u-s
在 systemd 服务中做边界加固
即使服务以 User=root 启动,也能通过 unit 文件收缩实际权限范围:
- 明确禁止高危能力:
CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_MODULE CAP_SYS_PTRACE - 仅放行必需项:
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SYSLOG - 确保子进程能继承:
AmbientCapabilities=CAP_NET_BIND_SERVICE - 强制关闭提权通道:
NoNewPrivileges=true - 叠加文件系统防护:
ProtectSystem=full ProtectHome=true
规避高危 capability 的替代路径
某些能力风险极高,应优先考虑绕过,而非授予:
-
CAP_SYS_ADMIN:覆盖命名空间、挂载、设备管理等数十种操作。绝大多数容器或服务无需它——改用docker run --tmpfs /run --read-only,或由宿主机预置配置 -
CAP_NET_ADMIN:用于修改路由、iptables。网络策略应交由 CNI 插件或宿主机防火墙统一管控,容器内只负责收发 -
CAP_DAC_OVERRIDE:绕过文件读写权限。改为用chown初始化数据卷属主,或以匹配 UID/GID 的非 root 用户运行










