Linux Capability 解析
文章目录
- 1. 权限模型演进背景
- 2. Capability核心原理
- 2.1 能力单元分类
- 2.2 进程三集合
- 2.3 文件系统属性
- 3. 完整能力单元表
- 4. 高级应用场景
- 4.1 能力边界控制
- 4.2 编程控制
- 4.3 容器安全
- 5. 安全实践建议
- 6. 潜在风险提示
1. 权限模型演进背景
在传统UNIX权限模型中,采用二进制特权划分(普通用户 vs root用户)存在显著缺陷:
- 权限颗粒度过粗
- 特权程序攻击面过大
- 特权继承难以控制
Linux Capability机制应运而生(始于2.2内核),实现:
- 特权操作的细粒度划分
- 动态权限分配与控制
- 最小特权原则实施
2. Capability核心原理
2.1 能力单元分类
将root特权分解为独立能力单元,每个单元对应特定操作权限(当前内核6.x共41项)
2.2 进程三集合
集合类型 | 作用描述 | 特性 |
---|---|---|
Permitted | 能力允许的最大集合 | 静态上限,不可自增 |
Effective | 当前实际生效的能力 | 运行时动态切换 |
Inheritable | 可被子进程继承的能力 | 影响exec执行时的能力转移 |
2.3 文件系统属性
通过扩展属性存储执行时的能力分配策略:
- setuid程序特权执行时的能力赋值规则
- 二进制文件的能力白名单定义
3. 完整能力单元表
能力名称 | 内核版本 | 权限描述 |
---|---|---|
CAP_AUDIT_CONTROL | 2.6.11+ | 配置审计子系统 |
CAP_AUDIT_READ | 3.16+ | 读取审计日志(RAW/非翻译格式) |
CAP_AUDIT_WRITE | 2.6.11+ | 生成审计日志记录 |
CAP_BLOCK_SUSPEND | 3.5+ | 阻止系统挂起(epoll系统调用) |
CAP_BPF | 5.8+ | 管理BPF程序和映射 |
CAP_CHECKPOINT_RESTORE | 5.9+ | 内核checkpoint/restore操作 |
CAP_CHOWN | 2.2+ | 任意文件属主修改 |
CAP_DAC_OVERRIDE | 2.2+ | 绕过文件读、写、执行权限检查 |
CAP_DAC_READ_SEARCH | 2.2+ | 绕过目录读/搜索权限检查 |
CAP_FOWNER | 2.2+ | 忽略文件属主检查(如chmod操作) |
CAP_FSETID | 2.2+ | 设置setuid/setgid时保留位 |
CAP_IPC_LOCK | 2.2+ | 锁定内存(mlock/mlockall) |
CAP_IPC_OWNER | 2.2+ | 绕过IPC所有权检查 |
CAP_KILL | 2.2+ | 绕过信号发送权限检查 |
CAP_LEASE | 2.4+ | 建立文件租约(fcntl F_SETLEASE) |
CAP_LINUX_IMMUTABLE | 2.2+ | 设置FS_IMMUTABLE和FS_APPEND_FL属性 |
CAP_MAC_ADMIN | 2.6.25+ | 配置MAC策略(SELinux/SMACK等) |
CAP_MAC_OVERRIDE | 2.6.25+ | 覆盖强制访问控制(MAC) |
CAP_MKNOD | 2.4+ | 创建设备特殊文件(mknod) |
CAP_NET_ADMIN | 2.2+ | 网络配置(接口、防火墙、QoS等) |
CAP_NET_BIND_SERVICE | 2.2+ | 绑定低端口(<1024) |
CAP_NET_BROADCAST | 2.2+ | 网络广播、组播操作 |
CAP_NET_RAW | 2.2+ | RAW/PACKET套接字操作 |
CAP_PERFMON | 5.8+ | 系统性能监控与观察 |
CAP_SYS_ADMIN | 2.2+ | 系统管理操作(挂载、ns操作、swapon等) |
CAP_SYS_BOOT | 2.2+ | 触发系统重启(reboot) |
CAP_SYS_CHROOT | 2.2+ | 使用chroot()系统调用 |
CAP_SYS_MODULE | 2.2+ | 加载/卸载内核模块 |
CAP_SYS_NICE | 2.2+ | 提升进程nice值,修改调度策略 |
CAP_SYS_PACCT | 2.4+ | 配置进程记账(acct) |
CAP_SYS_PTRACE | 2.4+ | ptrace调试任意进程 |
CAP_SYS_RAWIO | 2.2+ | 直接端口访问(ioperm/iopl)和内存操作 |
CAP_SYS_RESOURCE | 2.2+ | 覆盖资源限制(如Disk quota) |
CAP_SYS_TIME | 2.2+ | 修改系统时钟/硬件时钟 |
CAP_SYS_TTY_CONFIG | 2.6.4+ | 虚拟终端配置(vhangup) |
CAP_SYSLOG | 2.6.37+ | 特权syslog操作(kernel printk速率限制等) |
CAP_WAKE_ALARM | 3.11+ | 设置唤醒定时器(RTC唤醒) |
注:统计截至Linux 6.4内核版本,能力定义位于
include/uapi/linux/capability.h
4. 高级应用场景
4.1 能力边界控制
# 授予Nginx绑定低端口特权
setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx# 查看二进制文件能力
getcap /usr/sbin/nginx
4.2 编程控制
#include <sys/capability.h>
// 动态放弃能力
cap_t caps = cap_get_proc();
cap_clear_flag(caps, CAP_EFFECTIVE);
cap_set_flag(caps, CAP_PERMITTED, CAP_NET_RAW, CAP_CLEAR);
cap_set_proc(caps);
cap_free(caps);
4.3 容器安全
# 仅允许容器修改系统时间
docker run --cap-drop ALL --cap-add SYS_TIME -it alpine
5. 安全实践建议
最小权限原则
仅授予必要的能力集,通过 capsh --drop=XXX 启动进程
文件能力审查
定期使用 getcap -r / 检查全盘文件能力设置
运行时监控
结合 /proc/[pid]/status 中的CapEff/CapPrm/CapInh字段监控进程能力
命名空间隔离
结合user/network/mount等namespace限制能力作用域
审计系统集成
监控 CAP_AUDIT_* 相关能力的异常使用
6. 潜在风险提示
不可撤销特权
部分能力一旦获取无法主动放弃(如CAP_SYS_MODULE)
隐式权限提升
某些系统调用可能隐含多个能力需求
组合攻击向量
看似无关的两个能力组合可能产生提权风险
内核版本差异
新能力在不同发行版中的支持情况需精确验证