用 Capabilities 限制 root——UID 是 0 也能只给一半权限
为什么还需要 Capabilities
传统 UNIX 把进程分为特权(UID 0)与非特权两类:特权进程绕过所有内核权限检查。但从 Linux 2.2 起,原本与超级用户绑定的特权被拆成一个个独立单元——Capabilities(权能),可以单独启用或禁用。
这解决了一个 UID/GID 解决不了的问题:有些 root 应用就是必须以 UID 0 运行(很多脚本和工具假定 UID 为 0),此时没法用 降级 UID 的办法收权。Capabilities 让你保持 UID 0 的同时只放行部分特权。
举例理解
每个 capability 对应一类权限,例如 CAP_DAC_READ_SEARCH 代表绕过文件读取权限检查的能力。一个 UID 为 0 的用户如果没有这个权能,即使它是 root 也不能随意读文件。
KernelSU 的 Root Profile 可以自定义 su 后进程的 capabilities 掩码:勾选的生效、没勾的禁用,实现「只授予部分 root 权限」。
实用建议
- 先读官方权能清单:Linux 手册页 capabilities(7) 对每项权能解释得非常详细,自定义前务必逐项确认含义——勾错一项可能让应用功能失效,多勾一项可能放走不该给的权限;
- 按需组合:比如只给「读文件 + 网络」两类权能,其余全部禁用,能满足多数监控类工具的需求;
- 与 UID/GID 配合:UID 能降级就优先降级,capabilities 用于「必须 UID 0」的场景,两者不冲突。
与 SELinux 的关系
Capabilities 是「这个进程能做哪类操作」,SELinux 是「这个进程能碰哪些对象」。两层规则叠加执行,任一层不放行都过不了。给受限 root 配 SELinux 域的方法见 SELinux 域与逃逸防范。