LSM相关知识及理解

一.什么是LSM

LSM全称为Linux Security Modules,Linux安全模块,是一个在内核模块的基础上提出的轻量级的安全访问控制框架。

下图为包含LSM的Linux内核模块结构,可以看出来LSM框架只是提供一个支持安全模块的接口,本身不能增强系统安全性。通过LSM框架,安全模块层的安全模块们可以非常自由地在内核里加载和卸载,不需要对内核进行重新编译。

 *(图源:曲坤,周莲英-基于 LSM 的安全审计机制研究与实现。侵删)

框架结构:

1)在内核数据结构中加入安全域(存放安全属性)

2)在内核代码中不同的关键点插入对hook函数的调用

安全域是一个void *类型的security指针,security具体指向的数据类型由安全模块定义,从而将安全信息和内核内部对象联系起来。安全域主要涉及task_struct(任务和进程)、linux_binprm(程序)、super_block(文件系统)、inode(管道、文件或者socket套接字)、file
(打开的文件)、sk_buff(网络缓冲区)、net_device(网络设备)、ker_ipc_perm(Semaphore消息,共享内存段,消息队列)、msg_msg(单个消息)这几种内核对象。

 LSM框架在安全域涉及的内核对象的数据结构体中加入void *类型的security指针,指向的数据类型由安全模块定义,通常为结构体指针。然后在该结构体中记录当前内核对象的上下文参数和相关的安全信息。

二.hook机制

 LSM框架通过提供一系列的hook,用来控制对内核对象的操作。

下图为hook函数的访问示意图,首先用户访问系统调用时,先通过原有的内存接口进行功能性的错误检查,然后再进行自主访问控制DAC检查。在访问内核的内部对象之前,通过安全模块的hook函数调用LSM,LSM查看操作上下文和主客体安全域的相关信息决定是否允许请求,觉得访问的合法性,返回信息。在内核即将进行实际操作之前调用安全模块中的hook函数,并通过hook函数访问安全策略来决定是否允许该操作的执行。

其中自主访问控制(Discretionary Access Control,DAC)是指对某个客体具有拥有权(或控制权)的主体能够将对该客体的一种或多种访问权自主地授予其它主体,并在随后的任何时刻将这些权限回收。这种控制是自主的,也就是指具有授予某种访问权力的主体(用户)/能够自己决定/是否将访问控制权限的某个子集授予其他的主体/或从其他主体那里收回他所授予的访问权限。 

与DAC有一个相关的概念是强制访问控制(Mandatory access control,MAC),也是一种由操作系统约束的访问控制,目标是限制主体或发起者访问对对象/目标执行某种操作的能力。主体通常是一个进程或线程,对象可能是文件、目录、TCP/UDP端口、共享内存段、I/O设备等。每当主体尝试访问对象时,都会由操作系统内核强制执行授权规则--检查安全属性并决定是否可进行访问。同样,任何主体对任何对象的任何操作都将根据一组授权规则(策略)进行测试,决定操作是否被允许。

也就是在MAC下,用户不能覆盖或修改策略,策略由安全管理员集中控制。相比而言,DAC也具有控制主体访问对象的能力,但允许用户进行策略决策/分配安全属性。最近的MAC实现有诸如面向Linux的SELinuxAppArmor以及面向Windows的强制完整性控制

目前有许多针对Linux的MAC实现(如SELinux/AppArmor),其中大多数基于Linux安全模块(LSM)框架

 

 (图源:张浩-基于LSM的安全审计系统的设计与实现,侵删)

LSM提供的hook机制,可以实现一定的安全审计功能。其中提供两类安全hook函数:用来对内核对象的安全域进行管理的&用来管理对内核对象的访问控制。

每个安全hook函数可以实现针对指定操作访问(如mkdir)的安全审计策略。

三.审计机制

审计机制对系统中有关安全的活动进行记录、检查及审核,同时为入侵检测等其它安全措施提供可靠的数据源。审计的结果定时报告给管理层,并被用来更新安全策略。

 
 
原文地址:https://www.cnblogs.com/lyeeer/p/11662844.html