Selinux详解-上下文的理解

selinux介绍

在windows下如果安装了一些安全软件的话,当我们执行某个命令之后,如果此安全软件认为这个命令对系统是一种危害,则会阻止这个命令继续运行。比如在powershell里创建一个用户 net user tom /add,安全软件会认为这个操作是不安全的,然后会阻止:
file
同理,在rhel/centos里的selinux实现的是类似的功能,selinux全称是Security-Enhanced Linux,目的是提高系统的安全性。当我们执行某个操作的时候如果selinux认为此操作有危险,则会拒绝进一步的访问。

了解上下文

在开启了selinux的情况下,selinux会为每个文件、每个进程都分配一个标签,这个标签我们称之为上下文(context),后续说标签和上下文是同一个概念,查看上下文时需要加上Z选项。比如查看进程的上下文:
file
这里可以看到httpd的上下文为httpd_t。
查看文件的上下文:
file
这里可以到/var/www/html/的上下文为httpd_sys_content_t。
特定上下文的进程,只能访问特点上下文的文件,如下图:
file
假设一个进程xx的标签是aa-p,它能访问标签为aa-f的文件,所以xx进程访问文件aa是没问题的,因为标签匹配了。但是进程xx访问文件bb的时候却是访问不了的,即使bb文件的权限为777也是访问不了的,因为文件bb的标签是bb-f。

下面我们来做一个测试:
在server上创建目录/web/www,并写一些测试数据到/web/www/index.html里:
file
查看/web/www的上下文:
file
可以看到上下文为default_t。

把/web/www软连接到/var/www/html/www,如下:
file
当我们在地址栏里输入192.168.26.100/www时,其实访问的是/web/www里的内容。
确保httpd服务是运行的:
file
并确保防火墙放行了http服务:
file
现在客户端上访问此内容:
file
发现是访问是被拒绝的,我们来分析一下原因:
当客户端在浏览器地址栏输入192.168.26.100/www连接到服务器的时候,服务器会有一个httpd进程来“接待”这个客户端的连接请求,然后httpd根据用户的请求去访问目录/web/www,如下图:
file
前面已经看到httpd进程的上下文是httpd_t,/web/www的上下文是default_t,这两个是不匹配的,所以进程httpd访问目录/web/www时被拒绝。但是httpd进程是可以正常访问/var/www/html的(上下文为httpd_sys_content_t),考虑如果把/web/www的上下文改成httpd_sys_content_t是不是就可以使得进程httpd能访问了呢?
改变上下文的命令: chcon -R -t 上下文 目录,这里选项R的意思是递归。
把/web/www上下文改成httpd_sys_content_t:
file
在浏览器里再次方式试试:
file
是可以正常访问的了。如果要恢复目录的默认上下文可以用
file
此时浏览器里又是被拒绝。
如果想修改默认上下文:
file
请思考一下最后的"/web/www(/.)?" ,这里正则是什么意思呢。
file
可以看到此时已经修改了默认的上下文。如果要是想删除默认上下文的话,把上面命令的-a换成-d即可:
semanage fcontext -d -t httpd_sys_content_t "/web/www(/.
)?"
请大家自行考虑下/web/www(/.*)?这里正则的意思是什么。

相关新闻

                                                                                                                                    RHCE9学习指南连载,点击阅读