openSUSE Leap 从 15.3 升级到 15.4 之后 PHP 网站 403 错误

将服务器从 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/>。转载请保留此信息及相应链接。

1 条关于 “openSUSE Leap 从 15.3 升级到 15.4 之后 PHP 网站 403 错误” 的评论

  1. 引用通告: 升级 openSUSE Leap 15.3 到 Leap 15.4 | 水景一页

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用*标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>