Назад | Перейти на главную страницу

centos7 apache не может писать в файл, которым владеет

Я установил httpd и php на свежий centos7 и поместил несколько файлов в / var / www / html, включая сценарий установки, который я написал. Этот сценарий необходимо записать в файл конфигурации в каталоге / var / www / html. Я создал пустой файл конфигурации и подключил его к apache: apache. Однако попытка открыть этот файл с доступом для записи всегда дает ошибку:

fopen(/var/www/html/config-local.php): failed to open stream: Permission denied

Во время исследования я прочитал эту цитату: «Чтобы получить доступ к файлу, ВСЕ родительские каталоги должны быть доступны для чтения». Я проверил, и они есть. /, / var, / var / www и / var / www / html доступны для чтения всем.

Так что здесь происходит? Похоже, что пользователь apache - это своего рода специально ограниченный пользователь, поскольку тестирование того же сценария со стандартным пользователем работает нормально.

Вероятно, это проблема с разрешениями SELinux. /var/log/audit/audit.log должен суметь подтвердить.

Контекст SELinux, вероятно, system_u:object_r:httpd_sys_content_t:s0, но должно быть system_u:object_r:httpd_sys_rw_content_t:s0. Это можно изменить с помощью chcon.


Я также не оптимистичен по поводу наличия файла конфигурации в DocumentRoot вашего веб-сервера. Я могу ошибаться, поскольку вы не предоставили достаточно деталей, но это будет так, если вы не изменили значения по умолчанию.

Потратил много времени на поиск этого ответа, но он все по частям, и никто не публикует решение (ну, большую часть времени), так что вот мое решение, которое также используется на различных веб-панелях управления.

установить и использовать MOD_RUID2

Установите PHP с помощью CLI (это стандарт для более новых версий)

В вашем файле HTTPD.CONF на виртуальных хостах вы добавите следующее, заменив имя пользователя на имя пользователя и группу пользователей на группу пользователя (обычно это одно и то же)

<IfModule !mod_ruid2.c>
    SuexecUserGroup username usergroup
</IfModule>
<IfModule mod_ruid2.c>
    RMode config
    RUidGid username usergroup
    RGroups @none
</IfModule>

Пример конфигурации виртуального хоста:

<VirtualHost *:443>
  DocumentRoot "/home/imtheuser/public_html"
  ServerName imtheuser.com
  <IfModule !mod_ruid2.c>
    SuexecUserGroup imtheuser imtheuser
  </IfModule>
  <IfModule mod_ruid2.c>
    RMode config
    RUidGid imtheuser imtheuser
    RGroups @none
  </IfModule>
  <Directory "/home/imtheuser/public_html">
    allow from all
    Options None
    Require all granted
  </Directory> 
</VirtualHost>

Это позволит apache / php писать в каталог, принадлежащий пользователю. Это намного безопаснее, чем установить chmod на 0777.