SElinux(Security Extend linux)

Red hat Enterprise 5支持内核实施的一项新的安全策略:SElinux。SElinux是由美国国防部让安全局针对计算机基础结构开发的,SElinux允许管理员定义高度灵活的策略,让linux内核把它作为日常操作的一部。

SElinux将每个程序都编入到SElinux域内,同时将每个资源放在SElinux安全上下文中,然后根据SElinux策略定义哪个进程可以访问哪些资源。

Redhat 5支持的SElinux策略叫做目标策略,只影响指定的网络守护进程。在目标策略中,只有目标进程受到SElinux的限制,其它进程则不受限制,目标策略只影响常用的网络应用程序,在RHEL5中,受限制的网络服务程序数量在200个以上,SElinux限制的典型应用程序如下:

dhcpd、vsftpd、httpd、mysqld、nscd、named、portmap、squid、syslogd等

SElinux的三种状态模式:

1、 Enforcing:强制模式,此模式情况下,任何违反SElinux策略的行为都被禁止,并被作为内核信息记录下来,图形界面下会跳出来一个×××五角星提醒你,并提供解决办法,命令行下运行tail  /var/log/messages |grep  run命令,将过滤出来的内容复制run后面的内容运行。

2、 Permissive:警告模式,此模式情况下,任何违反SElinux策略的行为都不会被阻挡,只是会提醒警告用户,这个模式可以排错用。

3、 Disabled:关闭模式,此模式是不启用SElinux,和没有它是一样的。

SElinux配置文件:/etc/sysconfig/selinux,如图:

可以通过修改它改变SElinux状态;SELINUXTYPE参数用于指定SElinux使用什么策略模块保护系统,在RHEL5中默认使用的为targeted模块,这个模块是由redhat开发的策略模块,只对Apache、sendmail、bind等网络服务进行保护,不属于这些服务的就都属于unconfined_t,该模块可导入性高,可用性好,但不能对整体进行保护。

也可以在图形化界面下打开终端输入system-config-securitylevel,通过图形界面改变它的工作状态,如图:

需要注意的是:SElinux状态在强制模式和警告模式之间切换是不用重启计算机的,如果改成禁止模式后则必须要重启计算机才能生效。

那么怎么判断它当前的状态呢?通过命令即可查看:

getenforce:判断SElinux现在处于什么状态

setenforce:转换成强制或警告模式(setenforce  1转换成强制模式,setenforce  0转换成警告模式),如图:

每个进程都属于一个SElinux域(domain),而每一个文件都被赋予一个SElinux上下文的context值,那么如何查看它们的contex值呢?

使用命令ls  -Z 或ps  -Z查看上下文contex值,如图:

上面红色方框中的文件SElinux上下文或SElinux域格式字符串以冒号作为字段分隔,第一个字段为用户标识第二个字段为角色(role),root和user_u表示文件是根用户或普通用户建立的,第三个字段为类型,第四个为扩展的MIS或MCS,这里我们只关心第三个字段就可以了。

这里我们还可以看到,大部分的网络守护进程与系统进程都属于特定的域类型,而sshd和ps ax -Z命令的进程域的类型确都是unconfined_t,说明它们的进程不受任何SElinux上下文的限制,特别是用户交互式shell,任何用户交互式shell开始的进程(除了一些特例外)都不受SElinux目标策略的影响。

下面来举例说明文件上下文contex值的定义与SElinux的访问控制:

如图分别为不同目录下的文件context值:

仔细看上图就会发现tmp目录下的index.html文件context值第三个字段是tmp_t,而html目录下的index.html文件context值第三个字段为httpd_sys_content_t,下面我们在分别来看它们两个文件的上一级目录context值,如图:

由此可以看出文件的context值是受上一级目录影响的,一般情况下它们会继承上一级目录的context值,一些安装服务产生的文件context值会例外,不继承上级目录的context值,服务会自动创建它们的context值,比如没有装http服务的时候/var/目录下时没有www目录的,安装httpd服务后该服务会自动创建出所需的目录,并定义与服务相关的目录及文件才context值,它们并不会继承上级目录的context值,如图是var目录的context值:

这个是安装httpd软件包后的www目录context值:

 

通过上面的两个截图你会看出来由服务定义的目录文件context值是不继承它们的上一级目录的。

我们知道了文件的context值是怎么定义的了,那么到底context值会给我们带来什么影响,它是怎么控制服务以及我们怎么解决呢?下面就以http服务来举例说明。

首先我们把/var/www/html目录下的index.html文件的context值第三段改为tmp_t,至于怎么更改会在后面说明,如图:

在没有更改前我们是能够正常访问网站的,如图:

当我们更改了此文件的context值后,网站就会变得的不能正常访问,并且会跳出一个×××五角星提示你SElinux设置有误,如图:

 

