Linux SELinux的工作原理是什么
小樊
38
2025-12-12 07:20:45
Linux SELinux 的工作原理
核心概念与定位
- SELinux 是 Linux 内核的 强制访问控制(MAC) 安全架构,工作在 Linux Security Modules(LSM) 框架之上,最早由 NSA 开发,2000 年开源、2003 年并入上游内核。它在传统的 DAC(自主访问控制) 之上再叠加一层策略控制,使得即使进程以 root 身份运行,也会被策略严格约束,从而将受损进程的影响限制在最小范围。SELinux 对系统用户通常是透明的,由管理员通过策略进行细粒度授权与隔离。
工作流程
- 当一个进程(主体)请求访问资源(客体,如文件、端口、套接字等)时,内核中的 SELinux 子系统会进行如下判定:
- 先从 AVC(Access Vector Cache) 查询是否已有缓存的访问决策,命中则直接返回结果,提高性能。
- 若缓存未命中,则将请求交给 安全服务器,依据已加载的策略与安全上下文进行匹配判定。
- 判定依据包括:进程的安全上下文(特别是其 域/类型)与目标客体的安全上下文(特别是其 类型),以及策略中定义的允许规则集合。
- 根据策略返回 允许 或 拒绝;被拒绝的访问会生成 AVC 拒绝日志,常见记录位置为 /var/log/audit/audit.log,部分系统也会在 /var/log/messages 出现 “avc: denied” 信息。
- 只有在 DAC 与 MAC 同时允许 的情况下,访问才会最终放行。
标签与类型强制
- SELinux 是一个“标签系统”:系统中的 文件、进程、端口 等对象都会被内核赋予一个 安全上下文(Security Context),其格式为:user:role:type:level(其中 level 为可选,常用于 MLS 场景)。在常见的 targeted 策略中,最关键的是 type 字段。
- 类型强制(Type Enforcement, TE) 是策略的核心:策略以规则形式声明“具有某 类型 的进程(域)能否对具有某 类型 的客体执行哪些操作”。例如,常见规则形态为:allow <主体类型> <客体类型>:<客体类别> { 操作集 }。通过 TE,可以实现对服务的最小权限约束,例如限制 Web 服务仅能读取 Web 内容目录而不能触及敏感系统文件。
策略模式与配置
- SELinux 有三种运行模式,配置位于 /etc/selinux/config(部分系统链接自 /etc/sysconfig/selinux):
- Enforcing:策略强制生效,违规访问被拒绝并记录日志。
- Permissive:仅记录违规不阻断,便于排障与策略调优。
- Disabled:完全关闭 SELinux(需重启,且再次启用通常需要重标记文件系统)。
- 常用操作与工具:
- 临时切换模式:setenforce 0|1(0 为 Permissive,1 为 Enforcing)。
- 查看与修复标签:ls -Z、ps -eZ(查看上下文),restorecon(按策略恢复默认上下文)。
- 策略细粒度调优:getsebool -a、setsebool -P <布尔名> on|off(持久化开关),以及 audit2allow/ausearch 用于分析拒绝日志并生成或定位需要的策略模块。