1.什么是Selinux,

selinux就是 Security Enhanced Linux 中文意思就是安全强化的Linux。

2.Selinux的目标。

在传统的DAC(Discretionary Access Control)自主访问控制上,就是依据程序的拥有者(所在组)和文件的权限来决定是否有存取的能力。

这样在拥有高级权限例如:root用户启动的程序就会有root自身所拥有的权限,这将会造成一些***事件的发生。

Selinux使用的是MAC(Mandatory Access Control)委任式访问控制的方法。所以即使程序是root权限,也不一定能够任意的读取系统的文件,

这要看文件对这个程序设定的可取用的权限。但是这样一来Selinux就要有很多的控件条目,Selinux就提供了一些预设的政策(Policy),并在

政策中提供了很多的规则。

总结:Selinux就是降主体由用户变成程序,程序使用文件,文件是否让该程序使用,双向的都要设定。

3.selinux运作

1.主体:程序

2.目标:文件系统

3.政策:主要两个 targeted:针对网络服务限制多,针对本机限制少,预设政策。

 strict:完整的Selinux限制,限制严格。

4.安全性本文(security context):主体能不能存取目标,有两个限制条件1.政策是否允许。2.主体和目标的安全性文本是否一致。

过程:Selinux的主体要想读取目标,首先要满足政策,然后才能对比安全性本文,然后还要看用户权限是否能够有读取文件的权限。

注意:这里如果安全性本文有错误,那么主体就不能存取文件系统,就会产生权限不符的提示。

4.说说安全性本文,安全性本文是程序和文件操作系统都需要一份。程序运行的时候当然是在内存中,所以程序的安全性文本就在内存中。

文件的安全性文本是在文件的inode中,所以读取文件的inode就可以对比安全性本文和文件的权限来确定是否程序能够读取文件。

使用ls -Z是能够显示Selinux安全性本文的信息。

例如:system_u:object_r:user_home_t:s0

字段解释:身份识别:角色:类型

身份识别:root(表示root身份)、system_u(表示系统程序)、user_u(表示一般用户)

注意:在身份的识别中,系统上面大部分的数据都会是system_u和root,在/home这种文件中大部分都会是user_u这种。

角色:1.object_r(代表是档案或者是目录)2.system_r(代表的就是程序,有时候也代表使用者)

类型:(最重要)

在预设的targeted政策中,身份系别和角色基本上是不重要的,重要的在于这个类型(type)字段上,

基本上主体程序能不能读取这个文件,与类型字段有关!类型字段在档案和程序定义不相同

1.type:在文件资源(object)上面称为类型。

2.domain:在主体的程序(subject)则称为领域。

注意:domain和type要搭配在一起才能够读取档案。

解释一下Selinux type字段的相关性。

身份识别角色 对应在targeted的意义

root system_r 代表供root账号登入是所取得的权限

system_usystem_r由于是系统账号,是非交谈式的系统运作程序

user_usystem_r一般可以登入用户的程序

过程:-rwxr-xr-x  root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd

drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

   1. 首先,我们触发一个可执行的目标档案,那就是具有 httpd_exec_t 这个类型的usr/sbin/httpd 

     文档 。

   2. 该文件的类型会让这个档案所造成的主体程序 (Subject) 具有 httpd 这个领域 (domain) ,我们 

     的政策针对这个领域已经制定了讲多规则,其中包括这个领域可以读取的目标资源类型; 

   3. 由于 httpd domain 被设定为可以读取 httpd_sys_content_t 这个类型的目标档文件(Object) , 

     因此你的网页放置到 /var/www/html/  目录下,就能够被 httpd 那支程序所诺取了; 

   4. 但最终能不能读到正确的资料,还得要看 rwx 是否符合 Linux 权限的规范! 

以上注意:政策内需要制定详细的domain/type相关性。

5.以上是关于Selinux的原理性的问题,那么下面说一下使用

1.Selinux支持的三种模式;1.enforcing强制模式:表明开始限制domain/type

2.permissive宽容模式:有警告信息,但是没有domain/type限制。

3.diabled关闭

2.getenforce 查询Selinux的状态。

3.sestatus [-vb] v:检查/etc/sestatus.conf内的文件

b:将目前的政策的规则布尔值列出。

4.Selinux的配置文件 /etc/selinux/config(这里面有启动的模式和政策的模式)

5.Selinux的启动问题:

1)先要改变配置文件中的模式为enfocing 或者 permissive.

2)到/boot/grup/menu.lst(其实这个是grup.conf的链接文件)去掉selinux=0(有了这个那么内核在

启动的时候就会忽略掉/etc/selinux/config的设定值,就不会加载Selinux)

