SELinux简介

  • SELinux简介

    SELinux:安全增强式Linux

    安全增强式Linux(SELinux,Security-Enhanced Linux)是一个Linux内核的安全模块,其提供了访问控制安全策略机制,包括了强制访问控制(Mandatory Access Control,MAC)。

    SELinux是一组内核修改和用户空间工具,已经被添加到各种Linux发行版中。其软件架构力图将安全决策的执行与安全策略分离,并简化涉及执行安全策略的软件的数量。SELinux的核心概念可以追溯回美国国家安全局(NSA)的一些早期项目。

  • SELinux基本概念

    操作系统的安全机制其实就是对两样东西做出限制:进程和系统资源(文件、网络套接字、系统调用等)。

    在之前学过的知识当中,Linux操作系统是通过用户和组的概念来对我们的系统资源进行限制,我们知道每个进程都需要一个用户才能执行。

    在SELinux当中针对这两样东西定义了两个基本概念:域(domin)和上下文(context)。

    域就是用来对进程进行限制,而上下文就是对系统资源进行限制

    我们可以通过 ps -Z 命令来查看当前进程的域的信息,也就是进程的SELinux信息:

    1.[hg_lzy@localhost ~]$ ps -Z

    2.LABEL PID TTY TIME CMD

    3.unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 26517 pts/1 00:00:00 bash

    4.unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 26563 pts/1 00:00:00 ps

    而通过 ls -Z 命令我们可以查看文件上下文信息,也就是文件的SELinux信息:

    点击查看

    1.[hg_lzy@localhost 桌面]$ ls -Z /

    2.dr-xr-xr-x. root root system_u:object_r:bin_t:s0 bin

    3.dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot

    4.drwxr-xr-x. root root system_u:object_r:device_t:s0 dev

    5.drwxr-xr-x. root root system_u:object_r:etc_t:s0 etc

    6.drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home

    7.dr-xr-xr-x. root root system_u:object_r:lib_t:s0 lib

    8.dr-xr-xr-x. root root system_u:object_r:lib_t:s0 lib64

    9.drwx------. root root system_u:object_r:lost_found_t:s0 lost+found

    10.drwxr-xr-x. root root system_u:object_r:mnt_t:s0 media

    11.drwxr-xr-x. root root system_u:object_r:autofs_t:s0 misc

    12.drwxr-xr-x. root root system_u:object_r:mnt_t:s0 mnt

    13.drwxr-xr-x. root root system_u:object_r:autofs_t:s0 net

    14.drwxr-xr-x. root root system_u:object_r:usr_t:s0 opt

    15.dr-xr-xr-x. root root system_u:object_r:proc_t:s0 proc

    16.dr-xr-x---. root root system_u:object_r:admin_home_t:s0 root

    17.dr-xr-xr-x. root root system_u:object_r:bin_t:s0 sbin

    18.drwxr-xr-x. root root system_u:object_r:security_t:s0 selinux

    19.drwxr-xr-x. root root system_u:object_r:var_t:s0 srv

    20.drwxr-xr-x root root ? sys

    21.drwxrwxrwt. root root system_u:object_r:tmp_t:s0 tmp

    22.drwxr-xr-x. root root system_u:object_r:usr_t:s0 usr

    23.drwxr-xr-x. root root system_u:object_r:var_t:s0 var

  • 策略

    在SELinux中,我们是通过定义策略来控制哪些域可以访问哪些上下文。

    在SELinux中,预置了多种的策略模式,我们通常都不需要自己去定义策略,除非是我们自己需要对一些服务或者程序进行保护

    在CentOS/RHEL中,其默认使用的是目标(target)策略,那么何为目标策略呢?

    目标策略定义了只有目标进程受到SELinux限制,非目标进程就不会受到SELinux限制,通常我们的网络应用程序都是目标进程,比如httpd、mysqld,dhcpd等等这些网络应用程序。

    在 Cent OS 6 中, SELinux 配制文件存放在/etc/sysconfig/selinux中:

    1.[hg_lzy@localhost ~]$ cat /etc/sysconfig/selinux

    2.

    3.# This file controls the state of SELinux on the system.

    4.# SELINUX= can take one of these three values:

    5.# enforcing - SELinux security policy is enforced.

    6.# permissive - SELinux prints warnings instead of enforcing.

    7.# disabled - No SELinux policy is loaded.

    8.SELINUX=enforcing

    9.# SELINUXTYPE= can take one of these two values:

    10.# targeted - Targeted processes are protected,

    11.# mls - Multi Level Security protection.

    12.SELINUXTYPE=targeted

  • SELinux模式

    SELinux的工作模式一共有三种 enforcing、permissive和disabled

    ①enforcing 强制模式:只要是违反策略的行动都会被禁止,并作为内核信息记录

    ②permissive 允许模式:违反策略的行动不会被禁止,但是会提示警告信息

    ③disabled 禁用模式:禁用SELinux,与不带SELinux系统是一样的,通常情况下我们在不怎么了解SELinux时,将模式设置成disabled,这样在访问一些网络应用时就不会出问题了。

    我们如果要查看当前SELinux的工作状态,可以使用 getenforce 命令来查看:

    1.[hg_lzy@localhost ~]$ getenforce

    2.Enforcing

    我们如果要设置当前的SELinux工作状态,可以使用 setenforce [0|1] 命令来修改,setenforce 0表示设置成 permissive,1表示enforcing

    通过 setenforce 来设置SELinux只是临时修改,当系统重启后就会失效了,所以如果要永久修改,就通过修改SELinux主配置文件.

    我们可以通过 ls -Z 这个命令来查看我们文件的上下文信息,也就是SELinux信息,我们发现其比传统的 ls 命令多出来了 system_u:object_r:admin_home_t:s0 这个东西,我们现在就来分析一下这段语句所代表的含义

    1.system_u:object_r:admin_home_t:s0

    2.#这条语句通过':'划分成了四段,第一段 system_u 代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是类型,最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管

    ①system_u  指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。

    ②object_r  object_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。

    ③admin_home  文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限。

  • 实例

    下面我们通过一个实例来看一下上下文 context 的值和SELinux的访问控制

    比如说我搭建好了一个Web服务器,我们知道www服务器其默认网页存放位置是在 /var/www/html 这个目录下,我们如果在这里新建一个 index.html 测试页面,启动我们的www服务器,刷新就能见到其内容了,这时我们如果是在我们的 /home 目录下建立一个 index.html 页面,然后将其移动到 /var/www/html 这个目录下,再刷新页面,其还会不会正常显示呢?

    首先安装httpd服务并启动它:

    1.[root@localhost html]# yum install httpd -y

    2.已加载插件:fastestmirror, refresh-packagekit, security

    3.设置安装进程

    4.Loading mirror speeds from cached hostfile

    5.* base: mirrors.cqu.edu.cn

    6.* extras: mirrors.cqu.edu.cn

    7.* updates: mirrors.cqu.edu.cn

    8.base | 3.7 kB 00:00

    9.extras | 3.4 kB 00:00

    10.updates | 3.4 kB 00:00

    11.解决依赖关系

    12.

    13._64 0:2.2.15-69.el6.centos will be 安装

    14.

    15.

    16.依赖关系解决

    17.

    18.==============================================================================================

    19.软件包 架构 版本 仓库 大小

    20.==============================================================================================

    21.正在安装:

    22.httpd x86_64 2.2.15-69.el6.centos base 836 k

    23.

    24.事务概要

    25.==============================================================================================

    26.Install 1 Package(s)

    27.

    28.总下载量:836 k

    29.Installed size: 3.0 M

    30.下载软件包:

    31.httpd-2.2.15-69.el6.centos.x86_64.rpm | 836 kB 00:00

    32.运行 rpm_check_debug

    33.执行事务测试

    34.事务测试成功

    35.执行事务

    36.正在安装 : httpd-2.2.15-69.el6.centos.x86_64 1/1

    37.Verifying : httpd-2.2.15-69.el6.centos.x86_64 1/1

    38.

    39.已安装:

    40.httpd.x86_64 0:2.2.15-69.el6.centos

    1.[root@localhost html]# service httpd start

    2.

    3.正在启动 httpd:httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName

    4. [确定]

    5.

    然后打开浏览器,输入我们的 127.0.0.1 来访问,此时看到的界面是Apache的测试界面:

    因为我们此时的 /var/www/html 下还不存在index.html页面:

    1.[root@localhost /]# ll /var/www/html/

    2.总用量 4

    3.-rw-r--r--. 1 root root 5 7月 2 16:16 index1.html

    接下来我们在 /home 目录下建立一个 index.html 的页面,然后将其移动到我们的 /var/www/html 目录下:

    1.[root@localhost home]# vi index.html

    2.#test Esc :wq

    3.[root@localhost home]# mv ./index.html /var/www/html/

    4.[root@localhost home]# ls /var/www/html/

    5.index.html

    此时,按照正常情况,因为html目录下存在了一个index.html的页面,我们此时如果刷新浏览器页面,应该会跳转到index.html页面的

    但是事实我们发现,页面还是在这个测试页面,到底是为什么呢?这个就跟我们的SELinux的安全策略有关系了,我们可以去 /var/log/audit 这个目录下查看 audit.log 这个文件,从中找出错误信息

    1.[root@localhost home]# tail /var/log/audit/audit.log

    2.type=AVC msg=audit(1593743915.554:91): avc: denied { getattr } for pid=3109 comm="httpd" path="/var/www/html/index.html" dev=dm-0 ino=399541 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=file

    先通过 ls -Z 命令先看index.html的上下文信息:

    1.[root@localhost home]# ls /var/www/html/ -Z

    2.-rw-r--r--. root root unconfined_u:object_r:home_root_t:s0 index.html

    我们发现其第三个字段的类型是 home_root_t,这是为什么呢?因为我们刚才是在 /home 目录下创建的这index.html文件,所以其默认会继承上一层目录的SELinux的类型信息,我们可以查看一下 /home 这个目录的上下文信息:

    1.[root@localhost home]# ls -Z -d /home/

    2.drwxr-xr-x. root root system_u:object_r:home_root_t:s0 /home/

    我们看到,其第三个字段和我们刚才的index.html相同,由此可以看出文件的context值是受上一级目录影响的,一般情况下它们会继承上一级目录的context值,但是,一些安装服务产生的文件context值会例外,不继承上级目录的context值,服务会自动创建它们的context值,比如没有装http服务的时候/var/目录下时没有www目录的,安装httpd服务后该服务会自动创建出所需的目录,并定义与服务相关的目录及文件及context值,它们并不会继承上级目录的context值。

    1.[hg_lzy@localhost ~]$ ls -Z -d /var/www/html/

    2.drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

    3.[hg_lzy@localhost ~]$ ls -Z -d /var/www/html/index.html

    4.-rw-r--r--. root root unconfined_u:object_r:home_root_t:s0 /var/www/html/index.html

    此时我们发现我们的 /var/www/html 这个目录的上下文类型是 httpd_sys_content_t, 而我们刚才移动过来的 index.html 的类型却是 home_root_t,因为我们此时的SELinux的工作模式是 enforcing,所以对于违反策略的行动是被禁止的,所以我们刷新页面并不会出现我们的index.html里面的信息,那么我们这个时候应该解决这个问题呢?

    通常解决办法由两种:

    ①直接将SELinux的工作模式设置成 disabled,这样就不会出现策略拦截问题了,但是这样的话我们的系统就没有SELinux安全防护了

    ②通过 restorecon 或者 chcon 命令来修复我们的文件上下文信息

    命令 restorecon 可以用来恢复文件默认的上下文:

    1.[root@localhost hg_lzy]# restorecon -R -v /var/www/html/

    2.restorecon reset /var/www/html/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0

    3.//-R 表示递归,如果是目录,则该目录下的所有子目录、文件都会得到修复

    命令 chcon 可以改变文件的上下文信息,通常我们使用一个参照文件来进行修改:

    1.chcon --reference=/var/www/html/index.html /var/www/html/test.html

    这里使用restorecon,我们看到,使用 restorecon 命令以后,index.html的上下文信息就继承了上一级目录 html 这个目录的上下文信息了,这个时候我们再刷新页面就可以看到我们index.html里面的内容了:

    通过这个实例我们就明白了文件的上下文信息与SELinux之间的关系了,并知道了通过查看 /var/log/audit/audit.log 这个日志文件的信息找出错误所在,以及通过 restorecon 命令来修复我们的文件的上下文信息。

David_Li

我还没有学会写个人说明!

相关推荐

优化Linux下的内核TCP参数以提高系统性能

优化Linux下的内核TCP参数以提高系统性能
内核的优化跟服务器的优化一样,应本着稳定安全的原则。下面以Squid服务器为例来说明,待客户端与服务器端建立TCP/IP连接后就会关闭Socket,服务器端连接的端口状态也就变为TIME_WAIT了。那是不是所有执行主动关闭的Socket都会进入TIME_WAIT状态呢?有没有什么情况可使主动关闭的Socket直接进入CLOSED状态呢?答案是主动关闭的一方在发送最后一个ACK后就会进入TIME_WAIT状态,并停留2MSL(报文最大生存)时间,这是TCP/IP必不可少的,也就是说这一点是“解决”不了的。
TCP/IP设计者如此设计,主要原因有两个:

暂无评论