这里跳出×××五角星提示你错误,并且提供解决办法,你点击×××五角星会出来一个对话框,里面有详细的说明信息以及解决办法,按照提示修改后即可访问,如图:

知道了SElinux上下文文件context值的作用后就要了解怎么修改文件的context值了,下面介绍修改文件context值的命令:

chcon  -t  tmp_t  /var/www/html/index.html  //修改文件的context值

restorecon  -v  /var/www/html/index.html //根据SElinux的目标策略恢复文件的安全上下文(context值)

restorecon  -R(recursion)  -v  /var/www/html //根据SElinux的目标策略恢复html目录下所有文件的安全上下文(context值)

运行提示命令恢复文件的context值后网站访问即可恢复正常!

如果我们是在字符界面下,没有装图形界面该怎么办呢?这个时候就要求救于我们伟大的日志了!

首先运行tail  /var/log/messages  |grep  run,如图:

然后根据提示运行run后面的内容就会出来解决办法,如图:

看到了吧,与图形界面下出来的解决办法一模一样,呵呵,这下不管在什么界面下都能解决问题了吧!

如果这个软件包没有安装怎么办呢?首先使用rpm  -qf查看这个服务是属于哪个软件包,之后再使用yum安装上,/etc/init.d/setroubleshoot  restart重启服务即可,如图:

注:若软件包安装上了,且一切正常但是×××五角星就是不跳出来可使用sealert  -b命令让详细的提示信息对话框弹出来!

有的人或许会问了,我要查看每个文件的context值怎么办呢?总不能一个个文件查看吧,呵呵,大可不必,所有文件的context值都存放在/etc/selinux/targeted/contexts/files目录下,你可以用cat查看!

图形化界面下运行system-config-selinux查看,如图:

 

如果标签被你修改混乱无法解决后,可在这里勾上一个选项使系统在重新启动后重打标签,如图:

 

勾上这个勾之后你之前所做的操作都将被清除,那么我们如何让系统在重打标签后不改变你之前定义的文件context值呢?

你可以通过以上图形化界面将该文件context值添加进去,若是在字符界面下可运行semanage  fcontext  -a  -t  httpd_sys_content_t  ‘/myweb/html(/.*)?’命令添加进去,这样在系统重启重打标签后就不会改变你自己定义的文件或目录context值了!

Managing  Boole(管理SElinux布尔值)

什么是SElinux布尔值呢?SEliux布尔值就相当于一个开关,精确控制SElinux对某个服务的某个选项的保护,比如ftp服务,如图:

说明:getsebool -a //查看sebool值

  setsebllo -P //设置sebool值

举例:getsebool -a |grep  ftp

  setsebool -P ftp_home_dir=1 //设置sebool值,1为on,不保护,0为off,保护

更详细的说明可以man  ftpd_selinux来获取帮助!

注:sebool值出新问题后同样的也无法访问相关的服务,系统也会跳出×××五角星说明并提供解决办法,与上述文件context值出现的提示一样,这里就不截图说明了,自己试下吧!

补充知识

图形化界面下打开SElinux配置工具里boolean选项参数说明:

1、 Admin:在Admin类下,可以允许系统使用未分配的终端(ttys),允许对root目录进行写操作,从非标准位置读取文件,禁止任何进程加载内核模块,禁止任何对SElinux策略的修改,以及提供对缓冲区溢出保护的支持。

2、 Cronn:在Croon类下,可以启用额外的规则以支持fcron调度命令,以及禁用SElinux对cron服务的保护。

3、 CVS:在使用CVS版本控制系统的情况下,可以关闭SElinux对密码文件的保护。

4、 Databases:在使用MySQL或PostgreSQL数据库系统的情况下,可以关闭SElinux对它们的保护。

5、 FTP:在FTP类下游6个配置项,RHEL5中的SElinux允许FTP作为独立于超级服务的服务(即支持vsftpd作为常规服务运行,而不与inetd或xinetd有关联)。允许目录上传,需使用public_content_rw_t标签,同样支持使用CIFS或NFS进行文件传输,允许读写家目录或禁用SElinux对FTP服务器的保护。

6、 HTTPD Service:HTTPD Service类是一些SElinux指令以增强Apache服务器的安全性,主要包括以下内容:

(1) 允许apache使用mod_auth_pam

(2) 允许httpd支持CGI脚本

(3) 允许httpd守护进程对有public_content_rw_t标签的目录与文件写入

(4) 允许httpd脚本和模块连接到网络

(5) 允许httpd脚本和模块通过网络连接到数据库

(6) 允许httpd脚本对有public_content_rw_t标签的目录与文件写入

(7) 允许httpd读取家目录

