SELinux影响“failed to open stream: Permission denied” PHP错误

8

昨天我花了5个小时,一直在发现一个看似不合理的错误“无法打开流。权限被拒绝”,这个错误发生在写入文件系统的任何操作之后:fopen(使用“w”和“a”标志),move_uploaded_file,file_put_contents。

我多次检查了目录所有者(用户和组 - chown,chgrp),将文件夹属性更改为不安全的777(rwx与chmod),但没有效果。我甚至重新安装了Apache和PHP,但仍然面临着相同的错误。

经过几个小时的阅读各种文档后,我发现错误的根源是SELinux限制自动应用于Apache服务httpd。我通过编辑我的Fedora(版本20)上的/etc/selinux/config文件来关闭SELinux,即更改以下行:

SELINUX=enforcing

to

SELINUX=disabled

我重新启动了电脑,烦人的错误终于消失了。
我必须注意到,在LAMP环境中关于“权限被拒绝”的问题的所有Stack Overflow问题都只涉及文件夹权限问题,而这并不是我的情况。
1.(实用)如何在不完全禁用SELinux的情况下授予Apache httpd服务对目录的写入-删除-更新权限?
2.(理论)什么是SELinux?它的目的是什么?为什么(出于什么原因)创建它?为什么应该使用它?在本地开发机器上保持SElinux启用的原因是什么?
仅供资源的管理员:我知道这个问题涵盖的更多是管理而不是实际编程,但我确信它对开发人员的影响比初学者管理员严重得多,因此在SuperUser和StackOverflow之间选择后者。然而,您可以选择将问题移至SuperUser或保留在此处。

对我来说,这听起来更适合在http://serverfault.com/上提问。 - Nameless One
我已经有一段时间没有尝试 SELinux 系统了 - 对于本地开发,我发现它被过度锁定。我会在本地关闭它,但我预计它在生产中非常有用。 - halfer
我认为对于管理员来说,这是一个非常普遍且可能为人所知的问题(就像程序员应该为什么使用继承),但对于程序员来说,这可能非常有帮助——如果我昨天在搜索引擎索引中找到了一些类似的主题,我会节省约5小时的时间。然而,我会把这个问题放在哪里由管理员决定。 - broadcast-the-skills
2个回答

9
我不是专家,但我自己遇到了一些SELinux问题。我阅读了几篇文章,从中我得知SELinux是服务器的另一个安全层,应该保持开启状态,而不是因为无知而关闭(这是我看到的引文,不是我的话)。我发现这个网站很有用,也很好玩,它可能会给你比我更多的信息。 http://stopdisablingselinux.com/ 以下是我遇到的一些问题:
您可以使用以下命令检查当前的SELinux权限:
ls -lZ

您可以使用以下命令设置SELinux权限:
chcon unconfined_u:object_r:httpd_user_content_t:s0

您可以使用通配符来更改目录中的所有文件,如下所示:

chcon unconfined_u:object_r:httpd_user_content_t:s0 *

您可以使用以下命令递归地设置所有文件和目录的权限(这是解决权限问题的常用命令,应避免使用777):
chcon -R unconfined_u:object_r:httpd_user_content_t:s0 *

如果您希望使用主目录来提供站点或应用程序,则需要执行此命令:

setsebool -P httpd_enable_homedirs=1

我在CentOS上使用fsockopen时遇到了Selinux的问题,我不得不使用以下命令(-P使此更改永久化,您可能还需要此命令):

setsebool -P httpd_can_network_connect 1

您可以使用以下命令查看HTTPD上设置的标志:
sestatus

我认为最后一个问题是,在服务器上遇到了公钥/私钥身份验证问题,需要运行以下命令来修复它(我认为这是一个已知的bug):

restorecon -R -v /home

希望这些片段和信息对您有所帮助,而不只是一个疯子的胡言乱语。


我目前正在观看从stopdisablingselinux.com链接过来的演示,其中的命令看起来非常有用。谢谢! - broadcast-the-skills

5
除了HumbleRat非常有用的答案之外,以下是解决我的Apache无法在专用目录中写入日志的问题的方法:

# Allow write only to specific dirs
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/logs -R

来源:https://blog.lysender.com/2015/07/centos-7-selinux-php-apache-cannot-writeaccess-file-no-matter-what/

该篇文章介绍了如何解决在CentOS 7中使用SELinux时,PHP和Apache无法写入或访问文件的问题。作者提供了两种解决方案:一种是通过更改SELinux上下文解决该问题,另一种是通过设置SELinux Booleans来解决该问题。这些解决方案将帮助用户了解如何在使用SELinux时配置Apache和PHP以写入和访问文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接