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的规则
SELinux(Security-Enhanced Linux) 是
美国国家安全局(NSA)对于强制访问控制的实现,是 Linux® 上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到
SELinux 是
2.6 版本的 Linux 内核中提供的强制访问控制系统。对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。。 (MAC)
SELinux是一种基于 域
-类型模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。
众所周知,标准的
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
splashimage=(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 ,�t不可以出�Fselinux=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只要概念都清晰了,在实际应用中根据具体情况再来配置就好了