(8) 允许httpd作为ftp服务器运行

(9) 允许httpd运行SSL与CGI在同一域中

(10) 允许httpd支持内置脚本

(11) 禁止SElinux对httpd守护进程的保护

(12) 禁止SElinux对httpd suexec(可允许httpd服务的可执行文件)的保护

(13) 统一httpd处理的所有内容文件

(14) 统一httpd连接终端需要处理的证书

7、 Kerberos:在Kerberos类下有3个配置项,一个选项允许其它进程使用Kerberos文件(默认启用),其它两个选项禁止SElinux对Kerberos管理进程(kadmind)和Kerberos键盘控制进程(krb5kdc)的保护

8、 Memory Protection:在目前版本的RHEL中,内存保护选项不与任何服务或系统关联。

9、 Mount:在Mount类中是一些与自动挂载服务有关的控制,可以通过配置它以允许挂载者挂载任何目录或文件,同样也可以禁用SElinux的保护。

10、 Name Service:名称服务器进程(named)指的是RHEL中的DNS服务,如果维护一个区域,一般会希望允许named进程可以覆盖主域文件,也可以禁用SElinux的保护,名称服务器的缓存进程(ncsd)也是如此。

11、 NFS:在NFS启用SElinux之前,至少需要启用NFS文件系统的读权限。如果使用NFS共享系统,可能在NFS文件系统上启用读、写、创建功能。如果配置某个服务器上的家目录作为NFS共享,可能想让NFS支持家目录,这些都有通常安全管理服务进程(gssd)提供支持。

12、 NIS:如果在SElinux系统上运行NIS,可能想允许NIS运行进程,可以取消SElinux对NIS密码和NIS传输进程的保护,如果还有问题,可以取消SElinux对相关进程(ypbind)的保护。

13、 Other:在Other类中可以允许完整文件的访问,通过FTP和未标签的包,Other类同样可以禁止SElinux对PC读卡器和特殊时区数据的保护。

14、 Polyinstation:用户在相同的目录下可能会看到不同的东西(比如/tmp),可以使用SElinux工具启用这一支持。

15、 Pppd:这一进程使用电话调制解调器进行通信,可以允许pppd在内核中插入支持通信的模块或禁用SElinux保护。

16、 Printing:在Printing类中可以允许禁用SElinux对于不同CUPS进程的保护,包括CUPS后台服务、cupsd进程、cupsd-lpd服务和HP打印机进程(hplip)。甚至可以用LPD代替CUPS。

17、 Rsync:在rsync类中可以允许标签为public_content_rw_t目录配置写权限或禁用SElinux的保护。

18、 Samba:在Samba类中可以使用SElinux保护samba,主要包括以下内容:

(1) 允许samba共享nfs目录

(2) 允许samba共享用户家目录

(3) 允许samba对标签为public_content_rw_t的目录文件进行写操作

(4) 允许用户登录到CIFS家目录

(5) 禁止SElinux对nmbd进程(NetBIOS进程)的保护

(6) 禁止SElinux对smbd进程(samba进程)的保护

(7) 禁止SElinux对winbind进程(WINS服务进程)的保护

19、 SASL Authentication Server:简单的身份验证和安全层(SASL)服务器是另一个验证方法,通过安全级别配置工具,可以允许它进入/etc/shadow验证数据库,以及禁用SElinux的保护。

20、 SElinux Server Protection:在SElinux Server Protection类中允许为大范围的进程禁用SElinux保护(比如从amanda到zebra),这些服务不包含在其它类中。

21、 Spam Protection:Spam  Protection类作用于SpamAssassin服务,对于常规用户需要进入家目录,当然依然可以禁用。

22、 SQUID:如果需要设置squid代理的缓存,将需要允许它访问网络,也可以禁止SElinux保护。

23、 Universal  SSL  Tunnel:在Universal SSL Tunnel类中可以为网络配置一个安全通道,通过SElinux添加保护,可以使用此工具允许stunnel作为单独的服务运行,也可以禁用SElinux的保护。

24、 Zebra:可以利用这一工具让Zebra路由服务队路由表进行写入。

文件上下文context值说明:

1、 用户:指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。

2、 角色:object_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r,在strict策略中用户的角色被细分为sysadm_r、system_r、user_r、staff_r角色。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色,在strict策略中一般用户登录时角色是user_r,root用户登录时角色是staff_r,但是没有特殊权切换到sysadm_r角色才具备超级用户的权限,只有staff_r角色才可以切换成sysadm_r角色。

3、 类型(进程的类型又可以称为域):文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限。


2010年12月20日更改,以前的学习笔记了,现在看到了贴出来供大家参考,写的不好大家多多包涵,如有错误请通知我我会改正的,谢谢啦同志们!系统环境RHEL5.4!