一。selinux相关知识

    1.SELinux简介

         SELinux是一个强制访问控制的安全模块,linux内核2.6版本后集成在内核

            DAC:Discretionary Access Control自由访问控制

            MAC:Mandatory Access Control 强制访问控制

                DAC下进程是毫无束缚的

                MAC环境下策略的规则决定控制的严格程度

                MAC环境下,进程可以被限制

                策略被用来定义被限制的进程可以使用哪些资源(文件和端口)

                默认情况下,没有被明确允许的行为将被拒绝


    2.selinux运行模式

        (1)对象(object):所有可读取的对象,包括文件、目录、进程、端口等

        (2)主体:进程称为主体(subject)

        (3)selinux的工作模式(selinux策略)

               strict:只有centos5才有,每个进程都受到selinux严格的控制

                targeted:用来保护常见的网络服务,只监控容易被***的进程;rhel4保护13个服务,rhel5保护88个服务

                minimum:centos7,修改过的targeted

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


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

        (4)selinux安全上下文

                <1>传统linux,一切皆文件,由用户、组、权限控制访问

                <2>在selinux中,一切皆对象,

                            文件安全上下文:由存放在inode拓展属性域中的安全元素所控制其访问

                            进程安全上下文:存放在内存当中

                <3>所有文件、端口资源、进程都具有安全标签:安全上下文

                            ll 查看文件属性,权限所在列的尾部的“.”代表有安全标签

                <4>安全上下文由5个元素组成

                            user:role:type:sensitivity:category

                            user_u:object_r:tmp_t:s0:c0

                                user:指示登录系统的用户类型,如root、user_u、system_u;多数本地进程属于自由(unconfined)进程

                                role:定义文件、进程和用户的用途

                                        文件:object_r

                                        进程和用户:system_r

                                type:指定数据类型,规则中定义何种进程类型访问何种文件,target策略是基于type实现的,   多服务功用:public_content_t

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

                                category:对于特定组织划分不分层的分类,如FBI Secret,NSA Secret,一个对象可以有多个category,c0-c1023共1024个分类,target策略不使用category

                <5>实际安全上下文存放在文件系统中,ls -Z ;ps -Z

                <6>默认上下文:存放在二进制的selinux策略库中

                            semanage fcontext -l


小结:selinux对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签;domain标签能够执行的操作由安全策略规定

