今週、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権限があります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
as /srv/http
はroot
が所有しており、他のユーザーには書き込み権限がありません。 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
次のリンクから、Systemd php-fpm
サービスが特定のフォルダーおよびサブフォルダーへの書き込みアクションをブロックするように構成されている可能性があり、/usr
がこの影響を受けることがわかりました。
言及したとおりにnextcloudインスタンスを移動したり、systemdサービス(/usr/lib/systemd/system/php-fpm.service
)を編集して行ProtectSystem=full
にコメントしたりすることもできます。サービス(Sudo systemctl restart php-fpm
)を再起動する必要があります。
サービスのこの行はセキュリティ上の目的で存在していたため、攻撃を受ける可能性があることに注意してください。