Selinux

    Selinux的相关配置文件是在 /etc/selinux下,我们在日常应用中常常会遇到某些服务明明已经配置的毫无问题,但却怎么测试都不通的情况,那这个时候如果防火墙已经关闭的话,那很有可能就是selinux在作怪。
一.   简介:
     在开始介绍之前,先介绍几个概念:
DAC(Discretionary access control,自主访问控制) DAC机制就是指对象(比如程序、文件或进程等)的的拥有者可以任意的修改或授予此对象相应的权限。例如传统Linux,Windows等。
简单理解 DAC就是rwx!因此,当某个程序想要对文件进行存取时, 系统就会根据该程序的拥有者/群组,并比对文件的权限,若通过权限检查,就可以存取该文件了。
DAC的缺点:
· root 具有最高的权限:如果不小心某个程序被它人取得,且该程序属于 root 的权限,那么这支程序就可以在系统上进行任何资源的存取
使用者可以取得程序来变更文件资源的存取权限 如果你不小心将某个目录的权限设定为 777 ,由于对任何人的权限会变成 rwx ,因此该目录就会被任何人所任意存取!
 
MAC(Mandatory Access Control,强制访问控制):MAC机制是指系统不再允许对象(比如程序、文件或文件夹等)的拥有者随意修改或授予此对象相应的权限,而是透过强制的方式为每个对象统一授予权限,例如 SELinux。
委任式存取控制 (MAC):可以针对特定的程序与特定的文件资源来进行权限的控管! 也就是说,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root , 而得要看当时该程序的设定而定。如此一来,我们针对控制的『主体』变成了『程序』而不是使用者喔! 此外,这个主体程序也不能任意使用系统文件资源,因为每个文件资源也有针对该主体程序设定可取用的权限! 如此一来,控制项目就细的多了!但整个系统程序那么多、文件那么多,一项一项控制可就没完没了! 所以 SELinux 也提供一些预设的政策 (Policy) ,并在该政策内提供多个规则 (rule) ,让你可以选择是否启用该控制规则!
 
举例:
以前:root--->启动httpd---->httpd可以访问系统任何文件
现在:root--->启动httpd---->httpd只能访问/var/www/目录(这是MAC)规则的约束
如果httpd想要访问其他目录,那么必须满足两个条件:DAC的rwx + MAC的规则
 
  众所周知,标准的 UNIX安全模型是"任意的访问控制"DAC。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他!
  而 MAC情况下的安全策略完全控制着对所有资源的访问。这是MAC和DAC本质的区别。
SELinux提供了比传统的 UNIX权限更好的访问控制。
前面也是摘抄的,说了这么多,其实就是一点,因为传统的 linux并不是安全的,所以需要selinux来加强安全级别,防止***
 
二.Selinux原理
 
    在 SELinux 中,每个对象(程序、档案、进程等)都拥有一个Security Context(安全上下文)【后面再解释】,它就像标签一样,贴在每个对象身上,上面记载着这个对象所具有的权限。而我们可以通过制定Security Policy(安全策略)来定义这些安全上下文,从而定义哪种对象具有哪些权限。当一个对象需要执行某个动作时,系统会依照安全策略所制定的内容来检查相对应的权限,如果全部权限都符合的话,系统就会允许这个操作的执行,否则都将遭到拒绝或失败。这些过程不会影响到其它正常运行的对象,系统会保证它们的安全系统结构以及稳定运行。这里还要说明的是,到目前为止,SELinux系统中的某个对象需要执行某个动作的时,系统权限认证不仅仅单独根据安全策略所制定的内容来检查,同时还要根据传统DAC来检测,只有DAC以及SELinux全部认证通过了才能进行正常操作。
 
     简单的说 Selinux就好比将系统分成了彼此隔离的区域,所有的对象都在不同的区域中,没有经过授权的对象则不可以在不同区域之间传递数据,所以常常会有一些开启了selinux的root有些服务就是无法正常运行,所以root在selinux下是不具备所有权限的。这样也许是很麻烦,但好处也是显而易见的,因为彼此都进行了隔离,那么如果那天不小心某个区域被人***,那也只能破坏此区域下的环境,而无法对其他区域破坏,因为前面说了彼此是隔离的啊呵呵。例如你某个服务是以 root 的权限执行的。而此服务存在着一个极严重的 bug ,而使得***者可以通过这个服务的漏洞进入系统。但如果你的 Linux 系统有 SELinux 保护的话,那么***者仍没有办法破坏整个系统,因为它被这个服务所属的 domain 所限制。但是没有 SELinux 保护的系统,它就可能因此而***整个系统,而产生不可预料的后果。
 
   总结:SELinux 是透过 MAC 的方式来控管程序,他控制的主体是程序, 而目标是文件(该程序欲访问的文件)!
 
·主体 (Subject):SELinux 主要想要管理的就是程序,主体= process;
 
·目标 (Object):主体程序将访问的文件,目标=文件;
 
·政策 (Policy): (后面再提及)由于程序与文件数量庞大,因此 SELinux 依据服务来制订基本的存取安全性政策。这些政策内包含有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 5.x 里面仅有提供两个主要的政策,分别是:targeted、strict
 
· 安全性上下文 (security context):

    我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了政策指定之外,主体与目标的安全性文本必须一致才能够顺利存取。 这个安全性文本 (security context) 有点类似文件系统的 rwx !安全性文本的内容与设定是非常重要的!如果设定错误,你的某些服务(主体程序)就无法存取文件系统(目标资源),当然就会一直出现『权限不符』的错误讯息了!
 
