Linux启用强制访问控制(MAC)的核心是进程仅能执行策略明确允许的操作,SELinux和AppArmor是内核LSM框架下两大主流实现;SELinux基于类型标签实现细粒度控制,默认拒绝、安全性高但配置复杂,AppArmor基于路径限制,语法直观、易于调试,适合快速部署。

Linux系统启用强制访问控制(MAC),核心是让进程只能做策略明确允许的事,而不是依赖用户或组权限去“自主决定”能否访问资源。SELinux 和 AppArmor 是内核级 LSM 框架下的两大主流实现,它们不互斥但通常只启用其一,选择取决于发行版默认和运维习惯。
SELinux:基于类型标签的细粒度控制
SELinux 为每个进程、文件、端口等分配安全上下文(如 system_u:object_r:httpd_exec_t:s0),策略规则基于主体类型与客体类型的匹配来放行或拒绝操作。默认拒绝原则使其防护能力强,但也带来配置复杂性。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 确认状态:运行 getenforce 查看当前模式(Enforcing/Permissive/Disabled);用 sestatus 获取完整信息
- 临时切换:用 setenforce 0 进入宽容模式调试,setenforce 1 恢复强制模式
- 永久生效:编辑 /etc/selinux/config,设置 SELINUX=enforcing 并重启
- 修复常见问题:当服务启动失败或文件访问被拒,先查 ausearch -m avc -ts recent 或 journalctl -t setroubleshoot,再用 audit2why 和 audit2allow 生成修复建议或自定义策略模块
AppArmor:基于路径的轻量级隔离
AppArmor 通过为可执行程序绑定配置文件(Profile)来限制其能访问的文件路径、网络端口和系统调用。它语法直观、易于调试,适合快速落地,尤其在 Debian/Ubuntu 系统中为默认 MAC 方案。
- 查看状态:运行 aa-status,确认是否加载、有多少 profile、哪些进程已启用
- 启用 profile:将配置文件(如 /etc/apparmor.d/usr.sbin.nginx)写好后,执行 sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
- 两种模式切换:用 sudo aa-complain /path/to/bin 进入抱怨模式收集行为日志;用 sudo aa-enforce /path/to/bin 切回强制模式
- 容器场景:Docker 默认使用 docker-default profile;若需强化,先在宿主机加载自定义 profile(如 my-java-app),再以 docker run --security-opt apparmor=my-java-app … 启动
选型与协同要点
SELinux 更适合高合规要求环境(如金融、政务),因其类型强制模型天然支持多级安全(MLS)和严格策略继承;AppArmor 更适合 DevOps 快速迭代场景,路径匹配逻辑贴近运维直觉,profile 可随应用打包分发。
- 不要同时启用两者并用于同一服务——可能引发策略冲突或不可预测拦截
- 无论选哪个,都应配合传统 DAC 权限(如文件属主、umask)、SSH 密钥认证、最小权限原则一起使用
- 容器环境中,MAC 是逃逸防护的关键一环:即使容器内进程获得 root 权限,也无法绕过 AppArmor profile 或 SELinux 类型约束访问宿主机敏感路径
- 策略不是一次配置就万事大吉:定期审查 /var/log/audit/audit.log(SELinux)或 /var/log/syslog(AppArmor complain 日志),根据实际运行行为优化 profile 或策略规则

