当一个subject试图访问一个object,kernel中的策略执行服务器将检查AVC(Access Vector Cache访问矢量缓存),在AVC中,subject和object的权限被缓存,查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问

    3.设置selinux的相关注意操作

            selinux是否启用

            给文件重新打标签

            给端口设置安全标签

            设置某些操作的布尔值开关

            selinux的日志管理


    4.selinux的(状态|模式)

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

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

            disabled:禁用


            enforceing与permissive相互加的切换不需要重启,其余状态间切换需要重启,因为selinux是整合到内核中的

            selinux的策略改变后需要重启

    5.管理selinux的相关命令

        (1)查看selinux状态及修改相关状态

                getenforce:获取selinux当前状态

                sestatus:查看selinux状态

                    -v 检查列于/etc/sestatus.conf内的文件与程序的安全上下文内容

                    -b:将目前策略的规则布尔值列出来,即某些规则(rule)是否要启动之意

                setenforce 0|1

                        0:设置为permissive

                        1:设置enforcing

        (2)相关配置文件

                下面两类文件有一个禁用即禁用selinux

                在/etc/grub/grub.conf文件的kernel行的行尾添加“selinux=0”,内核会忽略过selinux的加载

                /etc/grub/grub.conf   使用selinux=0禁用selinux

                /etc/sysconfig/selinux

                /etc/selinux/config   SELINUX={disabled|enforcing|permissive}

        (3)seinfo       查询selinux策略的工具

                    -t 列出selinux的所有类型(type)

                    -r 列出selinux的所有角色(role)

                    -u 列出selinux的所有身份表示(user)

                    -b 列出所有规则的种类(布尔值)

        (4)sesearch命令详解

                知道某个类型或者布尔值后,可用此命令了解详细规则

                sesearch [-A] [-s 主体类型] [-t 目标类型]  [-b 布尔值]

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


        (5)修改文件的selinux安全标签

                <1>给文件重新打安全标签

                        chcon [option] ... [-u user] [-r role] [-t type] file...

                        chcon [option] ... --reference=rfile file

                                -R 递归打标

                                 -v 将过程显示到屏幕上

                <2>恢复文件默认的安全上下文

                            restorecon [-R] /path/to/somewhere

        (6)默认安全上下文查询与修改

                    semanage命令来自于policycoreutils-python包

                    查看默认的安全上下文

                            semanage fcontext -l

                    添加安全上下文(只是为用来恢复默认安全文,在所添加的特定目录下所新建的文件,继承的是当前目录的安全文而不是默认安全文)

                            semanage fcontext -a -t httpd_sys_content_t  '/testdir(/.*)?'

                            restore -Rv /testdir

                    删除安全上下文

                                semanage fcontext -d -t httpd_sys_content_t '/testdir(/.*)?'

        (7)修改端口的selinux标签

                    查看端口标签

                        semanage port -l

                    添加端口

                        semanage  port -a -t port_label -p tcp|udp PORT

                        semanage port -a -t httpd_port_t -p tcp 9527

                    删除端口

                            semanage port -a -t port_label -p tcp|udp PORT

                            semanage port -d -t port http_port_t -p tcp 9527

                    修改

                            semanageport -m -t port_label-p tcp|udpPORT

                            semanageport -m -t http_port_t-p tcp9527

        (8)selinux布尔值

                布尔型规则

                        getsebool

                        setsebool

                查看bool命令

                        getsebool [-a] [boolean]

                        semanage boolean -l

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

                设置bool值命令

                        setsebool [-P] boolean value   将设置写入配置文件

                        setsebool [-P] boolean=value

        (9)selinux日志管理

                    yum install setroublesshoot*(重启生效)

                     

                    方法一:

                        <1>将错误的信息写入/var/log/message(错误信息其实最终是在/var/log/audit/audit.log中)

                        <2>用grep setroubleshoot /var/log/messages过滤所需的信息,

                        <3>然后用“sealert -l UUID ” 查看安全事件日志说明

                    方法二:

                            sealert -a /var/log/audit/audit.log 扫描并分析日志

    6.mv /dir1/file1 /dir2/file2  file2的安全标签与file1安全标签一样

        cp /dri1/file1 /dir2/file2  file2的安全标签继承/dir2目录的安全标签

二selinux网络服务运行范例

    1.在服务器端上边启动httpd服务,并关闭防火墙

    

wKiom1ffm4Hj97rmAAAIB74IJ0w053.png

    2.在服务器端上边的/var/www/html/目录下新建文件index.html

    

wKiom1ffnFyDg2lCAAAFyTlRen0749.png

    3.在客户端上边访问pc1的httpd服务

    

wKioL1ffnPaBcA2OAAADydFtF1A737.png


wKiom1ffnPbCKIF_AAAECUtoZ9Q727.png

    发现可以成功访问

    4.在服务器端查看/var/www/html/index.html的安全上下文

wKioL1ffnr3SR8TyAAAICcakNWw084.png

    5.在服务器端的root下新建index2.html文件,查看安全上下文;然后移动到/var/www/html下,然后再查看安全上下文

        

wKiom1ffn0yiOtNFAAAU_OzNKoA760.png

发现经过mv安全上下文并没有改变

    6.在客户端访问服务器端的index2.html文件


wKioL1ffn8WBv278AAADJeLJEOI818.png


wKiom1ffn8WDMApPAAAJ1fAKvQU739.png

    发现没有权限访问


   7. 在服务器端执行grep 'setroubleshoot' /var/log/message,会出现如下界面

wKioL1ffzdHSBaThAAAODcJ4vQE068.png

    8.由上图知道,想了解更详细信息,在服务器端执行sealert -l 92d22156-08a9-4967-a2e9-aa48a3207115

    

