H00035:拒绝访问“file.php”,如何正确设置 SELinux?

H00035:拒绝访问“file.php”,如何正确设置 SELinux?

最近几天我一直在努力解决这个问题,但到目前为止我还没有找到任何解决方案。简而言之,这个问题是(错误消息):

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 软件包,它们将为您提供更多信息。

相关内容