SELinux 柔性安全策略集成(Freenix 2001 经典论文)

Loscocco (NSA) & Smalley (NAI Labs),Freenix Workshop 2001。SELinux 的奠基性论文:Flask 架构如何落地 Linux 2.4.2 内核。OS 安全课程参考文献,也是今天 Android/服务器 SELinux 的源头文献。

1. 问题:DAC 为什么不够

  • DAC(Unix 权限)只看用户身份与所有权,忽略角色、程序可信度、数据敏感性;程序继承用户全部权限,恶意/有缺陷程序可绕过一切应用层安全机制。
  • DAC 只有两种用户:完全可信的 root 与完全不可信的普通用户。特权程序权限远超实际需要(coarse-grained),任一程序有漏洞即等于全系统沦陷。
  • 传统 MAC(MLS 密级模型)又太死板:不支持完整性、职责分离、最小权限,需要模型外的”可信主体”。
  • 结论(引其 1998 “The Inevitability of Failure”):主流操作系统必须引入柔性强制访问控制。

2. Flask 架构核心设计

  • 策略与执行分离:安全策略逻辑封装在 security server(SELinux 里是内核子系统,微内核时代是用户态服务器);各内核子系统(进程管理、文件系统、socket IPC、System V IPC)作为 object manager 只负责向 security server 要决策并执行。
  • 安全标签封装:两级数据类型——security context(可变长字符串标签)与 SID(整数句柄)。object manager 完全不理解标签内容,改标签格式/策略模型不需要改 object manager。
  • AVC(Access Vector Cache):缓存 security server 的访问决策,object manager 可在对象里存 AVC 条目引用(avc_has_perm_ref),绝大多数权限检查连函数调用开销都省掉。
  • 标签推导(transition):新对象标签由”创建者标签 + 关联对象标签 + 对象类别”计算(security_transition_sid);程序执行时新进程标签由”当前标签 + 可执行文件标签”决定;新文件默认继承父目录类型。
  • 动态策略变更:security_load_policy 运行时载入新策略;序列号解决决策计算与策略变更通知的交错;AVC 重置后非法 SID 的访问一律失败;多数权限”用时再验证”(revalidate on use),无需回调即自动生效。已知缺陷:策略变更后已映射页缓存页面无法撤销(未实现回调失效)。

3. SELinux 示例策略:TE + RBAC(+可选 MLS)

  • 安全上下文 = 用户身份 + 角色 + 类型 + 可选 MLS 级别;SELinux 用户身份与 Linux uid 完全正交,不破坏兼容性。
  • 角色:system_r(系统进程)、user_r、sysadm_r;各角色有初始登录域(user_t/sysadm_t),执行程序可自动换域(如执行 netscape 进入 user_netscape_t,把浏览器约束在权限子集内)。
  • 论文用 insmod 六行策略作示范(图4):允许执行、允许转移、entrypoint+execute、fd 继承、CAP_SYS_MODULE 能力、sigchld 回收——展示”进入一个特权域”需要显式授权的全部环节。
  • 关键控制点:
    • entrypoint 权限区分”能进入某域的入口程序”与”该域能执行的程序”(应对共享库/动态链接器问题);
    • 内核完整性:boot 文件、模块、sysctl 各自独立类型,模块能力仅限模块工具域;
    • 特权进程只能执行自己域的初始程序+系统链接器+共享库,防执行恶意代码;
    • sysadm 角色只能经 login/newrole 认证进入,禁 .rhosts 远程直达;shadow 文件独立类型;
    • 文件标签持久化:每文件系统内建标签表,PSID 存磁盘 inode 空闲字段(零额外开销),文件系统移动/换挂载点标签不丢(当时仅 ext2 实现)。
  • 论文坦承代价:MAC 灵活性带来策略管理复杂度陡增,需要基础策略包、高层配置语言与策略分析工具才能普及——这正是后来 SELinux “难用”名声的源头,预言准确。

4. 性能结论(当时数据,做容量参考)

  • 平台:333MHz PII/128M,Linux 2.4.2 base vs enforcing SELinux。
  • 微基准(UnixBench/lmbench)单项 overhead 高者可达 33%(null I/O)、fork/execve、网络往返有明显百分比开销,但绝对时差极小;且 AVC/security server 未优化,属上界。
  • 宏基准几乎无感:编译 2.4.2 内核 elapsed 11:14→11:15(0%),system 时间 0:49→0:51(+4%);WebStone 32 客户端延迟 0.56s→0.56s、吞吐 8.29→8.28 MBits/s(0%)。
  • 工程启示:细粒度权限检查的成本在”每系统调用常数次缓存查找”量级,真实负载下可忽略——SELinux 至今默认开启的底气来自这组数据。

5. 同期方案对比(Related Work 摘要)

方案与 SELinux 的差异
RSBAC (GFAC)同样策略/执行分离,但无原子策略变更、标签类型不独立、无决策缓存、复用 Linux uid 不正交
DTE只实现 TE 增强版;SELinux 是 TE+RBAC+MLS 的通用化
TrustedBSD特性杂烩、硬编码策略,后计划转向灵活架构
Medusa DS9决策放用户态授权服务器,可拦截系统调用、可否决 DAC
LIDS基于程序的 ACL,可隐藏文件/进程,非完整 MAC 架构
LOMAC低水位完整性模型,零配置;可作为 SELinux 的一个策略模块实现

可行动点 / 关联

  • 调试现代 Android/Linux SELinux 时回溯概念(sid、transition、entrypoint、revalidate、AVC 缓存与审计)都以本文为原始定义,比读现代 man page 更清楚设计动机。
  • “策略灵活则管理复杂”的权衡是安全架构设计的经典案例,可迁移到任何策略引擎设计(OPA/Cedar 同理)。
  • 关联:CANopen-DS306电子设备数据表规范EDS-DCF(同为嵌入式设备侧规范阅读线);rainbow series 橙色书系(同目录 MLS 传统,本文正是对它的批判性超越)。

元信息

  • 原文件:/田浩然上传的资料/0CI03 操作系统安全/课程参考文献/security architecture/Implementation in SELinux/Integrating Flexible Support for Security Policies into the Linux Operating System(freenix01).pdf(14 页文本型 PDF)
  • 获取方式:pdf-inspector 文本提取 + pdftotext 交叉补全表格区
  • 同目录另有 Resolving Constraint Conflicts (jaeger) 等 SELinux 相关文件待后续处理。