SELinux介绍

    DAC:自由访问控制

    MAC:  强制访问控制

           DAC环境下进程是无束缚的

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

            MAC环境下进程可以被限制

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

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

 


  • Selinux策略

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

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

    Selinux中所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予格子衣domain的标签。domain标签能够执行的操作由安全策略里定义

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

    安全策略:定义主体读取对象的规则类数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一个对象是允许还是拒绝,并且定义了哪种行为是允许或拒绝


  • Selinux安全上下文

    传统Linux,一切接文件,由用户,组,权限控制访问

    在Selinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问

    所有文件和端口资源和进程都具备安全标签:安全上下文(security context)

    安全上下文有五个元素组成:

        user:role:type:sensitivity:category

        user_u:object_r:tmp_t:s0:c0

    实际上下文:存放在文件系统中,ls -Z;ps -Z可以查看详细信息

    期望(默认)上下文:存放在二进制的SElinux策略库(映射目录和期望安全上下文)

        semanage  fcontext  -l


  • 五个安全元素

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

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

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

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

    Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret,一个对象可以有多个catagroy,c0-c1-23共1024个分类,Target策略不适用category

  • Selinux配置文件

    Selinux配置文件(configuration)或策略文件(policy)位于/etc/目录下

    /etc/sysconfig/selinux是一个符号链接,真正的配置文件为:/etc/selinux/config

  • Selinux常用工具

    chcon命令修改文件安全上下文

        chcon [options] CONTEXT files

        说明:

            CONTEXT为要设置的安全上下文

            files对象(文件)

            options

                -f: 强迫修改

                -R:递归修改对象的安全上下文

                -r ROLE:修改安全上下文角色的配置

                -t TYPE:修改安全上下文类型的配置

                -u USER:修改安全上下文用户的配置


在我们的实际生产环境中跟文件权限最相关的是位于第三字段的数据类型,下面我们就用具体的示例来讲解一下修改文件的type类型导致文件权限的变更

我们通过更改/var/log/messages文件的安全上下文类型来做一下演示

首先查看messages文件的原有标签

ls -Z   /var/log/messages

现将message更改成default_t类型

因为我们更改了messages文件的安全上下文所有导致此文件与/var/log目录上下文标签不匹配所以所有日志都将无法写入此文件

更改回原来的标签类型

chcon -t var_log_t  /var/log/messages

还可以使用第二种方法直接恢复

首先查询selinux策略的数据库种messages对应的标签类型,然后使用restorecon后面跟/var/log/message直接恢复即可

semanage fcontext   -l  |  grep /var/log/message

注意:此命令要求Selinux的策略数据库中必须曾经记录过此文件的标签

假设此时我们需要自己创建一个网页文件,那么该怎样设置它的文件标签呢?

首先创建一个目录/data

在目录中任意创建几个文件a.txt,b.txt

我们使用ls -Z  /data查看会发现新创建的文件的标签默认为default_t

这里我们可以知道自己手动常见的文件因为selinux安全测录==策略数据库中没有记载,所以一律为defaults_t标签类型

查看一下在/httpd服务的主目录下的文件标签类型为httpd_sys_content_t,此类型标签代表了用户可以从主目录进入访问的标签类型

防火墙策略放行httpd服务之后用浏览器访问

浏览器可以正常访问登录

那么如果我们自己从新在/data目录下定义一个网页会怎样?

首先修改httpd的配置文件

在/data目录下创建一个名为test2.html的网页文件

并添加内容test2 page!!!

将DocumentRoot主目录定义到/data下,并通过浏览器重新访问

此时我们查看一下手动创建的test2.html文件它的标签为default_t类型

此类型的标签导致我们访问失败

然后我们修改test2.html的文件类型标签,之后重启服务并重新访问

chcon -t  httpd_sys_content_t  test2.html

备注:我们在为自己创建的文件设置标签时,首先的知道此类型的文件需要打上哪种标签,可以到selinux的安全策略库中查询一下。

当然我们如果每次都手动设置每个文件会比较麻烦,所以我们可以直接将/data父目录设置成httpd类型的标签,并将此目录加到selinux的安全策略库中

使用如下命令:

这样以后所有在/data目录下创建的文件都会自动打上http_sys_content_t标签类型


接下来说一下端口的定义:

  • Selinux端口标签

查看端口标签

    semanage port -l

添加端口

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

    semanage port -a -t http_port_t -p tcp  8998

删除端口

    semanage port -d  -t port_lable -p tcp|udp  PORT

    semanage port -d -t http_port_t -p tcp 8998

修改现有端口为新标签

    semanage port -m -t port_label -p  tcp|upd PORT

    semanage port -m -t http_port_t -p tcp 8998  


我们查看一下系统中httpd服务支持的端口

使用semanage port -a -t http_port_t -p tcp 8998

可以看到httpd服务支持的几个端口

然后我们手动将8998端口定义到httpd服务支持的端口中,并修改httpd服务的配置文件让它监听在8998端口上,重启服务之后,使用浏览器访问网站

可以看到网站监听在新的端口上,并且能够正常访问。


最后我们在来说一下Selinux的布尔值

SELinux布尔值

布尔值规则

    getsebool

    setsebool

查看bool命令

    getsebool [-a] [boolean]

    semanage boolean -l

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

设置bool值命令

    setsebool [-P] boolean value(on ,off)

    setsebool [-P] Boolean value(0,1)

例如查看一下ftp服务当前所有生效的布尔型值

如果希望ftp支持匿名上传可以将第一项ftpd_anon_write -->off改为on

setsebool ftpd_anon_write=1

备注:此命令更改的只是内存中的数据,只起到临时生效的作用

想让更改永久生效则使用 -P 选项


上面的内容就是关于Selinux安全上下文的讲解