一、SELinux简介

    1、selinux(Security-Enhanced Linux)是美国国家安全局(NSA)和SCC开发的Linux的一个强制访问控制的安全模块。selinux是一种基于 强制访问控制(MAC)安全系统。

    2、Linux访问方式:

         1)DAC自主访问控制:完全依赖于Linux系统权限的设置(rwx);

          2)MAC强制访问控制:是由策略规则所控制,策略的规则决定控制的严格程度。策略规则例如:文件、进程、端口的上下文标签,selinux布尔值。

二、SELinux的三种模式

    ● enforcing强制访问:必须通过策略的配置才可以访问,会拦截非法的资源访问并记录相关日志。

    ● permissive警告模式:允许访问,当访问无权限的资源时会警告并记录相关日志,不会拦截访问。

    ● disabled禁用:禁用selinux功能。

    1、修改selinux模式的命令(临时生效,重启系统后会变回默认的模式)

          setenforce命令只能在enforcing与permissive两种模式之间进行切换。

命令:

命令含义
getenforce查看当前的selinux模式
setenforce修改selinux模式,0为permissive模式,1为enforcing模式

    2、修改配置文件(永久生效,重启系统后生效)

[root@vms002 /]# vim /etc/selinux/config 


# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive                                   #selinux模式,修改后重启系统后才会生效
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

    selinux配置文件有两个,一个为真实配置文件,一个为软链接,无论修改哪一个配置文件都可以。如下所示:

[root@vms002 /]# ls -l /etc/selinux/config     #真实配置文件
-rw-r--r--. 1 root root 548 8月  13 2018 /etc/selinux/config
[root@vms002 /]# ls -l /etc/sysconfig/selinux     #软链接
lrwxrwxrwx. 1 root root 17 8月  13 2018 /etc/sysconfig/selinux -> ../selinux/config

三、SELinux安全上下文标签

    1、上下文件标签简介

           Linux中的文件、进程、端口都有安全上下文标签,当运行selinux后所有的安全上下文标签都是访问控制的依据。    

    2、上下文标签的相关命令

命令含义
ls -Z查看文件的上下文
ps -Z查看进程的上下文
chcon更改文件selinux安全上下文
restorecon恢复文件默认的selinux安全上下文
semanageselinux策略管理工具

    3、安全上下文实战演示

          1)查看文件和进程的安全上下文

[root@vms001 /]# ls -lZ /var/www/html/index.html   #查看文件的安全上下文
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
[root@vms001 /]# ls -ldZ /var/www/html/    #查看目录的安全上下文
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
[root@vms001 /]# ps -efZ | grep httpd   #查看httpd进程的上下文
system_u:system_r:httpd_t:s0    root      49796      1  0 10:40 ?        00:00:01 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache    49797  49796  0 10:40 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache    49798  49796  0 10:40 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache    49799  49796  0 10:40 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache    49800  49796  0 10:40 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache    49801  49796  0 10:40 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 54695 4104  0 15:01 pts/1 00:00:00 grep --color=auto httpd

         2)chcon命令修改文件的安全上下文

               用法:chcon  [选项] [-u selinux用户] [-r 角色] [-l 范围] [-t 类型]   文件

               常用选项:

                        --reference=参考文件    文件

                        -r    修改角色属性

                        -l    修改范围属性

                        -t    修改类型属性

                        -R    递归

[root@vms001 /]# ls -ldZ /data/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /data/
[root@vms001 /]# chcon -R -t httpd_sys_content_t /data/
[root@vms001 /]# ls -ldZ /data/
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /data/

        提示:当我们用chcon命令修改安全上下文时,只是临时生效,重置selinux安全标签或使用restorecon命令恢复文件默认的安全上下文后,chcon命令修改的安全上下文就会失效。如下代码所示:

[root@vms001 /]# ls -ldZ /data/
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /data/
[root@vms001 /]# restorecon -R /data/
[root@vms001 /]# ls -ldZ /data/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /data/

        3)semanage命令

              常用选项:

                    fcontext   管理文件上下文映射定义

                    port         管理网络端口类型定义

                    -a             添加预设安全上下文

                    -d             删除指定的预设安全上下文

                    -l              查看预设安全上下文

                    -t              修改类型属性

              示例:

              ①  查看selinux策略默认的预设安全上下文信息

[root@vms001 /]# semanage fcontext -l

              ②  修改策略,添加一条新的预设安全上下文信息,恢复文件的默认安全上下文

