SELinux概述

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

SELinux使用了分级的强制访问控制,是Linux内核的重要安全措施。SELinux的安全策略工具可从下载。本章分析了SELinux的安全机制,介绍了安全策略配置语言、内核策略库的结构,简述了SELinux内核模块的实现,还分析了用户空间的客体管理器。3.1SELinux概述SELinux是安全增强了的Linux,是Security-enhancedLinux的简写,SELinux改进了对内核对象和服务的访问控制,改进了对进程初始化、继承和程序执行的访问控制,改进了对文件系统、目录、文件和打开文件描述的访问控制,还改进了对端口、信息和网络接口的访问控制。早期的Linux内核只提供了经典的UNIX自主访问控制(root用户,用户ID,模式位安全机制),以及部分地支持了POSIX.1e标准草案中的capabilities安全机制,这对于Linux系统的安全性是不够的,NSA(theNationalSecurityAgency)和SCC(SecureComputingCorporation)共同开发了强大的基于类型加强(TypeEnforcement)的强制访问控制(mandatoryaccesscontrol,简称MAC)机制,提供了动态的安全策略机制。Linux内核增加了一个通用的安全访问控制框架,它通过hook函数来控制程序的执行,这个框架就是Linux安全模块(LSM),在LSM上可使用各种安全控制机制(如:Flask机制)来实现对程序的控制。SELinux应用了类型加强(TypeEnforcement,TE)和基于角色访问控制(role-basedaccesscontrol,RBAC)技术。TE给每个主体(进程)和系统中的客体定义了一个类型,这些类型定义在SELinux的安全策略文件中,以安全标签形式存放在文件本身的扩展属性(extendedattributes,简称xattrs)里。当一个类型与一个进程相关时,这个类型称为域(domain),例如:后台进程httpd的域为httpd_t。主体(subject)对客体(object)的操作在SELinux中默认下是不允许的,而由策略定义允许的操作。TE使用主体的域和客体类型从策略文件中查找操作许可。例如:策略中的一条规则如下:allowhttpd_tnet_conf_t:file{readgetattrlockioctl};这条规则表示httpd_t域对net_conf_t类型客体的文件有“{}”中所表示的操作权限。SELinux的访问控制规则存放在安全策略文件中,策略文件分为二进制和源代码文件,源代码以策略配置语言的形式描述,由编程者创建和维护。源代码经策略配置工具编译后生成二进制文件。二进制策略被装载到内核空间,形成在内存中的策略库及缓存,内核就可以使用访问控制规则了。SELinux可以实现非常小颗粒的访问控制,这些细小颗粒的访问控制也造成了安全策略的复杂性。Linux内核的SELinux安全体系由Flask和LSM框架共同组成,LSM是由hook函数组成的安全控制框架,Flask框架将SElinux的策略规则转换成访问控制许可。在安全策略配置语言中经常用到的名称术语说明如下。subject主体,常指一个进程object客体,常指一个文件objectclass客体的类permission许可context上下文user用户role角色type类型TypeAttributes类型属性TypeEnforcement类型增强dormain域,它是一个进程的类型sourcetype源类型targettype目标类型labeling标识accessvectorcache(AVC)访问向量缓存accessdecision访问决策3.1.1Linux与SELinux在安全管理上的区别在传统的Linux自由访问控制(DiscretionaryAccessControls,DAC)之后,SELinux在内核中使用强制访问控制机制(MAC)检查允许的操作。在DAC下,文件客体的所有者提供了客体上的潜在风险控制。用户可以通过错误配置的chmod命令和一个非期望的访问权限传递,暴露一个文件或目录给一个恶意信任者。这个用户启动的进程,如:CGI脚本,可在这个用户拥有的文件做任何的操作。DAC实际上仅有两个主要的用户分类:管理者和非管理者。为了解决权限分级,它使用了访问控制列表(accesscontrollists,简称ACL),给非管理者用户提供不同的权限。而root用户对文件系统有完全自由的控制权。MAC访问控制框架可以定义所有的进程(称为主体)对系统的其他部分(如:文件、设备、socket、端口和其他进程,它们被称为客体或目标对象)进行操作的权限或许可。这些许可由进程和客体的安全策略来定义,通过内核实现控制。这种方式可给一个进程仅授予操作所需要的权限,这遵循了最小权限原则。在MAC下,即使用户用chmod暴露了他们的数据,但进程还是无法修改在策略中没有许可的文件。DAC和MAC分别使用自己的访问控制属性,两者独立,但都必须通过权限检查。它们的区别有以下二个:1.在主体的访问控制上:DAC:真实有效的用户和组IDMAC:安全上下文(user:role:type)DAC和MAC的UID是独立的。2.在客体的访问控制上:DAC:(文件)访问模式(rwxr-xr-x)和用户及组IDMAC:安全上下文(user:role:type)3.1.2Flask安全框架概述1.Flask框架对操作许可的判定过程图3-1描述了Flask框架,图中,一个主体进程对系统中的客体(如:设备文件)进行操作,如:读写文件。这个操作通过DAC权限检查之后,再进行SELinux的权限检查。在DAC检查中,主体通过基于ACL常规文件权限获得了对客体的操作许可。SELinux权限检查的过程如下:策略强制服务器(policyenforcementserver)从主体和客体收集安全上下文,并发送安全上下文标签对给安全服务器(securityserver),安全服务器负责产生策略的决策。策略强制服务器首先检查AVC,如果AVC有高速缓存的策略决策,它返回决策给策略强制服务器。如果没有,它转向到安全服务器,安全服务器使用系统初始化期间装载到内核的二进制策略作出决策,将决策放到AVC的cache中进行缓存,并将决策返回给策略强制服务器。如果决策为允许操作,则主体对客体进行操作,否则,操作被禁止,禁止操作信息被记录到log文件,log文件一般为/var/log/messages。图3-1Flask框架安全服务器产生策略决策的同时,强制服务器处理任务的其他部分。从这个角度来看,强制服务器部分可以看作客体管理器,客体管理包括用安全上下文件标识客体、管理内存中的标签、管理客户端和服务器的标识行为。2.Flask框架组成说明Flask安全体系结构由客体管理器和安全服务器组成。客体管理器实施安全策略的判定结果,安全服务器作出安全策略的判定。Flask安全体系结构提供从安全服务器检索访问、标记和多例化判定的接口。访问判定指主体对客体操作的一个权限是否得到批准。标记指分配给一个客体的安全属性标签。多例化判定指一个特定的请求应该从多例化资源中选取哪一个。Flask安全体系结构还提供一个访问向量缓存(AVC)模块,该模块允许从客体管理器缓存中直接取出缓存的判定结果,以提高执行速度。Flask框架的安全服务器的安全策略由四个子策略组成:多级安全(MLS)策略、类型加强(TE)策略、基于标识的访问控制(IBAC)策略和基于角色的访问控制(RBAC)策略。安全服务器提供的访问判定必须满足每个子策略的要求。安全服务器定义了一个由类型加强(TE)策略、基于角色的访问控制(RBAC)策略和多级安全(MLS)策略组合成的策略决策系统。其中,TE和RBAC策略是安全策略的必要部分,MLS策略是可选的,当内核配置选项CONFIG_FLASK_MLS打开时,系统提供MLS策略支持。Flask体系结构为安全标记定义了两个独立于策略的数据类型:安全上下文(context)和安全标识符(SID)。安全上下文是由可变长字符串表示的安全标记,存在于文件的扩展属性中。SID是被安全服务器映射到对应安全上下文的整数。Flask客体管理器负责将安全标签绑定到客体上、绑定SID到内核对象上。一个安全上下文(或称为标签)由用户ID、角色、类型和可选的MLS分级属性或分类属性组成。角色仅与进程相关,因而文件安全上下文有一个通用的object_r的角色。安全服务器仅为安全上下文提供SID。SELinux系统提供一个与安全服务器相配套的安全策略配置语言,该语言用于对安全服务器中安全策略的配置进行描述。策略配置语言描述的规则策略存于策略文件中,策略文件源代码由工具编译成二进制策略文件,安全服务器在引导时读取二进制形式策略文件,形成策略库。3.MLS分级机制MLS(Multi-LevelSecurity)机制给用户提供了可以用不同等级的安全水平来访问系统。例如:MLS安全分级从低到高为Confidential、Secret、TopSecret和Individuals,不同级别可查看不同的分类信息。低级别不可查看高级别的文档。SELinux支持分级保护数据,它使用BLP(Bell-LaPadulaModel:BLP)模型,这个模型定义了系统内的信息是如何基于粘附在每个主体和客体的标签来进行流动的。如:在Secret级别的用户可与其他同级别用户共享数据,并能提取来自Confidential级(比Secret级低)的信息。但在Secret级别的进程不能查看TopSecret级别(比Secret级高)的数据。它还阻止高级别进程随便给低级别的数据写入信息。即“不能读较高级别的数据,不能写较低级别的数据”模型。在多级别系统中,高级别用户不自动获得管理者权限,但它们对计算机上的所有信息可以有访问权。安全上下文中,主体和客体用安全级别(SecurityLevels,SL)标识,SL由敏感属性和分类属性组成。Sensitivity(敏感属性)是安全体系的属性,它将数据等分成不同安全级别,如:“Secret”或“TopSecret”。Categories(分类属性)是一套非体系的属性,如:“USOnly”或“UFO”,表示仅US使用。分类属性将数据分隔成几个独立的小组,每个小组可归属于不同的用户等。一个SL必须有一个敏感属性和0个或多个分类属性。例如:SL是{Secret/UFO,Crypto}、{TopSecret/UFO,Crypto,Stargate}或{Unclassified}。体系的敏感属性跟踪着0个或多个分类属性,因为敏感属性还可以分隔成彼此独立的分类属性。客体上的安全级别称为分级(Classifications),主体上的安全级别称为Clearances。3.1.3安全模块(LSM)框架为了加入安全机制,Linux内核从以下五个方面进行了修改:1.在内核的构件描述数据结构中加入了安全域。2.在内核不同的构件中加入了对安全钩子函数的调用。3.提供了通用安全模块。4.将capabilities逻辑的大部分移植为一个可选的安全模块。5.加入了安全系统调用。安全域是一个void*类型的指针,它指向安全模块操作函数,从而将安全信息和内核对象联系起来。下面列出加入了安全域的内核数据结构:task_struct进程结构linux_binprm二进制程序运行结构super_block文件系统超级块结构inode文件系统节点结构,表示文件、目录、管道、设备文件或socket套接字file打开的文件结构sk_buff网络包缓冲区结构net_device网络设备结构kern_ipc_permIPC(进程间通信)权限结构msg_msg:消息结构Linux安全模块(LSM)提供了各种安全钩子(hook)函数,都在全局类型security_operations结

1 / 88
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功