#Что означает ошибка
SELinux is preventing httpd from write access
Если веб-сервер на Rocky Linux выдаёт 403 или 500, а права файлов правильные, вероятно, действие блокирует SELinux. Признак — записи avc: denied в журнале аудита. Отключать SELinux целиком не нужно: достаточно выдать правильный контекст или включить нужный булев параметр.
Проверьте режим и найдите конкретное отказанное действие.
Затем исправьте именно его.
SELinux не позволяет веб-серверу писать в каталоги без нужного контекста. Задайте правильный контекст вместо отключения защиты.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверный контекст | Каталог. | semanage fcontext. |
| Булев параметр | httpd_unified. | setsebool. |
| Нестандартный каталог | Вне /var/www. | Разметьте. |
| Права | chmod. | Проверьте. |
#Пошаговое решение
- Проверьте getenforceОткройте терминал и выполните
getenforce(вывод Enforcing, Permissive или Disabled). Затем при наличии прав администратора проверьте отказы черезsudo ausearch -m AVC,USER_AVC -ts recent. Если появились записи, определите конкретный файл, службу и контекст; не выключайте SELinux ради устранения сообщения. В Alpine и Ubuntu SELinux обычно не основной механизм защиты.Linux · Терминал (Bash)КомандаНужен sudoСначала найдите конкретный путь и отказ AVC; пример /srv/app может не существовать. semanage/restorecon изменяют систему, их нельзя запускать до подтверждения контекста.getenforcesudo ausearch -m AVC -ts recentls -Zd /var/www/html - Найдите отказы в ausearchНа сервере Rocky Linux выполните
sudo ausearch -m AVC,USER_AVC -ts recent, затем найдите строки, где указаны процессhttpdилиnginx, запрещённое действие и путь. Сверьте время с ошибкой веб-сервера. Если журнал пуст, проверьте, включён лиauditd, и изучитеjournalctl; отсутствие записей не доказывает, что нужно отключать SELinux. После анализа исправляйте только конкретный контекст или подтверждённый boolean. - Проверьте контекст файловВ терминале выполните
ls -Zd /путь/к/каталогу, заменив пример реальным корнем документов веб-сайта из конфигурации сервера. Сравните тип контекста с рекомендованным для содержимого веб-сервера (частоhttpd_sys_content_tдля доступного на чтение). Если путь находится вне стандартного каталога, назначьте постоянное соответствие черезsemanage fcontextпо официальной инструкции и только потом применяйтеrestorecon. Не назначайте всем файлам контекст для записи ради простого чтения. - Назначьте контекст и выполните restoreconЕсли журнал SELinux подтверждает отказ из-за неверной метки, сначала посмотрите её:
ls -Z -- /реальный/путьиmatchpathcon /реальный/путь(подставьте свой путь). Для стандартного расположения можно выполнитьsudo restorecon -Rv -- /реальный/путь; сначала проверьте, что каталог указан правильно. Если нужен нестандартный постоянный контекст, согласуйте правило черезsemanage fcontext, а не используйтеchconкак окончательное исправление. - Включите нужный булев параметрСначала получите имя параметра из документации службы и вывода
getsebool -a | grep -i httpd(пример для веб-сервера). Узнайте текущее значениеgetsebool НАЗВАНИЕ, затем при подтверждённой необходимости измените только этот параметр командойsudo setsebool -P НАЗВАНИЕ on. Замените НАЗВАНИЕ реальным идентификатором; команда меняет политику доступа постоянно, поэтому запишите исходное значение для отката. - Проверьте доступ только к требуемому путиПосле исправления метки или штатного булевого параметра запросите конкретную страницу, для которой был отказ, и сопоставьте новое событие в
sudo ausearch -m AVC -ts recent. Если отказ продолжается, проверьтеnamei -lдля настоящего DocumentRoot. Не открывайте доступ к домашним каталогам и всему диску без необходимости.
#Диагностика
Режим: getenforce (Enforcing). Свежие отказы: sudo ausearch -m avc -ts recent или sudo journalctl -t setroubleshoot. Установите setroubleshoot-server (sudo dnf install setroubleshoot-server): sudo sealert -a /var/log/audit/audit.log выдаёт понятные рекомендации. Проверьте контекст файлов сайта: ls -Z /var/www/html. Корректный тип — httpd_sys_content_t.
#Контексты файлов
Для нестандартного каталога назначьте тип и сохраните правило: sudo semanage fcontext -a -t httpd_sys_content_t "/srv/site(/.*)?", затем sudo restorecon -Rv /srv/site. Для каталогов записи (загрузки, кэш): httpd_sys_rw_content_t. Если нет semanage: sudo dnf install policycoreutils-python-utils. Файлы, перенесённые через mv, сохраняют старый контекст — выполните restorecon.
#Булевы параметры и порты
Типичные булевы: sudo setsebool -P httpd_can_network_connect on (обращения PHP/прокси к внешним сервисам), httpd_can_network_connect_db on (к базе), httpd_can_sendmail on, httpd_unified on. Список: getsebool -a | grep httpd. Нестандартный порт: sudo semanage port -a -t http_port_t -p tcp 8080. Временный разбор: sudo setenforce 0 (Permissive) лишь для проверки, что причина именно SELinux, затем setenforce 1.
getenforcesudo ausearch -m avc -ts recentls -Z /var/www/htmlsudo restorecon -Rv /var/www/html