wKiom1ffzuSzEGonAAAsl_nQyY0577.png

    9由上图可知,在服务器端执行/sbin/restorecon -v /var/www/html/index2.html科解决问题

    

wKiom1ffz0yBgQuUAAALohH_sqY985.png

    10.在客户端重新访问服务器端的web服务

/sbin/restorecon -v /var/www/html/index2.html
   发现实验成功

三、

    1、安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,设置http_sys_content_t到/website及目录下所有文件,使网站可访问
    2、修改网站端口为9527,增加SELinux端口标签,使网站可访问
    3、启用SELinux布尔值,使用户student的家目录可通过http访问

从本质上将:1、3小题实现的功能是一样的,都是死特定目录可通过http访问

第一小题:

        本题pc1指的是服务器端,pc2指的是客户端

        (1)进入pc1“httpd”服务配置文件/etc/httpd/conf/httpd.conf
,作如下修改

    修改前:    

wKioL1ff0T_xD8wqAAAR264FOLk600.png

    修改后:

    

wKiom1ff0Y6QR5BDAAAF2kX6IPI999.png

        (2)给/website目录添加默认标签规则

    

wKiom1ff0yjx1uHoAAAjCVstTWU694.png

        (3)在pc1上边的/website目录下新建index.html文件

    

wKioL1ff04TxY0ZgAAAEsDHgbcQ940.png

       (4)在pc1上边重启web服务

wKioL1ff0_rgkYPIAAAMhJ8dRdQ823.png

        (5)发现/website/index.html的安全标签如下

wKiom1ff4ZSSX_bCAAAHP9CaoiE922.png

并不是/website目录下的默认安全文        

        (6)用restorecon -Rv /website/index.html的默认安全文

  

wKioL1ff4jqRp2LaAAAPf5bV4yI792.png

 

(5)在pc2上边访问pc1的web服务

wKioL1ff1Bjx0DOcAAAByp3bOAo178.png

        

wKioL1ff3Euit38oAAACNfBVdPs398.png

 第二小题:

        (1)进入httpd服务配置文件作如下修改

    修改前:

wKioL1ff3SSA0A8cAAAJDIvrmrc745.png

    修改后:

        

wKiom1ff3TSyIAO6AAAHAWpKoJE948.png

    (2)   添加端口默认安全标签

wKiom1ff3crgNDIeAAAVdjccXTc661.png

发现http_port_t为我们要找的端口类型

    (3)为http_port_t端口类型添加9527端口

wKioL1ff30SxlcR5AAAajpxTZW0726.png

    (4)重启httpd服务

wKioL1ff4FbAnHp8AAAO-69ExJw484.png

    (5)在pc2访问pc1的web服务

wKioL1ff4LWg2K6LAAAC8QCxl-I537.png

wKiom1ff4LXiPA7VAAAEOPpc2Wo812.png

发现试验成功

    第三小题:

        (1)进入httpd服务的配置文件作如下修改

                    修改前

wKioL1ff5gfxbN-yAAAbSegd6gU913.png

                    修改后

wKioL1ff5hujUpREAAAW34q2CFI347.png

        (2)重启httpd服务,然后在pc2上边访问pc1的web服务

wKioL1ff6_iSttSRAAAJAvylGVU073.png

    (3)在pc1上边查看/~tian文件属性,然后修改为Apache进程可以切入该目录

wKiom1ff7Hrg8WpPAAAO1P23-sg097.png

    (4)此时在pc2上边访问pc1的web服务

wKioL1ff7MjzBwJ8AAAH81aJMN8312.png

    (5)在pc1的图形界面看到有selinux警报

wKioL1ff7iWSv9GLAACzz01dpms383.png

        (6)运行setsebool -P httpd_enable_homedirs 1,查看结果如下

wKiom1ff70fDKQI4AAAHlkQzxIE196.png

        (7)在pc2访问pc1的web服务

wKioL1ff74vyEorbAAAEJd0z3M4092.png

wKiom1ff74uixEXjAAAEd4xbFPg458.png