【问题标题】:RHEL + PHP : writing files outside /var/www/html?RHEL + PHP:在 /var/www/html 之外写入文件?
【发布时间】:2023-12-31 21:53:02
【问题描述】:

我正在尝试打开一个文件进行读/写。我一直在 Ubuntu 上开发,没有任何问题。现在是部署到 RHEL 服务器的时候了,我发现要写入的文件的位置似乎存在某种限制。

在 RHEL 上,我无法打开文件,除非它位于 /var/www/html 下。我不知道如何允许其他位置。出于磁盘空间管理的原因,我需要操作不同卷上的文件。

以下代码在 Ubuntu 上运行良好,但如果文件位于 Web 根目录之外,则在 RHEL 上会中断:

$repometa = fopen( "/path/to/file/it/does/exist/and/has/good/perms", "r+b");

实际错误如下,很奇怪,因为权限很好(由“apache”用户拥有,文件0644 perms,dirs 755)。

fopen(<thefile>): failed to open stream: Permission denied

谁能告诉我描述如何解除 RHEL 的 Apache/PHP 配置以允许写入文件系统上的备用位置的文档?

谢谢, 〜保罗

【问题讨论】:

标签: php apache redhat rhel


【解决方案1】:

正如httpd_selinux(8) 手册页中所写,如果您希望能够读取或写入文件和目录,则必须为它们提供特定的文件上下文。有关详细信息,请参阅手册页,请记住 PHP 脚本作为守护程序运行,除非您已专门设置 PHP 以作为 CGI 运行。

【讨论】:

  • 你可能是对的——但我无法对手册页进行正面或反面来理解什么允许对 apache 用户进行读/写访问。有什么好的教程吗?
  • Nothing 可以授予对 apache user 的访问权限。您必须授予对域中运行的守护程序的访问权限。这是通过手册页中列出的文件上下文完成的。
  • 很好。我仍然不明白手册页中的上下文是什么意思。有没有关于上下文的上下文?
  • 如果有帮助,我对可能的答案(在此答案之上)进行了编辑... :)
  • @user1168588:它们只是文件系统对象上的一个“标签”,SELinux 将其视为其大规则引擎的一部分,以确定是否允许请求的访问。
【解决方案2】:

为了给接受的答案添加一些细节,我也遇到了这个确切的问题,这个命令为我修复了它。

chcon -R -t httpd_sys_content_t /path/to/file/it/does/exist/and/has/good/perms

【讨论】:

  • 谢谢。有时,如果没有有效的相关示例,手册会令人困惑。
【解决方案3】:

听起来像是用户和/或组权限问题。文件本身可能是可写的...(正如您在漂亮的路径名中提到的那样),但可能不允许使用 apache 用户(或者它的标题)在默认的 /var/www/html 目录之外进行任何文件更改?

有什么方法可以更改 /var/www/html 中的文件,然后让另一个 shell 脚本(和/或用户)从那里获取它并将其移动到您想要的目录?

有趣的是它可以在 Ubuntu 而不是 RHEL 上运行;就用户和组而言,也许 RHEL 更严格?

顺便说一句:一般来说,不让 PHP 写入 www 目录之外的文件可能更安全... :)

编辑

根据@Ignacio 的提示(1),也许这样的事情可能会起作用:http://us2.php.net/manual/en/function.fopen.php#56551

如果它是你一直需要的东西,你可能想尝试在命令行上输入这个:

/usr/sbin/setsebool -P httpd_can_network_connect=1

我仍然会小心处理 www 文件夹之外的 PHP 文件...但是,希望对您有所帮助...!

(1)http://linux.die.net/man/8/httpd_selinux

【讨论】:

  • 我很确定用户对目录和文件的权限是正确的 -- apache 用户和组同时拥有文件和路径,并且分别拥有 644/755。
  • 这是我不喜欢 RHEL 的原因之一——它被配置为对于不考虑安全性的人来说是“安全的”,但对于需要一点灵活性的人来说却是限制性的。
  • 我知道你的意思;它看起来也与该用户发生的情况类似:*.com/questions/3882244/php-fopen-permission-denied