本文内容参考:
LSM(Linux Security Modules)框架原理解析_lsm框架_pwl999的博客-CSDN博客
LSM相关知识及理解-布布扣-bubuko.com
一文了解Linux安全模块(LSM) - 嵌入式技术 - 电子发烧友网
在此特别致谢!
一、什么是LSM
LSM全称为Linux Security Modules,中文译为Linux安全模块,是一个在内核模块的基础上提出的轻量级的安全访问控制框架。LSM框架只是提供一个支持安全模块的接口,本身不能增强系统安全性。通过LSM框架,安全模块层的安全模块们可以非常自由地在内核里加载和卸载,不需要对内核进行重新编译。
一个LSM模块是直接编译Linux内核的代码,利用LSM框架,它可以拒绝某个进程访问重要的内核对象。这些对象包括:文件、inode、任务控制块、凭证和进程间通信对象。通过指定允许的交互,安全管理员可以让攻击者很难利用程序的缺陷从而攻击系统的其它部分。
LSM框架的第一个、也是最流行的使用场景是强制访问控制(MAC)策略。毫无疑问,在内核中实现MAC策略的方法有多种。在Linux 5.4版本内核中有8个LSM模块:SELinux、SMACK、AppArmor、TOMOYO、Yama、LoadPin、SafeSetID、Lockdown。还有一些LSM模块在开发中,比如SARA 和 KRSI,也许不久就会合入Linux内核源码中。如果你是关注安全的系统或软件工程师,理解为什么有这么多的LSM模块是非常值得的。它们有一些是解决通用问题,有一些则是解决特定问题。意识到它们的差异,才能更好地理解Linux的安全特性。
二、框架结构
LSM是内核安全模块的一套框架,本质是插桩法。
1. 在内核数据结构中加入安全域(存放安全属性)
安全域是一个void *类型的security指针,security具体指向的数据类型由安全模块定义,从而将安全信息和内核内部对象联系起来。内核安全相关的关键对象有:task_struct(任务和进程)、linux_binprm(程序)、super_block(文件系统)、inode(管道、文件或者 socket套接字)、file(打开的文件)、sk_buff(网络缓冲区)、net_device(网络设备)、ker_ipc_perm(Semaphore消息,共享内存段,消息队列)、msg_msg(单个消息)。
2. 在内核安全相关的关键路径上插入了Hook点
对以上这些对象的系统调用操作就是关键路径。LSM在这些关键路径上,使用静态插桩法,插入了一批预置的Hook点,即在内核代码中不同的关键点插入对Hook函数的调用。如下图所示:
三、Hook机制
LSM框架通过提供一系列的Hook来控制对内核对象的操作。Hook函数的访问示意图如下:
机制如下:
首先用户执行系统调用时,先通过原有的内存接口进行功能性的错误检查;然后再进行自主访问控制DAC检查;在访问内核的内部对象之前,通过安全模块的Hook函数调用LSM,LSM查看操作上下文和主客体安全域的相关信息决定是否允许请求即确定访问的合法性,返回信息。
概括为3个步骤:
(1)先通过原有的内部接口进行功能性的错误检查;
(2)再进行自主访问控制DAC检查;
(3)调用LSM的Hook函数。