尝试使用 php 在 webroot 之外创建文件时出现“无法打开流:只读文件系统”

尝试使用 php 在 webroot 之外创建文件时出现“无法打开流:只读文件系统”

一周以来,我一直在尝试在运行 arch linux(alarm)的 RaspberryPi 3 上设置 nextcloud。
我已经设置了 apache、php(带 php-fpm)、postgresql,并从 AUR 安装了 nextcloud-testing(因为 nextcloud 17 不支持 php 7.4)。apache
的 webroot 位于,/srv/http但 nextcloud 安装到/usr/share/webapps/nextcloud
我的 VirtualHost:

<VirtualHost *:443>
DocumentRoot "/srv/http"
<Directory "/srv/http">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
...
#ssl stuff
...
ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/"
<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

Alias /nextcloud /usr/share/webapps/nextcloud/
<Directory /usr/share/webapps/nextcloud>
    Options FollowSymlinks
    AllowOverride all
    Require all granted
</Directory>
</VirtualHost>

在浏览器中访问时,https://mydomain/nextcloud错误消息是无法写入配置目录。检查此问题的 php 代码使用了is_writable(),因此为了调试它,我尝试了(在一切正常后,我将再次加强安全性):

  • chown -R http:http /usr/share/webapps/nextcloud
  • chmod -R 777 /usr/share/webapps/nextcloud
  • 目录/usr/share/webapps/usr/share/usr拥有其他目录的 x 权限
  • sestatus返回command not found
  • su -s /bin/bash http,然后echo test > /usr/share/webapps/nextcloud/test.txt工作
  • 设置并重新启动open_basedir = /没有 帮助/etc/php/php.iniphp-fpm

我已经创建/srv/http/test.php

<?php
echo "username: ", exec('whoami'), "<br/>";
echo "open_basedir: ", var_dump(ini_get('open_basedir')), "<br/>";

$myfile = "/usr/share/webapps/nextcloud";
#$myfile = "/srv/http";

// checking permissions of the file
$permissions = fileperms($myfile);
$perm_value = sprintf("%o", $permissions);

// Clearing the File Status Cache
clearstatcache();

// checking whether the file is writable or not
if(is_writable($myfile))
{
 echo "$myfile file is writable and
   it has the following file permissions : $perm_value", "<br/>";
}
else
{
 echo "$myfile file is not writable and
   it has the following file permissions : $perm_value", "<br/>";
}

// Clearing the File Status Cache
clearstatcache();

$fs = fopen($myfile . "/test.txt","w") or die("cannot fopen");
fwrite($fs,date(DATE_RSS));
fclose($fs);
?>

https://mydomain/test.php节目

username: http
open_basedir: string(0) ""
/usr/share/webapps/nextcloud file is not writable and it has the following file permissions : 40777

Warning: fopen(/usr/share/webapps/nextcloud/test.txt): failed to open stream: Read-only file system in /srv/http/test.php on line 30
cannot fopen

设置$myfile = "/srv/http";错误消息时与预期一致,
Warning: fopen(/srv/http/test.txt): failed to open stream: Permission denied in /srv/http/test.php on line 30
因为/srv/http由 拥有root并且对其他人没有写入权限。当chmod o+w /srv/http脚本输出file is writable并将当前日期写入 时/srv/http/test.txt

由于 的Read-only file system-warning,/usr/share/webapps/nextcloud我怀疑 arch、apache、php、php-fpm 或其他的安全设置或默认行为限制了 php 对 的写入权限/srv/http,但我不知道该设置是什么以及如何包含/usr/share/webapps/nextcloud
我想我可以将 nextcloud 移动到/srv/http/,但我宁愿以正确的方式执行此操作,以免破坏软件包更新和其他事情。

所以问题是我如何允许 php 创建文件/usr/share/webapps/nextcloud

编辑: 感谢 Nover 的回答。这确实是拒绝访问的原因。我没有移动 nextcloud-instance 或ProtectSystem=full通过注释掉来完全删除安全限制,而是为 php-fpm.service 创建了一个插入文件,其中包含systemctl edit php-fpm.service以下内容:

[Service]
ReadWritePaths=/etc/webapps/nextcloud/config /usr/share/webapps/nextcloud/apps /usr/share/webapps/nextcloud/data

答案1

我从以下链接发现,Systemdphp-fpm服务可能被配置为阻止对某些文件夹和子文件夹的任何写入操作,并/usr受到此影响。

您可能想要按照您提到的那样移动 nextcloud 实例,或者您可能还想编辑 systemd 服务(/usr/lib/systemd/system/php-fpm.service)并注释该行ProtectSystem=full。您需要重新启动服务(sudo systemctl restart php-fpm)。

请注意,服务中的这条线路是为了安全目的而设置的,因此您可能会遭受一些攻击。

https://github.com/getgrav/grav/issues/2756

相关内容