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