Apache-2.4

嘗試使用 php 在 webroot 外部創建文件時出現“無法打開流:只讀文件系統”

  • February 2, 2020

我正在嘗試在執行 arch linux(警報)的 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 *: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.ini重新啟動php-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 for/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

我從以下連結中發現 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

引用自:https://serverfault.com/questions/996397