linux capability机制将root特权拆分为独立能力单元,通过permitted(许可集)、effective(有效集)、inheritable(可继承集)三组位图控制线程级权限,支持文件绑定(setcap)、运行时调整(capset/capsh)及最小权限继承。

Linux Capability机制的核心作用,就是把原本只有root才能做的系统调用操作,拆成一个个独立的“能力单元”,让普通进程按需获取、精准启用。它不靠UID切换,而是直接控制内核对特定特权操作的放行条件。
理解三个关键能力集合的作用
每个线程(不是整个进程)都维护三组能力位图,它们共同决定权限行为:
- Permitted(许可集):能力的“天花板”。进程能拥有的最大范围,不能自己添加,只能从文件能力或父进程继承中获得;执行任何特权操作前,对应能力必须先在这里存在。
- Effective(有效集):内核做权限检查时唯一查看的对象。哪怕Permitted里有CAP_NET_BIND_SERVICE,如果Effective里没开,绑定80端口仍会失败。
- Inheritable(可继承集):只在execve()启动新程序时起作用。它和可执行文件自身的cap_inheritable位取交集,决定哪些能力能传给子进程——这是实现父子权限隔离的关键。
用setcap给文件赋予指定能力
能力是绑定在可执行文件上的元数据,不是运行时临时加的。常用操作如下:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 允许普通用户绑定1024以下端口:sudo setcap cap_net_bind_service=+ep /usr/local/bin/myserver
- 只允许继承、不立即生效(常配合子进程使用):sudo setcap cap_net_raw=i /usr/local/bin/packet-tool
- 同时设多个能力,用逗号分隔:sudo setcap cap_sys_admin,cap_dac_override=+ep /usr/local/bin/backup-tool
- 查看是否设置成功:getcap /usr/local/bin/myserver,输出类似 /usr/local/bin/myserver = cap_net_bind_service+ep
运行时动态调整线程能力
程序启动后,可通过系统调用精细开关能力,避免全程持有高权:
- C语言中调用capget()读取当前能力,capset()修改Effective位(需已在Permitted中)
- 命令行快速测试:capsh --drop=cap_sys_admin -- -c "whoami",临时去掉某能力再执行命令
- 启动带能力的shell:capsh --inh=cap_net_raw --caps="cap_net_raw+eip" -- -c "/bin/bash",此时bash线程的Inheritable和Effective都含cap_net_raw
结合Inheritable实现最小权限传递
这是生产环境最实用的一环:主进程高权监听,工作子进程只继承必要能力。
- 主程序以cap_net_admin+i启动,子进程exec一个网络工具时,该工具自身也要有cap_net_admin=i(或i位全开),子进程Permitted才会包含此能力
- 若子程序文件没设i位,即使父进程Inheritable里有,也无法传递——能力不会凭空生成
- 推荐组合:父进程 setcap ...=i + 子程序 setcap ...=eip,确保父控继承、子控执行










