1、SELinux概述

   SELinux(Secure Enhanced Linux)是为Linux开发的一个强制访问控制模块,在内核2.6版本后集成于内核中,定义了访问文件的各种策略。与传统linux不同的是,SELinux对于资源的管理,不再通过用户级别和权限级别的方式实现,而是将资源抽象为对象object,并且为其赋予特定的安全标签保存其于元数据中,通过主体subject(进程就是主体)检查策略中的条目,从而限制资源的开放性。使得系统处于MAC环境下。

这里的资源可以是文件、端口......

   注:DAC:Discretionary Access Control 自由访问控制

      MAC:Mandatory Access Control 强制访问控制

2、标签包括的内容

    <1>User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程

    <2>Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r

    <3>Type:指定数据类型,规则中定义何种进程类型访问何种文件。Target策略基于type实现。多服务共用:public_content_t

    <4>Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0

    <5>Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy,c0-c1023共1024个分类,Target 策略不使用cateaory

3、SELinux有四种工作类型:

   <1>strict: centos5,每个进程都受到selinux的控制

   <2>targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被***的进程,rhel4只保护13个服务,rhel5保护88个服务。默认这个类型,Target策略基于type实现。

   <3>minimum:centos7,修改过的targeted,只对选择的网络服务

   <4>mls:提供MLS(多级安全)机制的安全性

   <5>minimum和mls稳定性不足,未加以应用

4、SELinux的三种状态   

   <1>enforcing: 强制,每个受限的进程都必然受限

   <2>permissive: 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志

   <3>disabled: 禁用

   修改方法:

      <1>修改配置文件

         /etc/selinux/config,重启生效

         /boot/grub/grub.conf,重启生效

            满足条件:只要有一个禁用就禁用

      <2>命令行修改

         setenforce 0/1,临时生效

    查看状态

        <1>getenforce 

        <2>sestats

5、管理SELinux定义的默认策略  

   <1>管理文件标签

       查看实际上下文

           ls -Z

[root@centos7/var/www]#ll -Z index.html 
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

大家有没有注意过文件后面的.呢?这就是selinux安全标签

验证:

# 查看selinux状态
[root@centos6 ~]# getenforce
Permissive
# 查看文件
[root@centos6 ~]# ll
total 32
-rw-------. 1 root root  1383 Sep 18 11:37 anaconda-ks.cfg
-rw-r--r--. 1 root root 17920 Sep 18 11:37 install.log
-rw-r--r--. 1 root root  5820 Sep 18 11:36 install.log.syslog
# 改变selinux值,重启系统
[root@centos6 ~]# vim /etc/selinux/config 
SELINUX=disabled
[root@centos6 ~]# reboot 
# 再次创建文件,并查看
[root@localhost ~]# touch test
[root@localhost ~]# ll
total 32
-rw-------. 1 root root  1383 Sep 18 11:37 anaconda-ks.cfg
-rw-r--r--. 1 root root 17920 Sep 18 11:37 install.log
-rw-r--r--. 1 root root  5820 Sep 18 11:36 install.log.syslog
-rw-r--r--  1 root root     0 Sep 21 22:20 test      # 没点,即没有selinux安全标签了
-rw-r--r--. 1 root root     0 Sep 21 22:17 testfile
# 查看比较安全上下文
[root@localhost ~]# ls -Z test install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--  root root ?                                test

会出现selinux打标签的过程

wKiom1f2BtOQBlXKAABdaAQdAzo024.jpg

# 再次修改配置文件,开启selinux(Enforcing)
[root@localhost ~]# ll test install.log
-rw-r--r--. 1 root root 17920 Sep 18 11:37 install.log
-rw-r--r--. 1 root root     0 Sep 21 22:20 test    # 标签已经打上
[root@localhost ~]# ll -Z test install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 test


       查看期望上下文(即策略中定义的标签)

           semanage fcontext–l

