phpcmsV9权限不可写-无法生成首页

phpcmsV9加777权限后仍然不可写的原因

phpcmsV9安装过程中已经发现了文件或目录赋予777权限后仍然不可写的问题,当时,临时解决的方法是关闭了防火墙,挺有效的,但治标不治本啊。

命令:setenforce 0回车;//临时关闭防火墙,重启后失效,当然也可以永久关闭,但总觉着还是不妥吧。
命令:setenforce 1回车;//开启防火墙。

防火墙开启后,在后台更新一下首页,发现仍然是不可写入:

phpcmsV9权限不可写-无法生成首页
无法生成首页,不可写。
服务器上查看相关文件及目录权限为777
服务器上查看相关文件及目录权限为777,如index.html

 

这是为什么呢?接下来具体一步步研究测试一下:

1、首先把phpcmsV9程序上传到一个阿里云主机上如下图,与之前phpcmsv9安装步骤一样,重新操作了一遍发现不用修改默认权限就可以通过权限检查,默认目录权限755,文件644,有没有什么发现?

阿里云主机上phpcmsv9文件权限
在FTP工具上可以很明显看出阿里云主机上的文件权限,目录默认755,文件默认644

755=rwx r-x r-x
644=rw- r– r–
很直观,写权限w只有所有者有,所属组及其他人都没有写的权限;

2、通过上面的分析,我们再到自己本地的服务器上测试一下:

命令:setenforce 0回车;//问题还没解决,临时关掉;
命令:cd /var/www/html/phpcmsv9回车切换到网站所在目录;
命令:ls -l回车查看当前目录文件属性;
这里仍然以index.html文件为例,现在index.html为777权限,后台可正常生成首页;接下来改一下index.html的权限测试一下;
命令:chmod 644 index.html回车;//再切换到浏览器后台生成首页,提示不可写;
命令:chmod 664 index.html回车;//再生成首页,提示仍然不可写;
命令:chmod 666 index.html回车;//再生成首页,提示首页更新成功
phpcmsV9权限不可写原因分析-权限测试
这样容易理解了,自己服务器上需要其他人有写的权限才行,云主机上是所有者有写的权限就行。
这权限太奇葩了,所有者都不行,非得其他人能写,有违常理啊。
也可以这样理解吧,本机服务器要求写权限的用户与所有者并非同一用户,而是属于其他人,并非root在要求写入(这里文件目录的所有者所属组都是root),那么,这个其他人是何许人也?默认当然是apache咯,因为是在lamp环境下来运行网站程序的。可以使用命令查看一下:
命令:cat /etc/httpd/conf/httpd.conf回车查看一下apache配置文件,会发现两行:
User apache
Group apache
对了,就是它。

既然默认是apache要求写入,那么这里有四种解决思路:

a.直接将其他人添加写的权限,也就是之前测试安装phpcmsv9时的解决方法,这样明显有安全缺陷;

b.将phpcmsv9目录及其子目录所有文件(或者仅程序要求写入的目录及文件)所有者改为apache;//命令:chown -R apache phpcmsv9回车递归修改根目录下所有目录及文件所有者为apache;

c.将apache配置文件httpd.conf中的user改为相应所有者,这里是root,当然不建议以root权限运行,可以新建用户;//命令:useradd phpcmsv9回车新建一个用户,命令:vi /etc/httpd/conf/httpd.conf回车按a进入编辑模式,向下翻到User apache修改为User phpcmsv9按esc键退出编辑模式,输入:wq回车保存退出,命令:systemctl restart httpd回车重启apache服务,然后按照b的方式修改所有者为phpcmsv9即可。

d.将程序要求写入的目录及文件添加apache用户的ACL权限(所有者、所属组、其他人之外的一个特殊权限);//不想改变所有者但又得给权限就只有这样咯,命令:setfacl -m u:apache:rwx test(新建的一个测试目录)回车,网站根目录就对apache用户添加了acl权限,网站根目录及子目录必须给rwx的权限,其它文件给rw即可,如下图权限多了一个+号说明添加了acl权限。
phpcmsV9权限不可写原因分析-ACL权限设置

四种方式都能解决权限问题,但一般的虚拟主机用户都不会出新类似问题,因为服务商基本都设置好了的。说了这么多虽然还没到重点,但对于linux的权限问题梳理学习了一下,还是值得的。

权限解决后,命令:setenforce 1回车开启防火墙,然后再去更新一下首页,照常又出现了不可写的提示,所以最终还是得从setenforce这里入手。

3、通过上面的权限分析,可以确定原因在于防火墙拦截了apache的写入请求,而setenforce是selinux的配置命令,那么我们先了解一下selinux,访问下面的链接阅读:

a、SELinux安全系统基础
b、SELinux入门

文章a带实例很容易理解,主要讲了selinux安全策略之文件属性的上下文关系,

 

 

 

4、总结,在/var/www/html/下新创建一个demo目录演示整个步骤;

命令:unzip phpcms_v9.6.0_UTF8.zip回车;//解压phpcms官方安装ZIP包;
命令:mv install_package demo回车;//将安装程序目录改名为demo;
命令:chown -R apache demo回车;//将demo目录递归修改所有者为apache;
命令:ls -Z回车;查看一下上下文关系,如果程序压缩包直接下载到html目录解压不会有问题,如果下载到www外其它目录再移动到html目录,那么其上下文关系就需要修改,不然selinuux防火墙会禁止访问;
命令:restorecon -Rv demo回车;//递归修改上下文关系,直接下载到html文件夹的可省略;
drwxr-xr-x. apache root unconfined_u:object_r:httpd_sys_content_t:s0 demo

 

 

 

 


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注