《毕业设计(论文)基于进程的访问控制技技术究与实现.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于进程的访问控制技技术究与实现.doc(43页珍藏版)》请在三一办公上搜索。
1、操作系统的安全是计算机系统安全的基石,对计算机的资源进行访问控制是操作系统安全机制的重要内容。基于进程的访问控制是为了增强现有的操作系统的安全性,其原理是依据进程的具体功能,进一步划分对系统资源访问权限管理的粒度,从而最大程度地降低有害程序对计算机系统的威胁。 本文分析了自主访问控制(DAC)、强制访问控制、基于角色的访问控制(RBAC)的原理和机制,研究了通用安全框架LSM(Linux安全模块)的实施过程,给出了在Linux系统中基于进程访问控制的设计和实现。本文分析了相对于传统的自主访问控制和强制访问控制,基于进程访问控制的特点;描述了在Linux2.6.X内核上实现访问控制的模型;设计了
2、在LSM框架下基于进程访问控制的模型。 关键词:Linux系统安全 访问控制 LSM 安全框架ABSTRACTOperating system security is the foundation of computer system security ,access control to computer resources is an important content of the operating system security mechanisms. Access control is based on the process to enhance the security of
3、the existing operating system. The principle is based on specific features of the process ,and is further divided on the granularity of the access management of system resources so as to minimize the unwanted program threats to computer systems.This article analyses the discretionary access control
4、(DAC), mandatory access control, role-based access control (RBAC) the principles and mechanisms, researches the General security framework LSM (Linux security modules) implementation process, provides the Linux system based on process design and implementation of access control.Also ,this article co
5、mpares the relatively traditional discretionary access control and mandatory access control, process-based access control features; describes models of access control on the Linux2.6.X kernel and designs the context of LSM process-based access control model. Keyword:Linux system security Access cont
6、rol LSM 目录第一章 绪论11.1 操作系统安全的重要性11.1.1 操作系统安全面临的威胁11.1.2 安全操作系统的发展21.1.3 中国安全操作系统的发展31.2 本文研究内容及目标3第二章 安全机制及安全框架52.1 安全机制52.1.1 基本概念52.1.2 自主访问控制52.1.3 强制访问控制62.1.4 基于角色的访问控制72.2 LSM通用安全框架92.2.1 LSM的由来92.2.2 LSM设计思想102.3 LSM设计分析132.3.1 LSM设计分析132.3.2 接口说明:给内核开发人员和安全研究人员使用的钩152.4本章小结17第三章 基于进程的访问控制的设计
7、193.1 基于进程的访问控制提出193.1.1 思路分析193.2访问控制模型的建立203.2.1 基本集合203.2.2 模型定义203.2.3 模型描述213.3 基于进程的访问控制的设计223.3.1基于进程的访问控制模型的设计223.3.2基于进程的访问控制框架233.3.3 安全授权模块的设计243.3.4 访问规则模块的设计253.3.5 访问判决模块的设计263.4 基于基础的访问控制机制的实现263.4.1安全授权模块的实现263.4.2访问规则模块的设计283.4.3 访问判决模块的实现293.4.4 模块的注册和注销313.5本章小结31第四章 测试和分析334.1模块加
8、载334.2 模块测试344.3 系统性能测试354.4本章小结35第五章 总结和体会37致谢39参考文献:41第一章 绪论1.1 操作系统安全的重要性 随着计算机技术和网络技术的迅速发展,信息共享的程度逐步提高,信息安全受到越来越多人们的关注。操作系统作为计算机系统的基础软件,是计算机资源的首要管理者,控制着整个系统的运行,直接和硬件打交道并为用户提供接口,是计算机软件的基础。因此,操作系统的安全是计算机系统安全的基石。 1.1.1 操作系统安全面临的威胁随着网络技术的发展,越来越多的系统遭到入侵攻击的威胁,这些威胁大多数是通过操纵系统和应用程序的弱点和缺陷实现的。对操作系统安全构成的威胁主
9、要有以下几大类:1)计算机病毒:编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码被称为计算机病毒(Computer Virus)。具有破坏性,复制性和传染性。 2)特洛伊木马:指包含在合法程序中的非法程序,在用户不知情的情况下执行,并把用户信息发给攻击者。不具有复制性,但仍有潜伏性,并且会欺骗用户并造成更大的危害。3)隐蔽通道:给定一个强制安全策略模型M和它在一个操作系统中的解释I(M),I(M)中两个主体I(Si)和I(Sj)之间的任何潜在通信都是隐蔽的,当且仅当模型M中的相应主体Si和Sj之间的任何通信在M中都是非法的。(系
10、统中不受安全策略控制的,违反安全策略的信息泄露路径)隐蔽通道主要有两种类型:存储通道和定时通道.如果一个进程直接或间接地写一个存储单元,另一个进程直接或间接地读该存储单元,则称这种通道为隐蔽存储通道.如果一个进程通过调节它对系统资源的使用,影响另外一个进程观察到的真实响应时间,实现一个进程向另一个进程传递信息,则称这种通道为隐蔽定时通道. 4)后门:是利用植入操作系统内部的一段非法代码入侵系统。后门只能利用操作系统本身的缺陷或有系统的开发人员安装。面对各种各样的安全威胁和攻击,我们必须采取行之有效地安全机制进行保护、防御和反击。1.1.2 安全操作系统的发展从20实际60年代开始,人们便开始了
11、对安全操作系统的研究,并经历了四个主要阶段:奠基时期(foundation period)、食谱时期(cookbook period)、多策略时期(multi-policy period)、和动态策略时期(dynamic-policy period)1。奠基时期:起始于1967年安全Adept-50项目的启动。在这个时期,安全操作系统经历了从无到有的探索过程,安全操作系统的基本思想、理论、技术和方法逐步建立。食谱时期:1983年美国国防部颁布了历史上第一个计算机安全评价标准,即可信计算机系统评价标准(TCSEC2),它为安全系统指定了一个单一的系统安全策略。在这一时期,主要是围绕TCSEC为蓝
12、本研制安全操作系统,包括:1984年,AXIOM公司研发的LINUS IV 系统,1986年IBM公司的Xenix系统,1988年AT&T BELL实验室开发的System V/MLS系统,1990年TRW公司开发的ASOS系统等。多策略时期:起始于1993年, 这个时期人们开始超越TCSES的范围,在安全操作系统中实现多种安全策略。1997年完成的DTOS(Distributed Trusted Operating System)项目就是能够支持多种安全策略的一个原型系统,能支持多级安全策略(MLS)、基于标识的访问策略(IBAC)、类型强制策略(TE)等。动态策略时期:1999年FLASK
13、3系统的诞生是进入动态策略时期的标志,这个时期的特点是使安全操作系统支持多种安全策略的动态变化,从而实现了安全策略的多样性。 Linux作为一个类UNIX操作系统,遵循GPL协议4和开放源代码,可用来做服务器安全操作系统。而且已经有许多访问控制模型、框架被研发出来,如SELinux5(Security-Enforced Linux)、域与类型强制(Domain and Type Enforcement ,DTE)、RSBAC(Rule Set Based Access Control)等。为了支持众多的安全模型,在Linus的提议下,Chris Wright ,Crispin Cowan,St
14、ephen Smalley 等人发布了基于Linux 内核2.4.18版本的Linux安模块(Linux Security Modules,LSM6)的补丁程序。LSM是Linux黑河的轻量级通用访问控制框架,它可允许多种不同的访问控制模型作为可加载的内核模块实施,用户可根据需求选择合适的安全模块加载到Linux内核中,开发符合自身要求的安全模块也无需改变内核数据结构及内核源代码,提高了Linux访问控制机制的灵活性和易用性。1.1.3 中国安全操作系统的发展 我国的安全操作系统研究起步较晚,信息安全工作主要还是以网络防护为主,但任然开展了一系列的工作,并取得了一定的成绩。如:中科院软件所的红
15、旗安全操作系统RFSOS(RedFlag Secure OS)7;国防科技大学主持开发了银河麒麟服务器操作系统(KYLIN20);中科院计算所研究开发了Linux的入侵检测系统(Linux Intrusion Detection System,简记LIDS)8;南京大学开发了SoftOS服务器安全操作系统;中科院信息安全中心的SecLinux;信息产业部电子第三十研究所开发了强林Linux安全操作系统等。 1.2 本文研究内容及目标 本文先对安全操作系统现存的各种安全机制和安全框架进行分析,提出构建在LSM框架下的基于进程的访问控制,设计了其实现方法.第二章 安全机制及安全框架 2.1 安全机
16、制2.1.1 基本概念访问控制,是指控制系统中主体对客体的访问,也即根据访问主体和客体间的关系,来决定主体是否可以访问客体。这里的主体可以是进程等,客体可以是文件、目录等,访问可以是读、写和执行等9。 主体是指主动的实体,是访问的发起者,它造成了信息的流动和系统状态的改变,主体通常包括人、进程和设备。 客体是指包含或接受信息的被动实体,客体在信息流动中的地位是被动的,是处于主体的作用之下,对客体的访问意味着对其中所包含信息的访问。客体通常包括文件、设备、信号量和网络节点等。访问(Access)是使信息在主体(Subject)和客体(Object)之间流动的一种交互方式。访问控制决定了谁能够访问
17、系统,能访问系统的何种资源以及如何使用这些资源。适当的访问控制能够阻止未经允许的用户有意或无意地获取数据。访问控制的手段包括用户识别代码、口令、登录控制、资源授权(例如用户配置文件、资源配置文件和控制列表)、授权核查、日志和审计等等。访问控制涉及的领域很广,方法也很多,通常访问控制策略可以划分为自主访问控制、强制访问控制和基于角色的访问控制三种。 2.1.2 自主访问控制自主访问控制是一种最为普遍的访问控制手段,用户可以按自己的意愿对系统的参数做适当的修改以决定哪些用户可以访问他们的文件,亦即一个用户可以有选择地于其他用户共享他的文件。用户有自主的决定权。自主访问控制一个安全的操作系统需要具备
18、访问控制机制。它基于对主体及客体所属的主体组的识别,来限制对课题的访问,还要校验主体对客体的访问清酒是否符合存取控制规定来决定对客体访问的执行与否。这里所谓的自主访问控制是指主体可以自主地讲访问权,或访问权的某个子集授予其他主体。传统的自主访问控制模型是基于状态机设计的,系统的状态可以用三元组(S,O,A)表示,其中S表示系统中主体的集合,O表示系统中客体的集合,A表示二维的访问矩阵。在此访问矩阵中,主体用行来表示,客体用列来表示,主客体的交叉点就表示主体对客体所拥有的访问权限,此访问权限取决于访问权限有限集,如读、写、追加等。 图2.1访问矩阵通过上图的访问控制矩阵,对任意的,都相应的存在,
19、决定了主体可对客体可以进行何种操作。自主访问控制可以通过图2.2说明:图2.2 自主访问控制示意图2.1.3 强制访问控制强制访问控制是“强加”给访问主体的,即系统强制主体服从访问控制政策。强制访问控制(MAC)的主要特征是对所有主体及其所控制的客体(例如:进程、文件、段、设备)实施强制访问控制。为这些主体及客体指定敏感标记,这些标记是等级分类和非等级类别的组合,它们是实施强制访问控制的依据。系统通过比较主体和客体的敏感标记来决定一个主体是否能够访问某个客体。用户的程序不能改变他自己及任何其它客体的敏感标记,从而系统可以防止特洛伊木马的攻击。 强制访问控制技术的基本思想是:系统中的主体、客体被
20、赋予了相应的安全属性,系统通过比较主、客体安全属性间的关系来确定主体是否有访问客体的权限。安全属性是强制的,它是由安全管理员或操作系统按照限定的规则分配,用户或代表用户的进程不能修改安全属性,即使是用户拥有的客体的安全属性也不能被修改。如果系统认为具有某一安全属性的用户不能访问某个客体,则任何人(含客体的所有者)都不能使该用户具有访问此客体的权限,即系统独立于用户行为“强制”执行访问控制。 强制访问控制机制和自主访问控制机制最根本的区别在于强制访问控制是由系统(而不是属主)依据相应的访问规则来判断此次访问的合法性,对用户及用户程序的行为进行限制,而自主访问控制则是由资源的属主来决定谁可以对资源
21、进行何种访问,访问完全由资源属主决定。在实际应用中,某些关键资源的属主可能对系统和安全没有深入的了解,较难准确地设置资源的安全属性。强制访问控制可通过图2.3来说明 图2.3 强制访问控制示意图2.1.4 基于角色的访问控制基于角色的访问控制(Role Based Access Control)的基本思想是:在用户和访问许可权限之间引入角色(role)的概念,角色可以由安全管理员根据实际的 工作需要生成或取消,并分配给指定的用户,用户与角色相联系,角色与访问许可权限相联系,一个用户对应一个或多个角色,一个角色对应一个或多个访问许可权限1011。这样便可以通过给用户指派角色进行授权,从而实现了用
22、户与访问权限的分离,降低了用户对系统产生危害的可能性。 基于角色访问控制(RBAC)模型是目前国际上流行的先进的安全访问控制方法。它通过分配和取消角色来完成用户权限的授予和取消,并且提供角色分配规则。安全管理人员根据需要定义各种角色,并设置合适的访问权限,而用户根据其责任和资历再被指派为不同的角色。这样,整个访问控制过程就分成两个部分,即访问权限与角色相关联,角色再与用户关联,从而实现了用户与访问权限的逻辑分离。由于实现了用户与访问权限的逻辑分离,基于角色的策略极大的方便了权限管理。例如,如果一个用户的职位发生变化,只要将用户当前的角色去掉,加入代表新职务或新任务的角色即可。研究表明,角色/权
23、限之间的变化比角色/用户关系之间的变化相对要慢得多,并且给用户分配角色不需要很多技术,可以由行政管理人员来执行,而给角色配置权限的工作比较复杂,需要一定的技术,可以由专门的技术人员来担但是不给他们给用户分,这与现实中的情况正好一致。图2.4 RBAC模型结构图2.2 LSM通用安全框架2.2.1 LSM的由来近年来Linux系统由于其出色的性能和稳定性,开放源代码特性带来的灵活性和可扩展性,以及较低廉的成本,而受到计算机工业界的广泛关注和应用。但在安全性方面,Linux内核只提供了经典的UNIX自主访问控制(root用户,用户ID,模式位安全机制),以及部分的支持了POSIX.1e标准草案中的
24、capabilities安全机制,这对于Linux系统的安全性是不足够的,影响了Linux系统的进一步发展和更广泛的应用。有很多安全访问控制模型和框架已经被研究和开发出来,用以增强Linux系统的安全性,比较知名的有安全增强Linux(SELinux),域和类型增强(DTE),以及Linux入侵检测系统(LIDS)等等。但是由于没有一个系统能够获得统治性的地位而进入Linux内核成为标准;并且这些系统都大多以各种不同的内核补丁的形式提供,使用这些系统需要有编译和定制内核的能力,对于没有内核开发经验的普通用户,获得并使用这些系统是有难度的。在2001年的Linux内核峰会上,美国国家安全局(NS
25、A)介绍了他们关于安全增强Linux(SELinux)的工作,这是一个灵活的访问控制体系Flask在Linux中的实现,当时Linux内核的创始人Linus Torvalds同意Linux内核确实需要一个通用的安全访问控制框架,但他指出最好是通过可加载内核模块的方法,这样可以支持现存的各种不同的安全访问控制系统。因此,Linux安全模块(LSM)应运而生。Linux安全模块(LSM)是Linux内核的一个轻量级通用访问控制框架。它使得各种不同的安全访问控制模型能够以Linux可加载内核模块的形式实现出来,用户可以根据其需求选择适合的安全模块加载到Linux内核中,从而大大提高了Linux安全访
26、问控制机制的灵活性和易用性。目前已经有很多著名的增强访问控制系统移植到Linux安全模块(LSM)上实现,包括POSIX.1e capabilities,安全增强Linux(SELinux),域和类型增强(DTE),以及Linux入侵检测系统(LIDS)等等。在Linux2.4稳定版本系列和Linux2.5开发版本系列中,LSM作为内核补丁提供给用户,在Linux2.6稳定版本中,LSM被Linux内核接受成为Linux内核安全机制的标准,在各个Linux发行版中提供给用户使用。2.2.2 LSM设计思想Linux安全模块(LSM)的设计必须尽量满足两方面人的要求:让不需要它的人尽可能少的因此
27、得到麻烦;同时让需要它的人因此得到有用和高效的功能。以Linus Torvalds为代表的内核开发人员对Linux安全模块(LSM)提出了三点要求:真正的通用,当使用一个不同的安全模型的时候,只需要加载一个不同的内核模块 概念上简单,对Linux内核影响最小,高效,并且能够支持现存的POSIX.1e capabilities逻辑,作为一个可选的安全模块另一方面,各种不同的Linux安全增强系统对Linux安全模块(LSM)提出的要求是:能够允许他们以可加载内核模块的形式重新实现其安全功能,并且不会在安全性方面带来明显的损失,也不会带来额外的系统开销。为了满足这些设计目标,Linux安全模块(L
28、SM)采用了通过在内核源代码中放置钩子的方法,来仲裁对内核内部对象进行的访问,这些对象有:任务,inode结点,打开的文件等等。用户进程执行系统调用,首先游历Linux内核原有的逻辑找到并分配资源,进行错误检查,并经过经典的UNIX自主访问控制,恰好就在Linux内核试图对内部对象进行访问之前,一个Linux安全模块(LSM)的钩子对安全模块所必须提供的函数进行一个调用,从而对安全模块提出这样的问题是否允许访问执行?,安全模块根据其安全策略进行决策,作出回答:允许,或者拒绝进而返回一个错误。另一方面,为了满足大多数现存Linux安全增强系统的需要,Linux安全模块(LSM)采取了简化设计的决
29、策。Linux安全模块(LSM)现在主要支持大多数现存安全增强系统的核心功能:访问控制;而对一些安全增强系统要求的其他安全功能,比如安全审计,只提供了的少量的支持。Linux安全模块(LSM)现在主要支持限制型的访问控制决策:当Linux内核给予访问权限时,Linux安全模块(LSM)可能会拒绝,而当Linux内核拒绝访问时,就直接跳过Linux安全模块(LSM);而对于相反的允许型的访问控制决策只提供了少量的支持。对于模块功能合成,Linux安全模块(LSM)允许模块堆栈,但是把主要的工作留给了模块自身:由第一个加载的模块进行模块功能合成的最终决策。所有这些设计决策可能暂时影响了Linux安
30、全模块(LSM)的功能和灵活性,但是大大降低了Linux安全模块(LSM)实现的复杂性,减少了对Linux内核的修改和影响,使得其进入Linux内核成为安全机制标准的可能性大大提高;等成为标准后,可以改变决策,增加功能和灵活性。POSIX1e权能逻辑提供了授权被粗粒度访问机制拒绝的访问的功能。LSM将权能逻辑设计为一个可选的模块,如图2.5所示。首先像传统访问控制一样,由主体发起对客体的访问请求,然后进行对主体身份的标识,在进行传统的DAC检查时,如果用户ID检查失败,控制流程会通过调用LSM安全框架中的许可钩子函数,来询问具体模块中注册的相应函数,如果函数 允许覆盖DAC机制,那么安全模块就
31、可以对访问请求重新授权,否则拒绝访问。从对权能逻辑的处理流程也可以发现对每一现存的安全模型,通用框架都尽可能提供最小支持以维持框架的通用性和对系统的影响最小。 图 2.5 LSM权能逻辑框图 加入LSM安全框架后,用户进程对资源进行访问的执行过程如图2.6所示。首先用户进程发起对客体进行访问的需求,然后执行系统调用从而进入内核态,由Linux内核查找并分配资源,接着进行错误检查,并经过传统的UNIX自主访问控制,在Linux内核试图对内核客体进行访问之前,通用框架的钩子函数调用安全模块注册的函数,从而对安全模块提出问题“是否允许访问执行?”,安全模块根据其安全策略进行相应的操作。通过图26可以
32、看出,钩子函数是在最接近所需访问的客体的层次上插入的,这样可以 保证对内核的影响达到最小。因为所有的操作都会汇集到访问的发生点,钩子函数在这里可以满足各种安全项目的需求及设计简单的原则。 图2.6 LSM结构框图2.3 LSM设计分析Linux安全模块(LSM)目前作为一个Linux内核补丁的形式实现。其本身不提供任何具体的安全策略,而是提供了一个通用的基础体系给安全模块,由安全模块来实现具体的安全策略。其主要在五个方面对Linux内核进行了修改:在特定的内核数据结构中加入了安全域;在内核源代码中不同的关键点插入了对安全钩子函数的调用; 加入了一个通用的安全系统调用 ;提供了函数允许内核模块注
33、册为安全模块或者注销; 将capabilities逻辑的大部分移植为一个可选的安全模块。2.3.1 LSM设计分析 下面对这五个方面的修改逐个做简要的介绍。 (一) 安全域是一个void*类型的指针,它使得安全模块把安全信息和内核内部对象联系起来。下面列出被修改加入了安全域的内核数据结构,以及各自所代表的内核内部对象:task_struct结构:代表任务(进程) linux_binprm结构:代表程序super_block结构:代表文件系统 inode结构:代表管道,文件,或者Socket套接字 file结构:代表打开的文件 sk_buff结构:代表网络缓冲区(包) net_device结构:
34、代表网络设备 kern_ipc_perm结构:代表Semaphore信号,共享内存段,或者消息队列 msg_msg:代表单个的消息 另外,msg_msg结构,msg_queue结构,shmid_kernel结构被移到include/linux/msg.h和include/linux/shm.h这两个头文件中,使得安全模块可以使用这些定义。 (二) Linux安全模块(LSM)提供了两类对安全钩子函数的调用:一类管理内核对象的安全域,另一类仲裁对这些内核对象的访问。对安全钩子函数的调用通过钩子来实现,钩子是全局表security_ops中的函数指针,这个全局表的类型是security_opera
35、tions结构,这个结构定义在include/linux/security.h这个头文件中,这个结构中包含了按照内核对象或内核子系统分组的钩子组成的子结构,以及一些用于系统操作的顶层钩子。在内核源代码中很容易找到对钩子函数的调用:其前缀是security_ops-。对钩子函数的详细说明留到后面。(三)Linux安全模块(LSM)提供了一个通用的安全系统调用,允许安全模块为安全相关的应用编写新的系统调用,其风格类似于原有的Linux系统调用socketcall(),是一个多路的系统调用。这个系统调用为security(),其参数为(unsigned int id, unsigned int ca
36、ll, unsigned long *args),其中id代表模块描述符,call代表调用描述符,args代表参数列表。这个系统调用缺省的提供了一个sys_security()入口函数:其简单的以参数调用sys_security()钩子函数。如果安全模块不提供新的系统调用,就可以定义返回-ENOSYS的sys_security()钩子函数,但是大多数安全模块都可以自己定义这个系统调用的实现。(四) 在内核引导的过程中,Linux安全模块(LSM)框架被初始化为一系列的虚拟钩子函数,以实现传统的UNIX超级用户机制。当加载一个安全模块时,必须使用register_security()函数向Lin
37、ux安全模块(LSM)框架注册这个安全模块:这个函数将设置全局表security_ops,使其指向这个安全模块的钩子函数指针,从而使内核向这个安全模块询问访问控制决策。一旦一个安全模块被加载,就成为系统的安全策略决策中心,而不会被后面的register_security()函数覆盖,直到这个安全模块被使用unregister_security()函数向框架注销:这简单的将钩子函数替换为缺省值,系统回到UNIX超级用户机制。另外,Linux安全模块(LSM)框架还提供了函数mod_reg_security()和函数mod_unreg_security(),使其后的安全模块可以向已经第一个注册的主
38、模块注册和注销,但其策略实现由主模块决定:是提供某种策略来实现模块堆栈从而支持模块功能合成,还是简单的返回错误值以忽略其后的安全模块。这些函数都提供在内核源代码文件security/security.c中。(五) Linux内核现在对POSIX.1e capabilities的一个子集提供支持。Linux安全模块(LSM)设计的一个需求就是把这个功能移植为一个可选的安全模块。POSIX.1e capabilities提供了划分传统超级用户特权并赋给特定的进程的功能。Linux安全模块(LSM)保留了用来在内核中执行capability检查的现存的capable()接口,但把capable()函
39、数简化为一个Linux安全模块(LSM)钩子函数的包装,从而允许在安全模块中实现任何需要的逻辑。Linux安全模块(LSM)还保留了task_struck结构中的进程capability集(一个简单的位向量),而并没有把它移到安全域中去。Linux内核对capabilities的支持还包括两个系统调用:capset()和capget()。Linux安全模块(LSM)同样保留了这些系统调用但将其替换为对钩子函数的调用,使其基本上可以通过security()系统调用来重新实现。Linux安全模块(LSM)已经开发并且移植了相当部分的capabilities逻辑到一个capabilities安全模块
40、中,但内核中仍然保留了很多原有capabilities的残余。这些实现方法都最大程度的减少了对Linux内核的修改影响,并且最大程度保留了对原有使用capabilities的应用程序的支持,同时满足了设计的功能需求。以后要使capabilities模块完全独立,剩下要做的主要步骤是:把位向量移到task_struct结构中合适的安全域中,以及重新定位系统调用接口。2.3.2 接口说明:给内核开发人员和安全研究人员使用的钩Linux安全模块(LSM)对于内核开发人员和安全研究人员的价值就在于:可以使用其提供的接口将现存的安全增强系统移植到这一框架上,从而能够以可加载内核模块的形式提供给用户使用;
41、或者甚至可以直接编写适合自己需要的安全模块。Linux安全模块(LSM)提供的接口就是钩子,其初始化时所指向的虚拟函数实现了缺省的传统UNIX超级用户机制,模块编写者必须重新实现这些钩子函数来满足自己的安全策略。下面简要介绍Linux安全模块(LSM)提供的钩子,详细情况请参考源代码,特别是include/linux/security.h头文件中security_operations结构的定义。至于具体如何根据自己需要的安全策略编写安全模块,可以参考SELinux,DTE,LIDS等系统的安全模块实现。首先是任务钩子,Linux安全模块(LSM)提供了一系列的任务钩子使得安全模块可以管理进程的
42、安全信息并且控制进程的操作。模块可以使用task_struct结构中的安全域来维护进程安全信息;任务钩子提供了控制进程间通信的钩子,例如kill();还提供了控制对当前进程进行特权操作的钩子,例如setuid();还提供了对资源管理操作进行细粒度控制的钩子,例如setrlimit()和nice()。其次是程序装载钩子。很多安全模块,包括Linux capabilities,SELinux,DTE都需要有在一个新程序执行时改变特权的能力。因此Linux安全模块(LSM)提供了一系列程序装载钩子,用在一个execve()操作执行过程的关键点上。linux_binprm结构中的安全域允许安全模块维护
43、程序装载过程中的安全信息;提供了钩子用于允许安全模块在装载程序前初始化安全信息和执行访问控制;还提供了钩子允许模块在新程序成功装载后更新任务的安全信息;还提供了钩子用来控制程序执行过程中的状态继承,例如确认打开的文件描述符。再次是进程间通信IPC钩子。安全模块可以使用进程间通信IPC钩子来对System V IPC的安全信息进行管理,以及执行访问控制。IPC对象数据结构共享一个子结构kern_ipc_perm,并且这个子结构中只有一个指针传给现存的ipcperms()函数进行权限检查,因此Linux安全模块(LSM)在这个共享子结构中加入了一个安全域。为了支持单个消息的安全信息,Linux安全
44、模块(LSM)还在msg_msg结构中加入了一个安全域。Linux安全模块(LSM)在现存的ipcperms()函数中插入了一个钩子,使得安全模块可以对每个现存的Linux IPC权限执行检查。由于对于某些安全模块,这样的检查是不足够的,Linux安全模块(LSM)也在单个的IPC操作中插入了钩子。另外还有钩子支持对通过System V消息队列发送的单个消息进行细粒度的访问控制。下面是文件系统钩子。对于文件操作,定义了三种钩子:文件系统钩子,inode结点钩子,以及文件钩子。Linux安全模块(LSM)在对应的三个内核数据结构中加入了安全域,分别是:super_block结构,inode结构,
45、file结构。超级块文件系统钩子使得安全模块能够控制对整个文件系统进行的操作,例如挂载,卸载,还有statfs()。Linux安全模块(LSM)在permission()函数中插入了钩子,从而保留了这个函数,但是也提供了很多其他inode结点钩子来对单个inode结点操作进行细粒度访问控制。文件钩子中的一些允许安全模块对read()和write()这样的文件操作进行额外的检查;还有文件钩子允许安全模块控制通过socket IPC接收打开文件描述符;其他的文件钩子对像fcntl()和ioctl()这样的操作提供细粒度访问控制。接下来是网络钩子。对网络的应用层访问使用一系列的socket套接字钩子
46、来进行仲裁,这些钩子基本覆盖了所有基于socket套接字的协议。由于每个激活的用户socket套接字有伴随有一个inode结构,所以在socket结构或是更底层的sock结构中都没有加入安全域。socket套接字钩子对有关进程的网络访问提供了一个通用的仲裁,从而显著扩展了内核的网络访问控制框架(这在网络层是已经由Linux内核防火墙netfilter进行处理的)。例如sock_rcv_skb钩子允许在进入内核的包排队到相应的用户空间socket套接字之前,按照其目的应用来对其进行仲裁。另外Linux安全模块(LSM)也为IPv4,UNIX域,以及Netlink协议实现了细粒度的钩子,以后还可能
47、实现其他协议的钩子。网络数据以包的形式被封装在sk_buff结构(socket套接字缓冲区)中游历协议栈,Linux安全模块(LSM)在sk_buff结构中加入了一个安全域,使得能够在包的层次上对通过网络层的数据的安全信息进行管理,并提供了一系列的sk_buff钩子用于维护这个安全域的整个生命周期。硬件和软件网络设备被封装在一个net_device结构中,一个安全域被加到这个结构中,使得能够在设备的层次上维护安全信息。最后是其他的钩子。Linux安全模块(LSM)提供了两种其他系列的钩子:模块钩子和顶层的系统钩子。模块钩子用来控制创建,初始化,清除内核模块的内核操作。系统钩子用来控制系统操作,例如设置主机名,访问I/O端口,以及配置进程记帐。虽然现在的Linux内核通过使用capability检查对这些系统操作提供了一些支持,但是这些检查对于不同操作差别很大并且没有提供任何参数信息。2.4本章小结本章主要对Linux的安全机制和安全框架进行的分析和研究,并给出了通过LSM安全框架来实现内核安全模块的方法。第三章 基于进程的访问控制的设计3.1 基于进程的访问控制提出在传统的访问控制中用户可以自主地将访问权,或访问权的某个子集授权给其他主体,并以此来判断对客体的操作。然而用