«Не удалось открыть поток: файловая система только для чтения» при попытке создать файл вне корневого веб-сайта с помощью php

Я пытаюсь установить nextcloud на RaspberryPi 3, работающем под управлением Arch Linux (сигнализация) в течение недели. .
Я установил apache, php с php-fpm, postgresql и установил nextcloud-testing из AUR (потому что nextcloud 17 не поддерживает php 7.4).
Корневой каталог apache находится в / 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 возвращает команда не найдена
  • su -s / bin / bash http , затем эхо-тест> / 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"; сообщение об ошибке соответствует ожиданиям
Предупреждение: fopen (/srv/http/test.txt): не удалось для открытия потока: в /srv/http/test.php в строке 30
отказано, поскольку / srv / http принадлежит root и не имеет прав на запись для других. Когда chmod o + w / srv / http , сценарий выводит файл с возможностью записи и записывает текущую дату в /srv/http/test.txt .

Из-за файловой системы только для чтения - предупреждения для / 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 или полностью удалить ограничение безопасности ProtectSystem = full , закомментировав его, я создал добавляемый файл для php-fpm.service с systemctl edit php-fpm .служба со следующим содержанием:

[Service]
ReadWritePaths=/etc/webapps/nextcloud/config /usr/share/webapps/nextcloud/apps /usr/share/webapps/nextcloud/data
0
задан 21 December 2019 в 17:23
1 ответ

По следующей ссылке я обнаружил, что служба Systemd php-fpm может быть настроена на блокировку любых действий по записи в определенных папках и подпапках, и /usr.

Возможно, вы захотите переместить свой экземпляр nextcloud, как вы упомянули, или вы также можете отредактировать службу systemd (/usr/lib/systemd/system/php-fpm.service) и прокомментировать строка ProtectSystem=полная. Вам нужно будет перезапустить службу (sudo systemctl перезапустить php-fpm).

Обратите внимание, что эта строка в сервисе была создана в целях безопасности, поэтому вы можете подвергнуть себя атаке.

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

10
ответ дан 3 January 2020 в 12:17

Теги

Похожие вопросы