SELinux
SELinux
一、简介
SELinux(Security-Enhanced Linux):是美国国家安全局(NSA)联合其他安全机构(比如SCC公司)共同开发的Linux的一个强制访问控制的安全模块,旨在增强传统Linux操作系统的安全性,它的安全性能优于通过文件权限和ACL实现的自主访问控制。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中。
二、访问控制系统的特点
1、DAC
DAC(Discretionary Access Control,自由访问控制):是Linux的默认访问控制方式,也就时依据用户的身份和该身份对文件及目录的rwx权限来判断是否可以访问。不过,再DAC访问控制的实际使用中我们也发现了一些问题:
1)root权限过高,rwx权限对root用户并不生效,一旦root用户被窃取或者root用户本身的误操作,都是Linux系统的致命威胁。
2)Linux默认权限过于简单,只有所有者、所属组和其他人的身份,权限也只有读、写和执行权限,并不利于权限细分与设定
3)不合理权限的分配会导致严重后果,比如给系统敏感文件或目录设定777权限,或给美感文件设定特殊权限——SetUID权限等
2、MAC
MAC(Mandatory Access Control,强制访问控制):是通过SELinux 的默认策略规则控制特定的进程对系统的文件资源的访问。也就是说,即使你是root用户,但是当你访问文件资源时,如果使用了不正确的进程,那么也是不能访问这个文件资源的
注:再SELinux中,Linux的默认权限还是有作用的,也就是说:一个用户要访问一个文件,既要求这个用户的权限符合rwx权限,也要求这个用户的进程符合SELinux的规定。
3、举例
假设apache上发现了一个漏洞,使得某个远程用户可以访问系统的敏感文件(如/etc/shadow)。如果我们的Linux中启用了SELinux,那么。因为apache服务的进程并不具备访问/etc/shadow的权限,所以这个远程用户通过apache访问/etc/shadow文件就会被SELinux所阻挡,起到保护Linux系统的作用。
三、SELinux详解
对象(object):就是需要访问的资源,包括文件、目录和进程、端口等
主体(subject):进程是主体;就是想要访问文件或目录资源的进程。想要得到资源,基本流程是这样的:由用户调用命令,由命令产生进程,由进程去访问文件或目录资源。在自主访问控制系统中(Linux默认权限中)靠权限控制的主体时用户;而在强制访问系统中(SELinux中)靠策略规则的主题则是进程。
策略(Policy):Linux系统中进程与文件的数量庞大,那么限制进程是否可以访问文件的SELinux规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么SELinux的可用性就会极低。还好我们不用手动定义规则,SELinux默认定义了几个策略,规则都在这几个策略中写好了,默认只要调用就可以正常使用了:
Strict:CentOS 5,每个进程都受到selinux的控制
targeted:用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,CentOS 5保护88个服务
minimum:CentOS 7,修改的targeted,只对选择的网络服务
mls:提供MLS(多级安全)机制的安全性
targeted为默认类型,minimum和mls稳定性不足,未加以应用,strict已不再使用
安全上下文(Security Context):每个进程、文件和目录都有自己的安全上下文,进程具体是否能够访问文件或目录,就要看这个安全上下文是否匹配。如果进程的安全上下文和文件或目录的安全上下文能够匹配,则该进程可以访问这个文件或目录。当然,判断进程的安全上下文和文件或目录的安全上下文是否匹配,则需要依靠策略中的规则。
举例:
我们需要找对象,男人可以看作主题,女人就是目标了。而男人是否可以追到女人(主体是否可以访问目标),主要看两个人的性格是否合适(主题和目标的安全上下文是否匹配)。不过,两个人的性格是否合适,是需要生活习惯、为人处世、家庭环境等具体的条件来进行判断的(安全上下文是否匹配是需要通过策略中的规则来确定)。
SELinux对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。domain标签能够执行的操作由安全策略里定义。
当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC(访问矢量缓存,Acess Vector Cache),在AVC中,subject和object的权限被缓存(cached),查找‘应用+文件’的安全环境,然后根据查询结果允许或拒绝访问。
当主体想要访问目标时,如果系统中SELinux模式为Enforcing,则主体的访问请求首先需要和SELinux中定义好的策略进行匹配;如果进程负荷策略中定义好的规则,则允许访问,这时进程的安全上下文就可以和目表的上下文进行匹配;如果比较失败,则拒绝访问,并通过AVC生成拒绝访问信息。如果安全上下文匹配,则可以正常访问目标文件。当然,最终是否可以真正地访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的读、写、执行权限。
四、SELinux工作模式
SELinux提供了三种工作模式:Disabled、Permissive和Enforcing,而每种模式都为Linux系统提供了不同的用处:
1)Disable工作模式(关闭模式)
在Disable模式中,SELinux被关闭,默认的DAC访问控制方式被使用。对于那些不需要增强安全性的环境来说,该模式是非常有用的。
例如:若从你的角度看正在运行的应用程序工作正常,但是却产生了大量的SELinux AVC拒绝消息,最终可能会填满日志文件,从而导致系统无法使用。在这种情况下,最直接的解决方法就是禁用SELinux,当然,你也可以在应用程序所访问的文件上设置正确的安全上下文。
需要注意的是,在禁用SELinux之前,需要考虑以下是否可能会在系统上再次使用SELinux,如果决定以后将其设置为Enforcing或Permissive,那么当下次重启系统时,系统将会通过一个自动SELinux文件重新进程标记
2)Permissive工作模式(宽容模式)
在Permissive模式中,SELinux被启用,但安全策略并没有被强制执行。当安全策略规则应该拒绝访问时,访问仍被允许。然而,此时会向日志文件发送一条信息,表示该访问应该被拒绝。
SELinux Permissive模式主要用于以下几种情况:
审核当前的SELinux策略规则:
测试新应用程序,看看将SELinux策略规则应用到这些程序时会有什么效果;
解决某一特定服务或应用程序在SELinux下不再正常工作的故障;
3)Enforcing工作模式(强制模式)
在Enforcing模式中,SELinux被启动,并强制执行所有的安全策略规则。
五、SELinux配置文件
SELinux配置只能由root用户进行设置和修改。配置和策略文件位于/etc/selinux目录中,主配置文件为/etc/selinux/config文件,该文件内容如下:
主配置文件中,除去以"#"符号开头的注释行,有效配置仅有两行:
SELINUX=enforcing:为SELinux默认的工作模式,有效值还可以为:disable和permissive
SELINUXTYPE=targeted:用于指定SELinux的默认策略
六、SELinux安全上下文
SELinux管理过程中,进程是否可以正确访问文件资源,取决于它们的安全上下文。进程和文件都有自己的安全上下文,SELinux会为进程和文件添加安全信息标签,比如SELinux用户、角色、类型、类别等,当运行SELinux后,所有这些信息都将作为访问控制的依据。
示例:
[root@localhost ~]# ls -Z #查看当前目录中文件的安全上下文
[root@localhost ~]# ls -Zd /var/www/html/ #查看目录的安全上下文
[root@localhost ~]# ps axZ | grep httpd #查看进程的安全上下文
传统Linux,遵从一切皆文件,由用户、组、权限控制访问。
在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素控制其访问。
所有文件和端口资源和进程都具备标签:安全上下文
system_u :system_r :httpd_t :s0 :[类别]
user :role :type :sensitivity :[category]
安全上下文由五个元素组成:
user(用户):指示登录系统的用户类型,进程;如system_u为系统服务进程,是受到管制的,unconfined_u为不管制的进程,用户自己开启的。举例:创建文件:system_u是系统进程创建的文件,unconfined_u是用户自己的创建的文件
Role(角色):定义文件,进程和用户的用途:进程:system_r为系统服务进程,受到管制;unconfied_r为不管制进程,通常都是用户自己开启的。
Type(类型):类型字段是安全上下文中最重要的字段,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全桑下文类型字段相匹配,如果匹配则可以访问。
注:类型字段在文件或目录的安全上下文中被称为类型(type),但是在进程的安全上下文中被称作域(domain)。也就是说,在主体(subject)的安全上下文中,这个字段被称为域;在目标(object)的安全上下文中,这个字段被称为类型。域和类型需要匹配(进程的类型要和文件的类型相匹配),才能访问。
apache进程的域时httpd_t,/var/www/html/目录的类型是httpd_sys_content_t,这个主体的安全上下文类型经过策略规则的比对,是和目标的安全上下文类型匹配的,所以,apahce进程可以访问/var/www/html/目录
Sensitivity(灵敏度):一般使用s0、s1、s2来命名的,数字代表灵敏度的分级。数值越大,代表灵敏度越高。
Category(类别):对于特定组织划分不分层的分类。