Linux SELinux 与 AppArmor 对比
概览 两者都是 Linux 内核的 LSM(Linux Security Modules) 强制访问控制(MAC)机制,用来在进程与系统对象之间实施最小权限。差异核心在于:SELinux 以标签/类型(inode 为基础)实施细粒度策略,功能强大但复杂度高;AppArmor 以路径为中心,策略更直观、上手更快,适合快速为应用编写与部署配置文件。
关键差异对比
| 维度 | SELinux | AppArmor |
|---|---|---|
| 安全标签与识别 | 给进程与客体打安全上下文/类型(基于 inode),跨重命名、硬链接等保持稳定 | 以文件路径识别客体,策略直观 |
| 策略模型与粒度 | 基于域(domain)-类型(type),可精细到进程、文件、端口、能力等多类客体 | 围绕应用 profile声明允许的路径、能力、网络等,粒度相对更贴近应用 |
| 规则与编译 | 策略/规则体系复杂,常见需工具链与策略模块管理 | 规则无需编译,文本 profile 直接加载 |
| 文件系统依赖 | 需要支持安全标签/扩展属性的文件系统 | 文件系统无关,对 NFS 等场景更友好 |
| 默认与发行版 | RHEL/CentOS/Fedora 默认启用 | SUSE/openSUSE、Ubuntu 常见默认启用 |
| 模式与运维 | 三种模式:Enforcing/Permissive/Disabled;排错常用 getenforce/setenforce、semanage、restorecon、audit2allow |
两种模式:Enforcing/Complain;排错常用 apparmor_status、aa-enforce/aa-complain、aa-genprof、aa-unconfined |
| 典型排错 | 查看 AVC 拒绝日志,修正类型/端口/上下文(如 semanage port、restorecon) |
查看 complain 日志,生成/调整 profile(如 aa-genprof) |
| 上手难度 | 学习曲线更陡,但上限高、可覆盖复杂场景 | 更易上手,适合快速落地常见服务 |
以上对比要点来自对两者工作机制、命令与发行版默认策略的综合梳理。
如何选择
常用命令与最小上手示例
getenforce、setenforce 0|1semanage port -l | grep ssh、semanage port -m -t ssh_port_t -p tcp 9999ls -Z、ps -Z、restorecon -R /var/wwwaudit2allow 生成模块apparmor_status、aa-enforce <profile>、aa-complain <profile>aa-genprof <cmd>、aa-unconfined