操作系统与虚拟化安全重点 5.3.LSM安全框架设计
LSM是一个轻量级、通用的Linux内核安全框架,支持多种安全模型以模块化形式加载。其核心特点包括:低侵入性(通过钩子函数实现安全检查)、支持多策略堆叠、独立于传统DAC机制、提供全面的安全钩子覆盖和灵活的系统调用接口。LSM对内核的修改主要包括:在关键数据结构添加安全标签字段、插入钩子函数调用、新增安全系统调用、实现模块管理机制,并将Capability机制独立为模块。尽管LSM具有高度灵活性,
·
LSM安全框架设计
一、LSM框架的特点
LSM是一个轻量级、通用、可插拔的Linux内核安全框架,其核心特点如下:
1. 通用性与模块化
- LSM不强制实施某一特定安全模型,而是提供一个通用接口,允许不同的安全模块(如SELinux、AppArmor、Smack等)以可加载内核模块(LKM) 形式实现。
- 安全策略的实施仅需加载对应模块,无需重新编译内核,实现了安全策略的“即插即用”。
2. 轻量级与低侵入性
- LSM设计上追求最小化对内核的修改,仅通过“钩子函数”在关键访问点插入安全检查。
- 不影响系统性能,不改变原有内核架构,兼容现有POSIX.1e权能机制。
3. 支持多策略共存(模块堆栈)
- LSM支持模块堆叠(module stacking),允许多个安全模块同时加载。
- 第一个加载的模块称为主模块(primary module),负责后续模块的注册与调用调度。
- 虽然支持多模块,但模块间存在依赖关系,主模块权力较大,策略协同机制相对简单。
4. 独立于传统权限系统
- LSM在传统DAC检查之后、内核实际访问之前插入安全检查,实现强制访问控制(MAC)。
- 将Linux原有的Capability机制独立为模块,可与其他安全模块堆叠使用。
5. 安全钩子覆盖全面
- LSM在关键内核子系统中预设了大量钩子调用点,涵盖:
- 进程管理
- 文件系统操作
- 网络通信
- IPC(进程间通信)
- 模块加载
- 系统控制等
- 钩子分为三类:
- 访问控制检查类(最多)
- 安全字段管理类(alloc/free_security)
- 事后回调类(post_*)
6. 灵活性与可扩展性
- 提供统一的安全系统调用
sys_security,支持用户态与安全模块交互。 - 安全模块可自由扩展钩子实现,支持自定义安全模型(如DTE、RBAC、MLS等)。
二、LSM对内核的主要修改(五方面)
LSM以内核补丁形式实现,主要对内核进行了以下五方面修改:
1. 关键数据结构的修改
- 在内核关键数据结构中增加
void *security指针字段,用于存储安全模块的安全上下文标签。 - 涉及的结构包括:
task_struct→ 进程安全标签inode→ 文件、管道、套接字安全标签file→ 打开文件的安全标签sk_buff→ 网络数据包安全标签super_block→ 文件系统安全标签- IPC相关结构(如
msg_msg、shmid_kernel)等
- 安全模块通过
alloc_security、free_security等函数管理这些字段。
2. 钩子函数的调用插入
- 在内核关键访问路径上插入钩子函数调用,例如:
- 文件创建前调用
inode_mkdir - 进程创建时调用
task_alloc_security - 网络包发送前调用
socket_sendmsg
- 文件创建前调用
- 钩子调用通过全局函数表
security_ops映射到具体模块的实现。 - LSM共提供了 227处对153个钩子函数 的调用。
3. 新增安全系统调用
- 新增系统调用
sys_security,用于用户态与安全模块交互。 - 调用格式:
long sys_security(unsigned int id, unsigned int call, unsigned long *args);id:模块标识符call:操作类型args:参数列表
- 模块内部通过
switch-case实现调用分发,支持多种安全模型的功能扩展。
4. 安全模块管理机制
- 内核启动时默认加载 dummy模块(仅支持传统超级用户模式)。
- 提供注册/注销接口:
register_security/unregister_security:主模块注册mod_reg_security/mod_unreg_security:辅助模块堆叠注册
- 采用“模块栈”管理方式,主模块决定是否调用后续模块的策略函数。
5. 独立Capability模块
- 将Linux原有的POSIX.1e Capability机制 从内核中剥离,作为独立安全模块实现。
- 该模块可与其他LSM模块堆叠,实现“权能+强制访问控制”的复合安全策略。
三、LSM的访问控制流程简述(基于FLASK思想)
主体 → 发起访问 → 内核DAC检查 → LSM钩子调用 → 安全模块决策 → 允许/拒绝
- 主体(进程)携带
security标签。 - 客体(文件、IPC、网络等)也携带
security标签。 - 访问请求经过钩子时,安全模块根据策略规则判断是否允许。
- 决策结果返回内核,决定是否继续执行。
四、LSM的局限性
- 策略共存机制不完善:主模块权力过大,模块间策略冲突时缺乏仲裁机制。
- 模块依赖性强:卸载主模块会导致后续模块失效,不符合“策略重用”理想。
- 安全性验证困难:钩子放置是否全覆盖、是否可绕过,缺乏形式化证明。
- 性能与灵活性权衡:钩子过多可能影响性能,过少则覆盖不全。
五、要点问答
题目:简述LSM框架的特点及其对Linux内核的主要修改。
答:
LSM是一个轻量级、通用的Linux内核安全框架,支持多种安全模型以模块形式加载。其特点包括:通用性、模块化、低侵入性、支持多策略堆叠、独立于DAC、钩子覆盖全面、提供安全系统调用。
LSM对内核的修改主要有五方面:
- 在关键数据结构中增加security字段;
- 在关键访问点插入钩子函数调用;
- 新增sys_security系统调用;
- 实现安全模块注册与堆叠管理机制;
- 将Capability机制独立为模块。
LSM虽灵活,但在策略共存、模块独立性、安全性验证方面仍有局限。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)