
LSMLinux Security ModuleLinux 安全模块是 Linux 内核提供的通用安全钩子框架核心作用是让 SELinux、AppArmor 等安全模块以非侵入方式扩展内核安全策略实现强制访问控制MAC。核心定位与设计思想本质内核级安全扩展接口不自带安全策略仅提供钩子与安全域管理基础设施。目标最小修改内核核心代码支持灵活接入多种安全模型DAC→MAC。关键机制安全域Security Blob在task_struct、cred、inode、file等核心结构体中嵌入void*指针存储安全模块私有数据。钩子函数Hook在内核关键路径系统调用、文件 / 进程 / 网络操作插入检查点由 LSM 框架分发至注册模块执行策略。模块注册通过security_add_hooks注册钩子集框架统一调度。LSM 架构总定位LSM 是内核安全中间层框架不实现任何安全策略只做三件事在内核关键路径埋钩子点Hook Points为内核对象提供安全标签存储Security Blob统一调度安全模块SELinux/AppArmor 等一句话总结内核核心代码 → LSM 框架 → 安全模块策略内核核心层进程管理、文件系统、网络、设备驱动只做传统权限检查DACUID/GID/ 权限位在关键操作前调用 LSM 钩子LSM 框架层真正的 LSM 架构本体包含 4 大核心组件钩子系统Hook System内核在200 关键位置埋点open、exec、mount、socket、kill 等格式security_xxx()函数例如security_file_open(file); security_task_kill(task, sig); security_socket_connect(sock);LSM 框架负责把请求转发给已注册的安全模块安全对象存储Security BlobLSM 为每个内核核心对象附加一个私有安全指针task_struct-securityinode-i_securityfile-f_securitycred-securitysuper_block-s_security这些指针归安全模块管理LSM 只负责分配 / 释放内存。模块注册与调度安全模块通过security_add_hooks()注册自己的钩子LSM 框架按顺序调用所有激活模块返回0 允许非 0 拒绝LSM 基础设施安全属性初始化 / 复制 / 释放内核对象安全标签管理审计、命名空间兼容LSM 内核关键数据结构1. 钩子表结构struct security_hook_list { struct hlist_node list; security_func_t func; // 模块的钩子函数 };2. 全局钩子头struct security_hook_heads { struct hlist_head file_open; struct hlist_head task_kill; struct hlist_head socket_connect; ... 共 200 个钩子 };3. 安全模块注册结构struct security_operations { const char *name; int (*file_open)(struct file *file); int (*task_kill)(...); };工作流程以文件打开为例用户态调用open()→ 进入sys_openat内核执行传统 DAC 检查UID/GID/ 权限位触发 LSM 钩子security_file_openLSM 框架遍历激活模块如 SELinux执行策略检查模块返回允许 / 拒绝 → 内核执行后续操作或返回-EACCES用户态 open() ↓ 内核 sys_openat ↓ DAC 检查rwx/uid ↓ LSM 钩子security_file_open() ↓ LSM 框架遍历激活模块 ↓ SELinux/AppArmor 做策略检查 ↓ 允许/拒绝返回 0 / -EACCES主流 LSM 模块对比模块开发方核心机制适用场景特点SELinuxNSA/Red Hat安全上下文标签 策略规则服务器、高安全环境精细、复杂、默认严格AppArmorCanonical路径 - based 强制访问控制桌面、容器、应用沙箱易用、基于路径、配置简单SmackIntel简化标签模型嵌入式、轻量场景极简、性能好、规则少TOMOYONTT基于路径的访问控制系统审计、行为监控学习模式、自动生成规则Yama内核社区进程间权限限制基础安全加固轻量、默认开启、ptrace 控制LoadPin内核社区内核 / 模块完整性防篡改、安全启动锁定内核镜像与模实现真正的访问控制SELinux标签 规则AppArmor路径 配置Smack简单标签Yama进程追踪限制LoadPin内核完整性配置与使用内核配置CONFIG_SECURITYy选择默认模块CONFIG_DEFAULT_SECURITY。运行时查看cat /sys/kernel/security/lsm激活模块列表。切换模块内核启动参数securityselinux/securityapparmor多模块编译时。注意主流模块SELinux/AppArmor/Smack运行时互斥仅一个主模块生效Yama 等可并行。现代 LSM 架构Linux 5.1堆叠模式传统 LSM只能同时跑一个主模块新 LSM 架构LSM Stacking可同时运行多个模块所有模块都检查全部通过才允许典型组合Yama LoadPin SELinux配置/sys/kernel/security/lsm这是内核官方标准架构。开发要点LSM 模块编写实现钩子函数如file_open、task_alloc。用struct security_hook_list组织钩子集。模块初始化时调用security_add_hooks注册。管理安全域分配 / 释放blob。编译进内核现代内核不支持动态加载 LSM。LSM 架构特点非侵入式不修改内核核心逻辑策略中立框架不管规则只做调度通用钩子一套钩子适配所有安全模型安全对象全覆盖进程、文件、网络、IPC可堆叠现代内核多安全模块并行内核原生编译进内核不动态加载