[root@vms001 /]# ls -ldZ /oldboy/     #查看安全上下文
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /oldboy/
[root@vms001 /]# semanage fcontext -a -t httpd_sys_content_t /oldboy    #修改默认的安全上下文
[root@vms001 /]# ls -ldZ /oldboy/    #查看安全上下文
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /oldboy/
[root@vms001 /]# restorecon -R /oldboy/     #恢复默认的安全上下文
[root@vms001 /]# ls -ldZ /oldboy/     #查看安全上下文
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /oldboy/

              ③  利用正则表达式 递归设置目录的预设安全上下文

[root@vms001 /]# mkdir /www
[root@vms001 /]# touch /www/file-{01..03}
[root@vms001 /]# ls -ldZ /www/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /www/
[root@vms001 /]# ls -lZ /www/
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-01
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-02
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-03
[root@vms001 /]# 
[root@vms001 /]# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
[root@vms001 /]# 
[root@vms001 /]# restorecon -R /www/
[root@vms001 /]# 
[root@vms001 /]# ls -ldZ /www/
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/
[root@vms001 /]# ls -lZ /www/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file-01
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file-02
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file-03

              ④  删除预设安全上下文

[root@vms001 /]# ls -ldZ /www/
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/
[root@vms001 /]# 
[root@vms001 /]# restorecon -R /www/
[root@vms001 /]# 
[root@vms001 /]# ls -ldZ /www/
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/
[root@vms001 /]# 
[root@vms001 /]# semanage fcontext -d "/www(/.*)?"
[root@vms001 /]# 
[root@vms001 /]# ls -ldZ /www/
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/
[root@vms001 /]# 
[root@vms001 /]# restorecon -R /www/
[root@vms001 /]# 
[root@vms001 /]# ls -ldZ /www/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /www/
[root@vms001 /]# ls -lZ /www/
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-01
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-02
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-03

四、SELinux布尔值

    1、selinux布尔值简介

           selinux布尔值我们可以理解为是一个开关,当selinux开启时,布尔值功能也同时开启,并且大部分默认的布尔值都是关闭的。需要实现一个功能时,同时也需要开启对应的布尔值,如果对应的布尔值没有开启,那么这个功能也无法实现。selinux布尔值相当于是在服务上多加了一个开关,服务本身以及布尔值这两个开关同时开启,这个服务才是真正的开启。

    2、selinux布尔值相关命令

命令含义
getsebool获取selinux布尔值
setsebool设置selinux布尔值

    3、示例

           我们用ftp做示例。

           1)查看ftp的selinux布尔值(getsebool)

[root@vms002 /]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

           2)设置ftp的selinux布尔值,允许匿名用户可以上传文件或目录。(setsebool)代码如下:

[root@vms002 /]# setsebool -P ftpd_anon_write on    #-P永久生效,同时写入到配置文件中。
[root@vms002 /]# 
[root@vms002 /]# getsebool -a | grep "ftpd_anon_write"
ftpd_anon_write --> on
sftpd_anon_write --> off

                 提示:on 或 1 为开启状态;off 或 0 为关闭状态。-P(大写)为永久生效。

、排错

         当我们无法访问或无法写入时,可以从以下三个方面进行排错:

           1、服务的配置文件是否开启了权限;

           2、Linux系统文件是否有权限;

           3、selinux的上下文以及布尔值是否开启了对应的功能。

六、总结

        1、selinux三种模式:

                1)enforcing:强制开启访问控制;

                2)permissive:允许,警告模式;

                3)disabled:强制关闭selinux功能。

        2、selinux安全上下文标签:

                1)ls -Z:查看文件的安全上下文;

                2)ls -ldZ:查看目录的安全上下文;

                3)ps -Z:查看进程的安全上下文;

                4)chcon:修改文件或目录的安全上下文:(临时生效,重置selinux或恢复默认安全上下文后失效)

                                   --reference=参考文件    文件

                                   -t        修改类型属性

                                   -R       递归

                5)restorecon:恢复文件或目录的默认安全上下文

                                   -R    递归恢复目录的安全上下文

                6)semanage:selinux策略管理工具:

                                    fcontext     管理文件的安全上下文映射定义

                                    port           管理网络端口类型定义

                                    -a               添加预设安全上下文

                                    -d               删除预设安全上下文

                                    -t                修改类型属性

                                    -l                显示预设安全上下文

        3、selinux布尔值:

                1)getsebool -a:查看布尔值

                2)setsebool:修改布尔值

                                    -P              永久生效,同时写入到配置文件中

                3)on 或 1 为开启

                4)off 或 0 为关闭