三、selinux基本配置
 
   目前的操作系统基本都默认安装了 selinux,其配置文件为:/etc/selinux/config。如图

    配置文件就是如图所示的,画红线的部分我们接下来就提及
 
Selinux的状态有三种分别为enforcing、permissive、disabled
 
分别为 开启、警告、关闭
 
   Enforcing:开启 selinux,假如你违反了规则,则会阻止你无法继续操作下去
 
    Permissive:是一种警告模式,意思就是 selinux有效,但是你违反策略的时候其并不会阻止你,而是让你继续操作,但是会把你违反的内容记录下去。
 
    Disabled:关闭 selinux。
 
SELINUXTYPE 参数值:有「 targeted、strict 」两种:
 
SELINUXTYPE=targeted 保护网络相关服务。针对网络服务限制较多,针对本机限制较少,是预设的政策
 
SELINUXTYPE=strict 完整的保护功能,包含网络服务、一般指令及应用程序
(不过日常应用中,我们一般都设 SELINUXTYPE为targeted,要是设置成strict,那么系统会启动不起来。)
   在 /etc/selinux/targeted文件夹中定义的就是targeted属性,这个targeted policy 的用途可为保护下列的网络服务:
 
? dhcpd
? httpd
? mysqld
? named
? nscd
? ntpd
? portmap
? postgres
? snmpd
? squid
? syslogd
这样,我们的系统便受到了 SELinux的保护。
 
   四、selinux 的开启与关闭
 
   Selinux有时候用起来确实是挺麻烦的,特别是对我们这种初学者来说,有时候辛辛苦苦搞了半天,却死活服务通不过,最后发现都是 selinux 在捣鬼,那么其是否可以关闭呢?当然是可以的。方法有很多种:
 
  1. 在配置文件中直接更改
 
   编辑 /etc/selinux/config文件,将其中的SELINUX=enforcing改为警告或者关闭模式,然后重启电脑即可。
 
   2. 通过kernel来关闭
 
    在设定载入 kernel 时下给 kernel 下参数「selinux=0」即可关闭 SELinux 功能,此时就算是 /etc/selinux/config 设定 SELinux enforcing 也是无法开启 SELinux 功能。若以 GRUB 开机程式来说会是设定在 /boot/grub/menu.lst 档案内 kernel 那一行
所以启动 selinux 的时候,就不仅仅是将/etc/selinux/config中的SELINUX=enforcing,同时也要将下面配置文件中的selinux=0删除才可以。

[root@www ~]# vi /boot/grub/menu.lst
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-92.el5)
   root (hd0,0)
   kernel /vmlinuz-2.6.18-92.el5 roroot=LABEL=/1 rhgb quiet selinux=0
   initrd /initrd-2.6.18-92.el5.img

# 如果要啟動 SELinux ,則不可以出現selinux=0 的字樣在 kernel 後面!
 
   3. 开机状态下关闭selinux
 
    在开机状态下是无法关闭 selinux的,不管是从开启到关闭还是从关闭到开启,都必须要重启电脑。但如果我们不想重启,但又不想selinux去影响我们的服务,则可以如下命令:
setenforce 0 :转换成警告模式—permissive
setenforce 1 ::转换成开启模式 ----enforcing
当然 setenfoce其后也可以直接跟permissive或enforcing
 
五、selinux的基本命令
 
1.sestatus
 
显示当前 selinux的信息。如:
[root@linux102 ~]# sestatus
SELinux status:                  enabled //selinux 的启用状态
SELinuxfs mount:                /selinux //selinuxfs文件系统的挂载点
Current mode:                   enforcing //目前selinux 的模式
Mode from config file:            enforcing //目前selinux模式的设定文本
Policy version:                  21       //selinux policy的版本
Policy from config file:           targeted   //目前的政策
 

2.getenforce

获取当前selinux 的状态

3.ls Z

 
 查看文件的 selinux属性,是查看安全性上下文的命令
 

 
从第三行起,都是 selinux的相关属性,分别代表了 Identify(身份识别)、role(角色)、type(类型)
 
(1)身份识别
 
root:表示 root 的帐号身份
system_u:表示系统程序方面的识别,通常就是程序;
user_u 代表的是一般使用者帐号相关的身份。
 
(2)角色:
 
   通过角色栏,我们可以知道这个资料是属于程序、文件资料还是代表使用者。一般的角色有:
object_r 代表的是文件或者目录;
system_r 代表的就是程序或者一般使用者也会被指定成为 system_r !
 
(3)类型
 
    在预设的 targeted 政策中, Identify 与 Role 栏位基本上是不重要的!重要的在于这个类型 (type) 栏位!基本上,一个主体程序能不能读取到这个文件资源,与类型栏位有关!而类型栏位在文件与程序的定义不太相同。
·类型( type)很重要,它有两种叫法,但实为同一物!
 
type:在文件资源 (Object) 上面称为类型 (Type); DAC中的rwx
 
domain:在主体程序 (Subject) 则称为领域 (domain) 了! MAC中的权限

【重要】domain 需要与 type 搭配,则该程序才能够顺利的读取文件资源啦!
例如
 
 [root@master oracle]# ll -Zd /usr/sbin/httpd
-rwxr-xr-x  root root system_u:object_r: httpd_exec_t   /usr/sbin/httpd
 
【说明】:既然说type很重要,/usr/sbin/httpd的type是什么呢?就是httpd_exec_t 这 说明 httpd 程序对该文件有执行权限!相当于文件上的x权限!!
 
4.ps –Z
 
查看进程的selinux属性:
 
5. id –Z
 
 查看用户的selinux属性
 
   ok,基本的东西大概就这些吧,selinux只要概念都清晰了,在实际应用中根据具体情况再来配置就好了