浅谈SElinux及httpd服务打不开指定页面(显示httpd服务程序默认首页面)的问题
先来做个实验
修改httpd网站数据保存目录【默认为/var/www/html 修改为 /home/wwwroot】
1.建立目录,并创建首页文件
mkdir /home/wwwroot
echo "BB" > /home/wwwroot/index.html
2.修改httpd主配置文件。
将119行DocumentRoot参数改为/home/wwwroot
将124行用于定义目录权限参数Directory 改为/home/wwwroot
vim /etc/httpd/conf/httpd.conf
3.重启httpd浏览器刷新
systemctl restart httpd
OK,上面只是简单的修改一下首页显示文件,原本是httpd默认的首页显示,现在改为两个字符“BB”的显示。上面的步骤是没有问题的,下面我们来看一下显示结果
显示的是httpd默认首页而不是我们自己设定的 ”BB“字符
现在我们尝试用ip/index.html查看
显示的是大大的Forbidden???
我们知道只有在网站的首页面文件不存在或者用户权限不足时才会显示httpd服务的默认首页面,上述我们的步骤是正确的却没有得到应该出现的结果,这个时候我们来谈谈造成这个结果的原因 -----SElinux
简单介绍一下SElinux
SElinux(Security-Enhanced Linux)是美国国家安全局在linux开源社区的帮助下开发的一个强制访问控制(MAC Mandatory Access Control)的安全子系统。它的作用就是让各个服务进程都受到约束,使其仅能获取到自己应该获取的资源
(什么是应该获取的资源?比方说一个软件是p图的,它就不该在后台获取你的密码信息,它越权了!)
SElinux服务有三种配置模式
1.enforcing :强制启用安全策略模式,将拦截服务的不合法请求
2.permissive:遇到服务越权访问,只发出警告而不强制拦截
3.disabled:对于越权的行为不警告不拦截(关闭)
非常可惜的是SElinux服务比较复杂,配置难度也很大,加之很多运维人员对这项技术理解不深,从而导致很多服务器部署好linux系统之后直接将SElinux禁用了(也包括本人。。。)
现在我们来分析一下之前操作哪里出现了问题
httpd服务程序的功能是允许用户访问网站内容,所以SElinux肯定会默认放行用户对网站的请求操作。但是,我们将网站数据的默认目录修改为/home/wwwroot 我们知道/home是用来存放普通用户的家目录数据,而现在httpd提供的网站服务却要去获取普通用户家目录的数据,这显然违反了SElinux的监管原则。
SElinux默认运行状态是Enforcing,可以用setenforce[0|1] 修改SElinux当前运行模式(0为禁用,1为启用)。注意这种修改只是临时的,在系统重启之后就会失效。如果要永久修改需要进入配置文件 /etc/selinux/config 将SElinux=enforcing修改为SElinux=disabled就可以永久关闭(个人不是很建议)。可以用getenforce命令获取当前SElinux的运行模式
我们暂时将SElinux修改为禁用
随后打开之前的网页,就可以看到正常的网页内容了
其实最好的办法是修改SElinux的安全上下文值:用semanage命令,将当前网站目录/home/wwwroot的SElinux安全上下文修改为原始网站目录一样就可以了,这样即使SElinux在启用状态下也不会影响正常访问网页,个人对SElinux理解不深,这篇就不多做赘述了。