将服务器从 openSUSE Leap 15.3 升级到 openSUSE Leap 15.4 发现基于 PHP 的网站打不开了。访问的时候提示 “Access denied”。经查,这是因为 openSUSE Leap 15.4 使用的 AppArmor 3.0 引入了针对 PHP-FPM 的规则。该规则没有放行 PHP-FPM 对服务器上的 .php 文件的访问导致的。
要检查是不是这个原因,可以看一下服务器上的 audit.log 文件中的记录。有类似于下面的提示就基本可以判断有这个问题了。
/var/log/audit/audit.log: type=AVC msg=audit(1668739699.011:2625): apparmor="DENIED" operation="open" profile="php-fpm" name="/srv/www/htdocs/nextcloud/index.php" pid=559 comm="php-fpm" requested_mask="r" denied_mask="r" fsuid=498 ouid=498
此时服务器上的访问日志会记录如下错误,看起来像是 Apache 或者 PHP-FPM 配置错误。但其实不是。
PHP message: PHP Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0Unable to open primary script: nextcloud/index.php
然后可以试试看临时禁用针对 PHP-FPM 的 AppArmor 规则,
sudo aa-disable php-fpm
再试试访问一下该网站。如果没问题了。那就可确定是这个问题。然后就可以采取措施了。该问题已经有 bug 报告,但是还没有解决。可能也不需要解决,毕竟这也算是个用户自行配置的问题。
解决方案就是针对网站文件所在目录给于 PHP-FPM 读权限。例如上面的情况,假设网站文件在目录 /srv/www/htdocs/nextcloud/
下面。
$> sudo #> touch /etc/apparmor.d/local/php-fpm #> cat >> /etc/apparmor.d/local/php-fpm <<\EOF # rules for NextCloud php-fpm owner /etc/ImageMagick-7-SUSE/english.xml r, owner /etc/ImageMagick-7-SUSE/locale.xml r, owner /etc/ImageMagick-7-SUSE/log.xml r, owner /etc/ImageMagick-7-SUSE/policy.xml r, # 下面用到的路径需要看情况调整 /srv/www/htdocs/nextcloud/ r, /srv/www/htdocs/nextcloud/** r, /srv/www/vhosts/nextcloud/config/config.php k, /path/to/nextcloud_data/nextcloud.log rwlk, owner /srv/www/htdocs/nextcloud/**/*.php rwk, owner /srv/www/htdocs/nextcloud/*.php r, owner /srv/www/vhosts/nextcloud/tmp/** rwlk, owner /srv/www/vhosts/nextcloud/sessions/ r, owner /srv/www/vhosts/nextcloud/sessions/** rwlk, EOF
然后运行下面的指令来使修改生效,
#> apparmor_parser -r /etc/apparmor.d/php-fpm
同时重启 PHP-FPM,
#> systemctl restart php-fpm
因为 NextCloud 的活动比较多,仅仅提供上面的两条规则可能并不够。如果打算使用较为宽泛的规则,比如系统中所有位置,包括 /srv/www/
目录,下的 PHP-FPM 解析都允许,可以直接引用 AppArmor 规则库中现成的两个规则,
#> cat >> /etc/apparmor.d/local/php-fpm <<\EOF include <abstractions/ubuntu-browsers.d/user-files> include <abstractions/web-data> EOF
然后运行下面的指令来使修改生效,
#> apparmor_parser -r /etc/apparmor.d/php-fpm
同时重启 PHP-FPM,
#> systemctl restart php-fpm
当然这两条引用里包含的规则就有点太宽松了,或者说没有针对性。而且也并不能包含所有的 NextCloud 行为,比如后台的管理单元里面的计划任务 Background jobs 就可能只能使用 AJAX 模式而不能使用 Cron 模式,还有服务器系统信息统计页面也无法调用系统工具。
还可以有精细化的、专门针对 NextCloud 的规则,可以查看 Nordisch 的博文。但是我按照该博文的方法实施了之后,遇到了问题,暂时无法解决。实施后确实可以无障碍访问 NextCloud。但是响应很慢。经查看系统发现 php-fpm 持续占用大量 CPU 资源。然后如果使用 tail -f /var/log/audit/audit.log | grep php-fpm
来查看的话,能看到类似下面的告警信息,
type=AVC msg=audit(1668772223.458:1300584): apparmor="DENIED" operation="change_profile" info="label not found" error=-2 profile="unconfined" name="unconfined//nextcloud" pid=24888 comm="php-fpm"
飞快地滚动。看了 SUSE 的 AppArmor 文档,一时半会儿弄不明白,暂时作罢。©
本文发表于水景一页。永久链接:<https://cnzhx.net/blog/php-access-denied-after-upgrading-opensuse-leap-from-15-3-to-15-4/>。转载请保留此信息及相应链接。
引用通告: 升级 openSUSE Leap 15.3 到 Leap 15.4 | 水景一页