web-dev-qa-db-ja.com

「ストリームを開けませんでした:読み取り専用ファイルシステム」

今週、Arch Linux(アラーム)を実行しているRaspberryPi 3でnextcloudをセットアップしようとしています。
Apache、php-fpm、postgresqlを使用してphpをセットアップし、AURからnextcloud-testingをインストールしました(nextcloud 17はphp 7.4をサポートしていないため)。
Apacheのウェブルートは/srv/httpにありますが、nextcloudは/usr/share/webapps/nextcloudにインストールされます。
my 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にアクセスすると、configディレクトリへの書き込みができないというエラーメッセージが表示されます。これをチェックする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権限があります
  • sestatuscommand 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
as /srv/httprootが所有しており、他のユーザーには書き込み権限がありません。 chmod o+w /srv/httpが実行されると、スクリプトはfile is writableを出力し、現在の日付を/srv/http/test.txtに書き込みます。

Read-only file systemに対する/usr/share/webapps/nextcloud- warningが原因で、phpの書き込みアクセスを/srv/httpに制限するために、セキュリティ設定またはArch、Apache、php、php-fpmなどのデフォルトの動作が疑われますが、どの設定と/usr/share/webapps/nextcloudを含める方法。
nextcloudを/srv/http/に移動できると思いますが、パッケージの更新などを壊さないために、これを正しい方法で実行したいと思います。

問題は、phpが/usr/share/webapps/nextcloudにファイルを作成できるようにする方法ですか。

編集:答えてくれたNoverに感謝します。これが確かにアクセス拒否の理由でした。 nextcloud-instanceを移動したり、コメントアウトしてProtectSystem=fullのセキュリティ制限を完全に削除したりする代わりに、以下の内容のsystemctl edit php-fpm.serviceを使用してphp-fpm.serviceのドロップインファイルを作成しました。

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

次のリンクから、Systemd php-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

6
Nover