以上注意:Selinux是加载在内核中的所以必须要重启生效。

6.模式切换:在Selinux中可以在enforcing 和permissive之间切换,但是不能和disable切换(要重启)

切换的指令setenforce [0|1] 0是permissive,1是enforcing。

6.实例:在/var/www/html 下建立的Index.html是可以执行的,ls -Z的属性是

-rw-r--r--  root root user_u:object_r:httpd_sys_content_t:s0 /var/www/html/index1.html

注意:httpd_sys_content_t类型是可以被httpd_t 域读取的

例如:在/root下建立的目录

-rw-r--r--  root root user_u:object_r:user_home_t:s0   index.html

user_home_t 类型是不可以被httpd_t 域读取的。

解决这个的办法就是:重置Selinux安全性本文。

1.使用chcon( change file SELinux security context)命令处理:

chcon [-R] [-t type] [-u user] [-r role] 文件

或者:chcon [-R] --reference=范例文件 档案

参数:-R :递归修改。

 -t :后面接安全性文本的类型字段 例如:httpd_sys_content_t

 -u :后面接身份识别,例如:system_u

 -r :后面接角色例如:sytem_r

 例如:chcon -t httpd_sys_content_t /var/www/html/index.html

 chcon --reference=/etc/passwd index.html

2.系统默认的文件都有特殊的Selinux安全新本文,例如、/var/www/html 原本就是httpd能够读取的目录,

所以就可以用还原的方式即:restorecon(restore file(s) default SELinux security contexts.

)命令。

参数:-R 递归

-v:将过程显示到屏幕上。

7.Selinux的排错:

1.Selinux是整合到内核中的服务,所以几乎不用其他的服务支持,开机就好了。但是如果要一动一些文件到其他目录下可能没有更改安全性本文,‘

会产生错误,这里就要用到其他的服务帮助了。

2.setroubleshoot服务会将错误信息写入到/var/log/messages中,通过cat /var/log/messages | grep "setroubleshoot"可以查到。

3.使用auditd 把详细的资料写入到/var/log/audit/audit.log

 auditd是核查的意思.这里的auditd服务会把很多的信息写入/var/log/audit/audit.log,注意不只是错误信息。

 使用audit2why可以帮助我们查询。

 以上两种方法setroubleshoot更加好用

8.Selinux的政策与规则管理

1.首先要会查阅政策的相关内容。seinfo:-A 列出所有Selinux的状态,规则布尔值,身份标志,角色,类别等。

 -t 列出Selinux所有类别

 -r 所有的角色

 -u 所有的身份标志

 -b 列出规则布尔值

 想要知道更加详细的的内容可以用sesearch [-a] [-s 主体类别] [-t 目标类型] [-b 布尔值]

-a 列出该类别或布尔值的所有相关信息

-s 后面接主体程序

-t 后面还要接类别:如 -t http_t

-b 后面还要接布尔值的规则,例如 -b http_enable_ftp_server

注意:以上两个查询很重要,有时候会遇到一些服务器无法访问的问题,可以使用ps -aux -Z来找到主程序的domain 然后可以

利用sesearch 找到主程序能够读取的文件。

2.布尔值:里面规范了很多的主体程序和文件的之间的读取问题。其实就是一堆的规则。这个布尔值可以将规则设定为启动(1)或者关闭(0)

1.布尔值的查询与修改。

1)seinfo -b可以用来查询系统有多少布尔值,但是每个布尔值是否能够启动用getsebool命令查询:

-a :列出目前系统上面的所有布尔值条款设定为开启或关闭值。

2)修改布尔值,关闭或者是启动

setsebool [-P] 布尔值=[0|1]

-P:直接将设定值写入配置文件,该设定数据未来会生效的。

例如:getsebool httpd_enable_homedirs

setsebool -P httpd_enable_homedirs=0

以上两个布尔值的命令式很有用的。

3.默认目录的安全性本文查询与修改。

restorecon是能够将文件恢复到文件所在位置的默认的安全性本文。

semanage是用来查询默认的安全性本文。

#semanage {login|user|port|interface|fcontext|translation} -l

#semanage fcontext -{a|d|m} [-frst] file_spec

参数:fcontext:主要用在安全性文本方面的用途,-l为查询的意思;

-a 增加的意思,你可以增加一些目录的默认安全性本文类型设定;

-m:修改的意思

-d:删除的意思

例如:#semanage fcontext -a -t public_content_t(将默认文件的安全性本文加上 public_content_t) 

注意:#semanage fcontext -l这个查询到的是所有的默认的安全性本文的内容。

 semanage fcontext -a -t public_content_t "/srv/samba(/.*)?

 注意以上的格式/srv/samba(/.*)?