Android系统的安全问题 - Linux的能力模型(Capability)和 SELinux 的区别
Linux 的能力模型(Capabilities)和 SELinux 是两种不同的安全机制,虽然它们都用于增强 Linux 系统的安全性,但它们的实现方式和目标有所不同。
1. Linux Capabilities(能力模型)
- 作用:传统的 Linux 权限模型是基于 root(超级用户)和普通用户的二元划分,而 Capabilities 将 root 的权限拆分为多个细粒度的权限单元(如
CAP_NET_ADMIN
、CAP_SYS_ADMIN
等),允许进程只获取必要的权限,而不是完整的 root 权限。 - 使用场景:
- 例如,
ping
命令需要CAP_NET_RAW
能力来发送 ICMP 包,但不需要完整的 root 权限。 - Docker/容器环境中,可以通过
--cap-add
或--cap-drop
控制容器的权限。
- 例如,
- 管理工具:
capsh
(查看和设置能力)setcap
(给文件设置能力)getcap
(查看文件的能力)
2. SELinux(Security-Enhanced Linux)
- 作用:SELinux 是一个 强制访问控制(MAC, Mandatory Access Control) 系统,基于安全策略(Policy)定义进程、文件、用户等之间的访问规则,比传统的 DAC(自主访问控制,如
chmod
)更严格。 - 核心概念:
- 标签(Label):每个进程、文件、端口等都有安全上下文(如
user_u:role_r:type_t
)。 - 策略(Policy):定义哪些主体(Subject,如进程)可以访问哪些对象(Object,如文件)。
- 标签(Label):每个进程、文件、端口等都有安全上下文(如
- 使用场景:
- 限制服务(如 Apache、Nginx)只能访问特定目录。
- 防止提权攻击,即使进程以 root 运行,SELinux 仍可限制其行为。
- 管理工具:
semanage
(管理策略)restorecon
(修复文件标签)audit2allow
(生成新规则)
3. 区别与联系
特性 | Capabilities | SELinux |
---|---|---|
权限控制方式 | 拆分 root 权限为细粒度能力 | 基于标签和策略的强制访问控制 |
目标 | 减少进程对 root 的依赖 | 限制进程和资源的交互 |
使用场景 | 特权进程的最小权限化 | 系统级安全隔离(如服务沙箱) |
依赖 | 内核支持 | 需要 SELinux 策略和标签系统 |
4. 它们可以同时使用
- 例如,一个进程可以:
- 通过 Capabilities 获得有限的权限(如
CAP_NET_BIND_SERVICE
绑定低端口)。 - 同时受 SELinux 策略限制,仅能访问特定文件或端口。
- 通过 Capabilities 获得有限的权限(如
5. 其他类似机制
- AppArmor:类似 SELinux 的 MAC 系统,但基于路径而非标签。
- Seccomp:限制进程可用的系统调用(如 Docker 使用它限制容器)。
总结
- Capabilities 是 权限细分 机制,解决 “root 权力过大” 的问题。
- SELinux 是 强制访问控制 机制,解决 “进程能访问哪些资源” 的问题。
- 两者互补,共同提升 Linux 安全性。