Rocky Linux Linux

SELinux: доступ запрещён для nginx и httpd

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

Определите причину через audit.log и исправьте контекст, не отключайте SELinux.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Поиск запрета
  5. Типовые разрешения
  6. Временная проверка

#Что означает ошибка

Сообщение
SELinux denied

На Rocky Linux, AlmaLinux и CentOS Stream SELinux блокирует доступ веб-сервера (httpd, nginx) к файлам, портам и сети, даже если права Unix выставлены верно. Типичный признак: 403 или 502 без записей об ошибке в журнале nginx, но с записями AVC.

Отключать SELinux целиком не нужно: достаточно разрешить конкретное действие.

Диагностика идёт через журнал аудита.

Определите причину через audit.log и исправьте контекст, не отключайте SELinux.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Неверный контекстФайлы.Проявляется как «SELinux denied» или близкий по смыслу сбой.restorecon.
БулевыВыкл.Проявляется как «SELinux denied» или близкий по смыслу сбой.setsebool.
ПортНестандартный.Проявляется как «SELinux denied» или близкий по смыслу сбой.semanage.
ПолитикаНет.Проявляется как «SELinux denied» или близкий по смыслу сбой.audit2allow.

#Пошаговое решение

  1. Проверьте режим SELinuxОткройте терминал и выполните getenforce (вывод Enforcing, Permissive или Disabled). Затем при наличии прав администратора проверьте отказы через sudo ausearch -m AVC,USER_AVC -ts recent. Если появились записи, определите конкретный файл, службу и контекст; не выключайте SELinux ради устранения сообщения. В Alpine и Ubuntu SELinux обычно не основной механизм защиты.
  2. Найдите отказ в аудитеЕсли сайт отвечает Permission denied и SELinux находится в Enforcing, на сервере выполните sudo ausearch -m AVC,USER_AVC -ts recent. Найдите процесс nginx/httpd, фактический путь (name= или path=) и тип блокировки. Сравните время записи со временем запроса к сайту. Не отключайте SELinux полностью и не создавайте правила audit2allow только ради исчезновения записи; сначала исправьте контекст конкретного каталога.
  3. Исправьте контекст файловЕсли журнал SELinux подтверждает отказ из-за неверной метки, сначала посмотрите её: ls -Z -- /реальный/путь и matchpathcon /реальный/путь (подставьте свой путь). Для стандартного расположения можно выполнить sudo restorecon -Rv -- /реальный/путь; сначала проверьте, что каталог указан правильно. Если нужен нестандартный постоянный контекст, согласуйте правило через semanage fcontext, а не используйте chcon как окончательное исправление.
  4. Включите нужный booleanСначала получите имя параметра из документации службы и вывода getsebool -a | grep -i httpd (пример для веб-сервера). Узнайте текущее значение getsebool НАЗВАНИЕ, затем при подтверждённой необходимости измените только этот параметр командой sudo setsebool -P НАЗВАНИЕ on. Замените НАЗВАНИЕ реальным идентификатором; команда меняет политику доступа постоянно, поэтому запишите исходное значение для отката.
  5. Проверьте сайтПосле исправления контекста на сервере выполните проверку конфигурации (sudo nginx -t или sudo apachectl configtest, в зависимости от используемой службы), затем curl -I http://127.0.0.1/ и запрос извне. При HTTP 200/301/302 и отсутствии новых AVC-отказов для того же запроса проблема, вероятно, устранена. Если появляется 403/500, смотрите логи веб-сервера и SELinux отдельно. Не открывайте доступ на запись всем пользователям.
  6. Проверьте точное исправление без отключения SELinuxПосле точечного изменения контекста/булевого параметра повторите тот же HTTP-запрос и сопоставьте время с sudo ausearch -m AVC -ts recent. Затем проверьте getenforce: защита должна остаться Enforcing. Если AVC исчез, но сервер по-прежнему отвечает ошибкой, проверьте журналы приложения и права Unix вместо создания широких правил audit2allow.

#Поиск запрета

Проверьте режим: getenforce. Просмотрите отказы: sudo ausearch -m avc -ts recent или sudo grep denied /var/log/audit/audit.log. Подробные подсказки даёт sudo sealert -a /var/log/audit/audit.log (пакет setroubleshoot-server). В сообщении видны процесс (httpd_t), цель и тип.

#Типовые разрешения

Контекст файлов сайта: sudo semanage fcontext -a -t httpd_sys_content_t "/srv/site(/.*)?" и sudo restorecon -Rv /srv/site. Для записи: тип httpd_sys_rw_content_t. Прокси к бэкенду: sudo setsebool -P httpd_can_network_connect 1. Нестандартный порт: sudo semanage port -a -t http_port_t -p tcp 8081. Соединение с БД: httpd_can_network_connect_db.

#Временная проверка

Чтобы убедиться, что причина в SELinux, переключите в разрешающий режим: sudo setenforce 0 (до перезагрузки), проверьте сайт и верните setenforce 1. Постоянно отключать в /etc/selinux/config не рекомендуется. Для сложных случаев создайте модуль: sudo ausearch -m avc | audit2allow -M mymod && sudo semodule -i mymod.pp — после проверки, что разрешение правомерно.

Linux · Терминал (Bash)КомандаНужен sudo
Только определение режима SELinux, AVC и текущей метки. Не запускайте restorecon на условном /srv/site и не включайте httpd_can_network_connect глобально без точной диагностики отказа.
getenforce
sudo ausearch -m AVC -ts recent
ls -Zd /var/www/html

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.