云服务器

linux安全模块学习之LSM的使用说明

2019-12-05 09:13:41 274

上期我们学习到LSM是什么及内核是怎样实现的,本期我们来了解下LSM提供的接口是怎么分类及使用

接口说明:给内核开发人员和安全研究人员使用的钩子

Linux安全模块(LSM)对于内核开发人员和安全研究人员的价值就在于:可以使用其提供的接口将现存的安全增强系统移植到这一框架上,从而能够以可加载内核模块的形式提供给用户使用;甚至可以直接编写适合自己需要的安全模块。

Linux安全模块(LSM)提供的接口就是钩子,其初始化时所指向的虚拟函数实现了缺省的传统UNIX超级用户机制,模块编写者必须重新实现这些钩子函数来满足自己的安全策略。下面简要介绍Linux安全模块(LSM)提供的钩子,详细情况请参考源代码,特别是include/linux/security.h头文件中security_operations结构的定义。至于具体如何根据自己需要的安全策略编写安全模块,可以参考SELinux,DTE,LIDS等系统的安全模块实现。

1) 任务钩子,Linux安全模块(LSM)提供了一系列的任务钩子使得安全模块可以管理进程的安全信息并且控制进程的操作。

  • 模块可以使用task_struct结构中的安全域来维护进程安全信息;

  • 任务钩子提供了控制进程间通信的钩子,例如kill();

  • 还提供了控制对当前进程进行特权操作的钩子,例如setuid();

  • 还提供了对资源管理操作进行细粒度控制的钩子,例如setrlimit()和nice()。

2) 程序装载钩子。很多安全模块,包括Linux capabilities,SELinux,DTE都需要有在一个新程序执行时改变特权的能力。因此Linux安全模块(LSM)提供了一系列程序装载钩子,用在一个execve()操作执行过程的关键点上。

  • linux_binprm结构中的安全域允许安全模块维护程序装载过程中的安全信息;

  • 提供了钩子用于允许安全模块在装载程序前初始化安全信息和执行访问控制;

  • 还提供了钩子允许模块在新程序成功装载后更新任务的安全信息;

  • 还提供了钩子用来控制程序执行过程中的状态继承,例如确认打开的文件描述符。

3) 进程间通信IPC钩子。安全模块可以使用进程间通信IPC钩子来对System V IPC的安全信息进行管理,以及执行访问控制。

  • IPC对象数据结构共享一个子结构kern_ipc_perm,并且这个子结构中只有一个指针传给现存的ipcperms()函数进行权限检查,因此Linux安全模块(LSM)在这个共享子结构中加入了一个安全域。

  • 为了支持单个消息的安全信息,Linux安全模块(LSM)还在msg_msg结构中加入了一个安全域。

  • Linux安全模块(LSM)在现存的ipcperms()函数中插入了一个钩子,使得安全模块可以对每个现存的Linux IPC权限执行检查。由于对于某些安全模块,这样的检查是不足够的,Linux安全模块(LSM)也在单个的IPC操作中插入了钩子。

  • 另外还有钩子支持对通过System V消息队列发送的单个消息进行细粒度的访问控制。

4) 文件系统钩子。对于文件操作,定义了三种钩子:文件系统钩子,inode结点钩子,以及文件钩子。
Linux安全模块(LSM)在对应的三个内核数据结构中加入了安全域,分别是:super_block结构,inode结构,file结构。

  • 超级块文件系统钩子使得安全模块能够控制对整个文件系统进行的操作,例如挂载,卸载,还有statfs()。

  • Linux安全模块(LSM)在permission()函数中插入了钩子,从而保留了这个函数,但是也提供了很多其他inode结点钩子来对单个inode结点操作进行细粒度访问控制。

  • 文件钩子中的一些允许安全模块对read()和write()这样的文件操作进行额外的检查;

  • 文件钩子允许安全模块控制通过socket IPC接收打开文件描述符;

  • 其他的文件钩子对像fcntl()和ioctl()这样的操作提供细粒度访问控制。

5) 网络钩子。对网络的应用层访问使用一系列的socket套接字钩子来进行仲裁,这些钩子基本覆盖了所有基于socket套接字的协议。

  • 由于每个激活的用户socket套接字有伴随有一个inode结构,所以在socket结构或是更底层的sock结构中都没有加入安全域。socket套接字钩子对有关进程的网络访问提供了一个通用的仲裁,从而显著扩展了内核的网络访问控制框架(这在网络层是已经由Linux内核防火墙netfilter进行处理的)。例如sock_rcv_skb钩子允许在进入内核的包排队到相应的用户空间socket套接字之前,按照其目的应用来对其进行仲裁。

  • 另外Linux安全模块(LSM)也为IPv4,UNIX域,以及Netlink协议实现了细粒度的钩子,以后还可能实现其他协议的钩子。网络数据以包的形式被封装在sk_buff结构(socket套接字缓冲区)中游历协议栈,Linux安全模块(LSM)在sk_buff结构中加入了一个安全域,使得能够在包的层次上对通过网络层的数据的安全信息进行管理,并提供了一系列的sk_buff钩子用于维护这个安全域的整个生命周期。硬件和软件网络设备被封装在一个net_device结构中,一个安全域被加到这个结构中,使得能够在设备的层次上维护安全信息。

