В последние дни я боролся с этой проблемой, и до сих пор не могу найти никакого решения. Проблема в нескольких словах:(сообщение об ошибке):

H00035: доступ к index.php запрещен, так как отсутствуют разрешения на поиск для компонента пути

Где это приложение работает?

  • хост Windows 10
  • это виртуальная машина, работающая внутри VirtualBox и управляемая Vagrant
  • CentOS Linux выпуск 7.5.1804 (Core)
  • Apache/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", но я не хочу этого делать, было бы лучше узнать, как все делать правильно :)

Эта коробка была построена с использованием Puphpet, и я могу поделиться ей. Дайте мне знать, если вам это нужно для тестирования.

ОБНОВЛЕНИЕ № 1:

Ответ @ hbruijn дал мне идею сменить владельца с 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 {} \; но это ничего не изменило, что означает, что разрешения остаются такими же, как и раньше.

Есть идеи?

2 ответа2

1

Проблема, вероятно, коренится в том факте, что вы представляете часть файловой системы хоста в виде данных /var /www в виртуальной машине VirtualBox.

Очевидно, что в Windows нет атрибутов, необходимых для предоставления контекста SELinux.

Таким образом, ваша виртуальная машина использует вместо этого контекст безопасности по умолчанию.

Контекст безопасности по умолчанию для "неизвестной" файловой системы не является контекстом, который хорошо согласуется с работой веб-сервера.
Проверьте с помощью ls -lZ /var/www/ . Вашему веб-серверу нужно что-то вроде

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 файл

0

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, и это сработало, вам не нужно делать это снова.

Кроме того, /var /log /messages должна регистрировать все ошибки selinux и сообщать вам объект, который блокирует доступ. Если вы сделаете временный 'setenforce 0', который изменит selinux на разрешающий режим, так что все действия будут работать, но вы все равно получите ошибки журнала, которые вы можете исправить все, прежде чем снова включить его. Если это не помогло, посмотрите на установку пакетов setroubleshoot и setroubleshoot-server, которые предоставят вам еще больше информации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .