RHEL之(九)Red Hat Linux SELINUX的原理和配置
SELINUX的原理和配置
SELinux,Security Enhanced Linux 的缩写,也就是安全增强型 Linux,是强制访问控制(MAC)安全系统。对于linux安全模块来说,SElinux的功能是最全面的,测试也是最充分的,这是一种基于内核的安全系统。是由美国国家安全局(NSA)联合其他安全机构(比如 SCC公司)共同开发的。
旨在增强传统 Linux 操作系统的安全性,解决传统 Linux 系统中自主访问控制(DAC)系统中的各种权限问题(如 root 权限过高等)。
举个例子:
在windows下如果安装了一些安全软件的话,当我们执行某个命令之后,如果此安全软件认为这个命令对系统是一种危害,则会阻止这个命令继续运行。比如在powershell里创建一个用户 net user tom /add,安全软件会认为这个操作是不安全的,然后会阻止:

同理,在rhel8里的selinux实现的是类似的功能,selinux全称是Security-Enhanced Linux,目的是提高系统的安全性。
当我们执行某个操作的时候如果selinux认为此操作有危险,则会拒绝进一步的访问。
一、准备工作
进行实验前的前提准备:安装和启动httpd服务。

此时如果测试访问本地网页,可以访问,并查看以下httpd进程。


二、Selinux原理
(1)SElinux的状态

命令"getenforce"可以查看SElinux的状态,SElinux的状态分为以下三种:
Enforcing (1) 强制模式 //打开并启用
Permissive (0) 警告模式 //打开但不启用
Disabled 关闭模式 //关闭并不启用
"setenforce"可以设置SElinux的状态,但是只能设置0和1两种,即警告模式或者强制模式。
如果需要永久关闭,则在配置文件"/etc/sysconfig/selinux"下将"SELINUX=enforcing"改为"SELINUX=disabled",因为SElinux是基于内核的安全系统,所以在设置完成之后需要重启内核,即需要重启电脑才可以生效。
临时切换selinux模式:

永久切换selinux模式:需要修改配置文件 /etc/selinux/config(修改/etc/sysconfig/selinux也可以,因为它是/etc/selinux/config的软链接)

禁用SELINUX:SELINUX=disabled(需要重启系统)

系统重启时会对当前系统文件重打SELINUX标签,对当前的系统文件重新进行SELINUX标记,重打完标签后系统会再次重启。

启用只记录:SELINUX=permissive

(2)Selinux的安全上下文
普通的用户权限:
一切皆文件,由用户所属者,所属组,权限控制访问组成
例如:
主体:这个用户(user10)
客体:/var/www/html/index.html
user10 → /var/www/html/index.html 具备 r 权限,就已经可读了
在Selinux中:
一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问所有文件和端口资源和进程都具备安全标签:安全上下文(security context)
例如:
主体:进程(httpd进程)
客体:/usr/local/www/index.html(文件)
安全性上下文:只有客体(文件:/usr/local/www/index.html)的安全性上下文符合主体(进程httpd)的安全性上下文的设置时候,这个主体才能够被允许访问这个客体文件。
即当安全性上下文互相符合时,主体才有访问客体的权限。
实验情景模拟
A、将httpd.conf的DocumentRoot改为/usr/local/www/目录,下面的<Directory>配置项也要同步修改,并重启httpd服务。
首先打开httpd服务配置文件/etc/httpd/conf/httpd.conf

打开文件后,输入“/DocumentRoot ”快速定位到想要修改的位置

修改后的文件如下图:

B、在/usr/local/www/下新建index.html文件,内容为同样的“Hello,Linux!”

C、使用curl http://localhost/index.html进行本地访问测试,发现HTTP 403(无权限访问):

D、我们对index.html的所有者和属组修改为apache,再次验证同样报错403:

E、使用命令ps -efZ | grep httpd查看httpd进程的安全上下文类型:

F、使用命令ls -lZ /usr/local/www/index.html查看本地文件的安全上下文类型:

可以通过对比得知,html文件的安全上下文类型为usr_t,但是httpd进程的安全上下文类型却为httpd_t,主体和客体的安全上下文类型不同,所以报错http 403,无权限访问。
问题:在SELINUX=enforcing的情况下,如果SELINUX安全上下文类型不一致,该如何处理?
方法一:修改其默认值(一般是修改它的默认安全上下文类型),再还原默认值进行应用。

针对目录的修改默认安全上下文:

Tips: (/*)? 指该目录下所有的子文件以及目录
回到实验情景模拟的情况:


方法二:不修改默认值,就修改文件的当前安全上下文类型值

Tips:使用参考文件/文件夹的安全上下文类型,应用到目标文件或文件夹中
