一、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_msgshmid_kernel)等
  • 安全模块通过 alloc_securityfree_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钩子调用 → 安全模块决策 → 允许/拒绝
  1. 主体(进程)携带 security 标签。
  2. 客体(文件、IPC、网络等)也携带 security 标签。
  3. 访问请求经过钩子时,安全模块根据策略规则判断是否允许。
  4. 决策结果返回内核,决定是否继续执行。

四、LSM的局限性

  1. 策略共存机制不完善:主模块权力过大,模块间策略冲突时缺乏仲裁机制。
  2. 模块依赖性强:卸载主模块会导致后续模块失效,不符合“策略重用”理想。
  3. 安全性验证困难:钩子放置是否全覆盖、是否可绕过,缺乏形式化证明。
  4. 性能与灵活性权衡:钩子过多可能影响性能,过少则覆盖不全。

五、要点问答

题目:简述LSM框架的特点及其对Linux内核的主要修改。

LSM是一个轻量级、通用的Linux内核安全框架,支持多种安全模型以模块形式加载。其特点包括:通用性、模块化、低侵入性、支持多策略堆叠、独立于DAC、钩子覆盖全面、提供安全系统调用。
LSM对内核的修改主要有五方面:

  1. 在关键数据结构中增加security字段;
  2. 在关键访问点插入钩子函数调用;
  3. 新增sys_security系统调用;
  4. 实现安全模块注册与堆叠管理机制;
  5. 将Capability机制独立为模块。
    LSM虽灵活,但在策略共存、模块独立性、安全性验证方面仍有局限。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