网站导航:首页 -> Linux认证 -> Linux认证考试动态 -> Linux 安全模块-LSM-简介

Linux 安全模块-LSM-简介

  linux安全模块(lsm)是linux内核的一个轻量级通用访问控制框架。本文介绍linux安全模块(lsm)的相关背景,设计思想,实现方法;并说明如何使用linux安全模块(lsm)来增强linux系统的安全性:一方面是供内核开发人员和安全研究人员使用的接口,另一方面是供普通用户使用的模块,以及具体的使用方法。如果读者具有linux内核和安全的相关背景知识,可以有助于对本文的理解;如果不具有,可以先阅读本文最后参考资料中列出的ibm dw上的三篇文章。

  1.相关背景介绍:为什么和是什么

  近年来linux系统由于其出色的性能和稳定性,开放源代码特性带来的灵活性和可扩展性,以及较低廉的成本,而受到计算机工业界的广泛关注和应用。但在安全性方面,linux内核只提供了经典的unix自主访问控制(root用户,用户id,模式位安全机制),以及部分的支持了posix.1e标准草案中的capabilities安全机制,这对于linux系统的安全性是不足够的,影响了linux系统的进一步发展和更广泛的应用。

  有很多安全访问控制模型和框架已经被研究和开发出来,用以增强linux系统的安全性,比较知名的有安全增强linux(selinux),域和类型增强(dte),以及linux入侵检测系统(lids)等等。但是由于没有一个系统能够获得统治性的地位而进入linux内核成为标准;并且这些系统都大多以各种不同的内核补丁的形式提供,使用这些系统需要有编译和定制内核的能力,对于没有内核开发经验的普通用户,获得并使用这些系统是有难度的。在 2001年的linux内核峰会上,美国国家安全局(nsa)介绍了他们关于安全增强linux(selinux)的工作,这是一个灵活的访问控制体系 flask在linux中的实现,当时linux内核的创始人linus torvalds同意linux内核确实需要一个通用的安全访问控制框架,但他指出最好是通过可加载内核模块的方法,这样可以支持现存的各种不同的安全访问控制系统。因此,linux安全模块(lsm)应运而生。

  linux安全模块(lsm)是linux内核的一个轻量级通用访问控制框架。它使得各种不同的安全访问控制模型能够以linux可加载内核模块的形式实现出来,用户可以根据其需求选择适合的安全模块加载到linux内核中,从而大大提高了linux安全访问控制机制的灵活性和易用性。目前已经有很多著名的增强访问控制系统移植到linux安全模块(lsm)上实现,包括posix.1e capabilities,安全增强linux(selinux),域和类型增强(dte),以及linux入侵检测系统(lids)等等。虽然目前 linux安全模块(lsm)仍然是作为一个linux内核补丁的形式提供,但是其同时提供linux 2.4稳定版本的系列和linux 2.5开发版本的系列,并且很有希望进入linux 2.6稳定版本,进而实现其目标:被linux内核接受成为linux内核安全机制的标准,在各个linux发行版中提供给用户使用。

  2.设计思想介绍:得让两方面都满意

  linux安全模块(lsm)的设计必须尽量满足两方面人的要求:让不需要它的人尽可能少的因此得到麻烦;同时让需要它的人因此得到有用和高效的功能。

  以linus torvalds为代表的内核开发人员对linux安全模块(lsm)提出了三点要求:

  真正的通用,当使用一个不同的安全模型的时候,只需要加载一个不同的内核模块

  概念上简单,对linux内核影响最小,高效,并且能够支持现存的posix.1e capabilities逻辑,作为一个可选的安全模块

  另一方面,各种不同的linux安全增强系统对linux安全模块(lsm)提出的要求是:能够允许他们以可加载内核模块的形式重新实现其安全功能,并且不会在安全性方面带来明显的损失,也不会带来额外的系统开销。

  为了满足这些设计目标,linux安全模块(lsm)采用了通过在内核源代码中放置钩子的方法,来仲裁对内核内部对象进行的访问,这些对象有:任务,inode结点,打开的文件等等。用户进程执行系统调用,首先游历linux内核原有的逻辑找到并分配资源,进行错误检查,并经过经典的unix自主访问控制,恰好就在linux内核试图对内部对象进行访问之前,一个linux安全模块(lsm)的钩子对安全模块所必须提供的函数进行一个调用,从而对安全模块提出这样的问题'是否允许访问执行?',安全模块根据其安全策略进行决策,作出回答:允许,或者拒绝进而返回一个错误。

  另一方面,为了满足大多数现存linux安全增强系统的需要,linux安全模块(lsm)采取了简化设计的决策。linux安全模块(lsm)现在主要支持大多数现存安全增强系统的核心功能:访问控制;而对一些安全增强系统要求的其他安全功能,比如安全审计,只提供了的少量的支持。linux安全模块(lsm)现在主要支持'限制型'的访问控制决策:当linux内核给予访问权限时,linux安全模块(lsm)可能会拒绝,而当linux内核拒绝访问时,就直接跳过linux安全模块(lsm);而对于相反的'允许型'的访问控制决策只提供了少量的支持。对于模块功能合成,linux安全模块(lsm)允许模块堆栈,但是把主要的工作留给了模块自身:由第一个加载的模块进行模块功能合成的最终决策。所有这些设计决策可能暂时影响了linux安全模块(lsm)的功能和灵活性,但是大大降低了linux安全模块(lsm)实现的复杂性,减少了对linux内核的修改和影响,使得其进入linux 内核成为安全机制标准的可能性大大提高;等成为标准后,可以改变决策,增加功能和灵活性。

  3.实现方法介绍:对linux内核的修改

  linux安全模块(lsm)目前作为一个linux内核补丁的形式实现。其本身不提供任何具体的安全策略,而是提供了一个通用的基础体系给安全模块,由安全模块来实现具体的安全策略。其主要在五个方面对linux内核进行了修改:

  在特定的内核数据结构中加入了安全域
  在内核源代码中不同的关键点插入了对安全钩子函数的调用
  加入了一个通用的安全系统调用
  提供了函数允许内核模块注册为安全模块或者注销
  将capabilities逻辑的大部分移植为一个可选的安全模块
  下面对这五个方面的修改逐个做简要的介绍。

  安全域是一个void*类型的指针,它使得安全模块把安全信息和内核内部对象联系起来。下面列出被修改加入了安全域的内核数据结构,以及各自所代表的内核内部对象:

  task_struct结构:代表任务(进程)
  linux_binprm结构:代表程序
  super_block结构:代表文件系统
  inode结构:代表管道,文件,或者socket套接字
  file结构:代表打开的文件
  sk_buff结构:代表网络缓冲区(包)
  net_device结构:代表网络设备
  kern_ipc_perm结构:代表semaphore信号,共享内存段,或者消息队列
  msg_msg:代表单个的消息
  另外,msg_msg结构,msg_queue结构,shmid_kernel结构被移到include/linux/msg.h和include/linux/shm.h这两个头文件中,使得安全模块可以使用这些定义。