6) 其他的钩子。Linux安全模块(LSM)提供了两种其他系列的钩子:模块钩子和顶层的系统钩子。

  • 模块钩子用来控制创建,初始化,清除内核模块的内核操作。

  • 系统钩子用来控制系统操作,例如设置主机名,访问I/O端口,以及配置进程记帐。
    虽然现在的Linux内核通过使用capability检查对这些系统操作提供了一些支持,但是这些检查对于不同操作差别很大并且没有提供任何参数信息。

模块说明:给普通用户使用的现成的安全功能

  • Linux安全模块(LSM)对于普通用户的价值就在于:可以提供各种安全模块,由用户选择适合自己需要加载到内核,满足特定的安全功能。Linux安全模块(LSM)本身只提供增强访问控制策略的机制,而由各个安全模块实现具体特定的安全策略。下面简要介绍一些已经实现的安全模块。

  • SELinux。这是一个Flask灵活访问控制体系在Linux上的实现,并且提供了类型增强,基于角色的访问控制,以及可选的多级安全策略。SELinux原来是作为一个内核补丁实现的,现在已经使用Linux安全模块(LSM)重新实现为一个安全模块。SELinux可以被用来限制进程为最小特权,保护进程和数据的完整性和机密性,并且支持应用安全需求。

  • DTE Linux。这是一个域和类型增强在Linux上的实现。就像SELinux一样,DTE Linux原来是作为一个内核补丁实现的,现在已经使用Linux安全模块(LSM)重新实现为一个安全模块。当这个安全模块被加载到内核上时,类型被赋给对象,域被赋给进程。DTE策略限制域之间和从域到类型的访问。

  • Openwall 内核补丁的LSM移植。Openwall内核补丁提供了一系列的安全特性集合来保护系统免受例如缓冲区溢出和临时文件竞争这样的攻击。有安全模块正在被开发出来以支持Openwall补丁的一个子集。

  • POSIX.1e capabilities。Linux内核中已经存在有POSIX.1e capabilities逻辑,但是Linux安全模块(LSM)把这个逻辑划分到了一个安全模块中。这样的修改使得不需要的用户可以从他们的内核中把这个功能略去;也使得capabilities逻辑的开发可以脱离内核开发获得更大的独立性。

  • LIDS。这是中国人谢华刚发起的项目。开始时作为一个入侵检测系统开发,后来逐渐演变为使用访问控制系统的形式来进行入侵预防,它通过描述一个给定的程序可以访问哪些文件来进行访问控制。同样的,LIDS原来是作为一个内核补丁实现的并附带了一些管理工具,现在已经使用Linux安全模块(LSM)重新实现为一个安全模块。

当然还有缺省的传统超级用户机制。这个安全模块是Linux安全模块(LSM)缺省的,实现了传统的UNIX超级用户特权机制。

具体使用方法说明

Linux安全模块(LSM)目前作为一个Linux内核补丁的形式实现,在GPL许可证下发布供用户自由使用。

  • 首先用户可以在http://lsm.immunix.org/lsm_download.html 下载到对应于Linux 2.4稳定版本和Linux 2.5开发版本的LSM补丁,放在某个目录下,例如是目录/path/to/linux-2.4.x,通过执行下面的命令来使LSM补丁作用在Linux内核上:

  • cd /path/to/linux-2.4.x
    zcat /path/to/patch-2.4.x-lsm.gz | patch -p1

  • 然后用户可以在http://lsm.immunix.org/lsm_modules.html 连接到已经实现安全模块的站点,下载到所需要的安全模块,将安全模块加载到Linux内核中,这样用户需要的安全策略就可以起作用了,从而增强了系统的安全性。

    具体安全模块的安装方法这里就略过了,各个安全模块都会提供详细的安装说明文件,用户可以参考这些文件,例如SELinux的安全模块安装说明文件在:http://www.nsa.gov/selinux/doc/readme.html ,又如LIDS的安全模块安装说明文件在:http://www.lids.org/install.html。


如果用户有Linux内核和安全的相关背景知识和开发经验,想根据自己需要的安全策略编写安全模块。可以在http://lsm.immunix.org/lsm_bk.html 跟踪查看Linux安全模块(LSM)的源代码和现有安全模块的源代码,参考其实现方法编写自己的安全模块。

这样在满足自己安全需求的同时,也可以为Linux安全模块(LSM)的发展作出一些贡献,使其早日被Linux内核接受成为Linux内核安全机制的标准,使更多的用户得益。

Linux安全模块(LSM)的起因是:一方面Linux内核现有的安全机制是不足够的;另一方面现存的安全增强系统又各自为战并且难以使用。

Linux安全模块(LSM)比较好的解决了这个问题:一方面补丁比较小,对内核源代码的修改影响不多,所带来的负载也不大;另一方面对现存的安全增强系统提供了比较好的接口支持,并已经有不少很好的安全模块可以使用。

Linux安全模块(LSM)目前仍然是作为一个Linux内核补丁的形式提供,但是其同时提供Linux 2.4稳定版本的系列和Linux 2.5开发版本的系列,并且很有希望进入Linux 2.6稳定版本。

我们期待着那一天:Linux安全模块(LSM)被Linux内核接受成为Linux内核安全机制的标准,在各个Linux发行版中提供给越来越多的用户使用。



睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032

上一篇: 无

微信关注

获取更多技术咨询