1、在内核中构建动态 LSM 小程序引擎Lua-LSM:Scripting the Linux Security Subsystem阿里云智能集团研发工程师陈宗耀LSM的痛点:强大 但是“僵化”静态:测试内置于内核,更新策略需要重启系统复杂:SELinux 动辄上万条规则,配置与审计的难度极大僵化:安全响应周期长、研发新 LSM 模块门槛高设计目标:动态、敏捷、表达能力我们想要的不仅仅是“规则”,我们想要的是“逻辑”我们想要的不仅仅是“静态策略”,我们想要“动态响应”我们需要一种方法,像写脚本一样,低门槛、高效率地开发安全策略核心问题:我们能把一个脚本引擎安全地、高效地放进LSM框架吗?Lua:构
2、建 DSL 的元语言小巧简洁核心非常小,易于 嵌入元语言强大的 元编程能力,易于构建 DSLC 语言适配它是一个“黏合剂”,天生就是用来和 C 语言交互Lua-LSM 架构概览Lua-LSM 牺牲部分 CPU 和内存资源 换取极致的开发效率和快速的响应周期1.策略管理 动态加载/卸载 Lua 小程序 小程序被编译为字节码并存储在Lua模块中2.执行引擎 一个上下文感知的 Lua 虚拟机池 Hook Dispatcher 将 LSM 事件分派到对应的Lua 模块3.存储字典&沙盒:KV Cache 为每个内核对象附加了存储map Lua C Libraries 作为“白名单”API,构建了一个安
3、全沙盒Lua-LSM 性能开销与优化性能灾难:Per-Task VM fork/exit 带来的开销极大(N 个进程=N 个VM)优化:1.Lua VM 池化Per-CPU 的 VM 池2.无策略零开销直通在无策略状态下的开销,降低到一次原子读3.预编译字节码4.LuaJIT(WIP)Lua-LSM 安全机制L4 内核权限门控L3 运行时异常保护L2 沙盒与 白名单API小程序运行在隔离的沙盒中,小程序之间、与内核之间都互相隔离L1 编译时虚拟机裁剪从源头上裁剪了 Lua VM:移除了全局变量表、浮点数支持等,最大限度减少攻击面LSM 的痛点:钩子是无状态的对象属性:我们为每个内核对象都附加了
4、一个 K-V 存储共享字典:解决多个 VM 之间的数据共享问题。这允许我们编写有状态的安全策略Lua-LSM 表达能力Why not eBPF LSM?eBPFLua-LSM核心设计可验证的安全性与极致的性能极致的灵活性与开发效率安全模型静态验证器(加载时数学证明)运行时沙盒(环境隔离+C API 白名单)性能模型近乎原生(无 GC,可预测)解释型(有 GC,开销已优化)开发复杂度较高(受限的C,必须通过验证器)低(完整的 Lua,元编程,表)状态管理受限(依赖 bpf_maps)丰富(每个对象 K-V+全局字典)一个 Lua-LSM 例子:40行 实现提权检测1.本地提权检测2.多样化文件访问控制3.进程文件保护4.特定网络连接阻断5.复杂多级访问控制6.多员管理,最小特权7.不止于安全总结可编程脚本化编程、全内核运行极大提高 LSM 开发效率动态拆卸沙盒化支持同时动态加载/卸载多个小程序支持模块化的同时具有较强的表达能力沙盒运行,保障安全隔离的同时可有效避免内核PanicThanks!&QA&Join us(钉钉)