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打标签的过程
# 再次修改配置文件,开启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会很大性的提高系统的安全性,但是限制了文件以及目录的安全上下文会带来不必要的麻烦,国内企业很少使用。