[root@centos7/var/www]#semanage fcontext -l | grep /var/www 
/var/www(/.*)?                                     all files          system_u:object_r:h
ttpd_sys_content_t:s0 
...    //策略中定义了每个文件夹下的文件标签,以/var/www/为例
[root@centos7/var/www]#touch index.html 
[root@centos7/var/www]#cp index.html /root/
[root@centos7/var/www]#ll -Z /root/index.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/index.html   //type改变
[root@centos7/var/www]#cp /root/index.html ./    
cp: overwrite ‘./index.html’? y
[root@centos7/var/www]#ll -Z index.html    //type恢复
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
[root@centos7/var/www]#mv /root/index.html ./
mv: overwrite ‘./index.html’? y
[root@centos7/var/www]#ll -Z index.html    //type不会改变
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 index.html
上面的操作也说明了cp移动的只是数据,而mv移动的是数据和元数据     //注意

       恢复文件标签

           restorecon FILE

[root@centos7/var/www]#ll -Z index.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 index.html   //type不符合定义
[root@centos7/var/www]#restorecon index.html   // -R
[root@centos7/var/www]#ll -Z index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html    //恢复

修改标签

chcon [-u USER] [-r ROLE] [-t TYPE] FILE...

chcon --reference=RFILE FILE...

-R:递归打标;

如果你想一个文件供多种服务使用:chcon -t public_content_t FILE 

添加安全上下文

semanage fcontext -a –t httpd_sys_content_t‘/testdir(/.*)?’

restorecon–Rv/testdir

删除安全上下文

semanage fcontext -d –t httpd_sys_content_t‘/testdir(/.*)?’


功用:用来改变httpd等一些服务的默认页面位置,使用不慎会导致服务不可用

   <2>管理端口标签

        查看端口标签

        semanage port –l

        添加端口

        格式:semanage port -a -t port_label -p tcp|udp PORT

        semanage port -a -t http_port_t -p tcp 9527

        删除端口

        格式:semanage port -d -t port_label -p tcp|udp PORT

        semanage port -d -t http_port_t -p tcp 9527

        修改

        格式:semanage port -m -t port_label -p tcp|udp PORT

        semanage port -m -t http_port_t -p tcp 9527

功用:用来改变服务的可使用端口,增强服务的安全性。

   <3>管理SELinux布尔值

      SELinux布尔值:就是对一个文件的权限是打开或者关闭     

       查看bool命令:

         getsebool a

         semanage boolean -l

         semanage boolean -l –C 查看修改过的布尔值

       设置bool值命令:

         setsebool [-P] boolean on/off

         setsebool [-P] Boolean=1/0

功用:打开或者关闭某个服务的某个特性。



补充:semanage来自policycoreutils-python包,且依赖于本地cdrom。

selinux错误:

[root@centos7/etc/yum.repos.d]#semanage port -a -t ssh_port_t -p tcp 2222
libsemanage.semanage_get_lock: Could not get direct transaction lock at /etc/selinux/targeted/modules/semanage.trans.LOCK. (Resource temporarily unavailable).
ValueError: Could not start semanage transaction    #不能锁定xx文件
[root@centos7/etc/yum.repos.d]#cd /etc/selinux/targeted/modules
[root@centos7/etc/selinux/targeted/modules]#ls
active  semanage.read.LOCK  semanage.trans.LOCK  tmp
[root@centos7/etc/selinux/targeted/modules]#cat semanage.trans.LOCK 
[root@centos7/etc/selinux/targeted/modules]#mv semanage.trans.LOCK /tmp/    # 移除
[root@centos7/etc/selinux/targeted/modules]#semanage port -a -t ssh_port_t -p tcp 2222
[root@centos7/etc/selinux/targeted/modules]#    成功了

修改selinux配置时,遇见这样的错误,不能锁定xxx文件,最后查看了一下,是个空文件,就把它移走了,没想到居然好了。

   

 最后提示:selinux会很大性的提高系统的安全性,但是限制了文件以及目录的安全上下文会带来不必要的麻烦,国内企业很少使用。