最近几天我一直在努力解决这个问题,但到目前为止我还没有找到任何解决方案。简而言之,这个问题是(错误消息):
H00035:由于路径的某个组件缺少搜索权限,因此拒绝访问 index.php
该应用程序在哪里运行?
- 主机是 Windows 10
- 这是在 VirtualBox 内运行并由 Vagrant 管理的虚拟机
- CentOS Linux 版本 7.5.1804(核心)
- 阿帕奇/2.4.33 (IUS)
- PHP 7.2.6(这并不重要,但以防万一)
- SELinux:强制执行
到目前为止我已经尝试过:
在框中运行以下命令:它起作用了吗?不(成立这里)
find /var/www -type d -exec chmod 755 {} \; find /var/www -type f -exec chmod 664 {} \;
在框中运行以下命令:它起作用了吗?不(成立这里)
chcon -R -t httpd_sys_content_t /var/www
尝试了一切这里, 有效?不。
我试过了,有效吗?禁用 SELinux!所以肯定是 SELinux 配置错误。
权限/var/www
如下所示:
# namei -mo /var/www/api/public/index.php
f: /var/www/api/public/index.php
dr-xr-xr-x root root /
drwxr-xr-x root root var
drwxrwxr-x vagrant vagrant www
drwxrwxr-x vagrant vagrant api
drwxrwxr-x vagrant vagrant public
-rwxrwxr-- vagrant vagrant index.php
我还能尝试什么来解决这个问题?我知道最简单的方法是“禁用 SELinux”,但我不想这样做,最好学习如何正确做事 :)
这个盒子是使用傀儡我可以分享它。如果您需要它用于测试目的,请告诉我。
更新 #1:
@hbruijn 的回答给了我一个想法,将所有者从 Apache 更改vagrant
为 Apache www-data
,但是所有者H00035
已经消失了,但我得到了一个新的。
// Before
synced_folder:
folder1:
owner: vagrant
group: vagrant
source: ../../www/html
target: /var/www
sync_type: default
// After
synced_folder:
folder1:
owner: www-data
group: www-data
source: ../../www/html
target: /var/www
sync_type: default
现在的错误是:
(13)权限被拒绝:[客户端 192.168.50.1:2048] AH00529:/var/www/api/public/.htaccess pcfg_openfile:无法检查 htaccess 文件,请确保其可读且 '/var/www/api/public/' 可执行
这是@hbruijn 的答案的输出:
# ls -lZ /var/www/
drwxrwxr-x. www-data www-data system_u:object_r:vmblock_t:s0 api/
-rwxrwxr--. www-data www-data system_u:object_r:vmblock_t:s0 index.html*
我再次运行了相同的命令:find /var/www -type f -exec chmod 664 {} \;
但它根本没有改变任何东西,这意味着权限保持与以前相同。
有任何想法吗?
答案1
问题可能在于您在 VirtualBox VM 中将主机文件系统的一部分公开为 /var/www 数据。
显然,Windows 没有提供 SELinux 上下文所需的文件属性。
因此您的虚拟机将使用默认安全上下文。
“未知”文件系统的默认安全上下文与运行 Web 服务器不太匹配。
请检查ls -lZ /var/www/
。您的 Web 服务器需要类似
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
目前,您可能会得到一些不同的东西,例如:
drwxrwxrwx. vagrant vagrant system_u:object_r:vmblock_t:s0 /var/www/api
您可以尝试手动强制将正确的 SELinux 上下文作为挂载选项:
mount -o remount,context="system_u:object_r:httpd_sys_content_t:s0" /var/www
如果一切按预期工作(检查ls -Z
),您可以将其添加到挂载选项 /etc/fstab 或您的 vagrant 文件中
答案2
restorecon -vRF /var/www
将恢复 /var/www 下所有文件的默认安全上下文。如果您尚未更改 selinux 策略,则应该可以解决问题。请注意,如果您将文件移到其他地方,则可以通过执行以下操作来更改这些上下文:
semanage fcontext -a -e /var/www /somewhere/www
restorecon -vRF /somewhere/www
就您而言,这应该不是必需的,因为 /var/www 已经定义了默认标签(例如上下文),但其他目录没有,因此您必须更改它们然后应用它们。您可以使用 来了解路径名到上下文的映射grep www /etc/selinux/targeted/contexts/files/file_contexts
,
此外,chmod 仅影响 selinux 的自主控制(文件权限),而不影响 selinux 的强制控制(策略)。两者都需要正确才能正常工作,但如果您禁用了 selinux 并且它正常工作,则您不需要再次执行此操作。
此外,/var/log/messages 应该记录所有 selinux 错误并告诉您阻止访问的对象。如果您执行临时的“setenforce 0”,这将使 selinux 更改为宽容模式,这样所有操作都可以正常工作,但您仍然会收到日志错误,您可以在重新打开之前修复所有错误。如果失败,请考虑安装 setroubleshoot 和 setroubleshoot-server 软件包,它们将为您提供更多信息。