Fedora/RHEL: SELinux блокирует доступ (Permission denied)

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

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

SELinux ограничивает доступ процессов к файлам независимо от обычных прав. Ниже — причины и порядок действий от простого к сложному.

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

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

Сообщение
Permission denied при правильных правах на файлы SELinux is preventing

Если приложение в Fedora получает Permission denied при корректных правах файлов, возможно, блокирует SELinux. Он работает в режиме Enforcing и применяет собственные правила независимо от Unix-прав. Отключать SELinux целиком не нужно — достаточно создать нужное разрешение или исправить контекст.

Убедитесь, что причина именно SELinux, и найдите конкретный отказ.

Fedora помогает пакет setroubleshoot.

SELinux ограничивает доступ процессов к файлам независимо от обычных прав. Если служба получает «Permission denied», а права верные, смотрите журнал аудита и контекст файлов.

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

Возможная причинаКак узнатьЧто делать
Неверный контекст файловФайлы перенесены из другого места.Восстановите контекст restorecon.
Нужен булев параметрСлужба хочет сеть.Включите setsebool.
Нестандартный портСлужба на другом порту.Добавьте порт через semanage.
Нужна политикаРедкий случай.Создайте политику по рекомендации.

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

  1. Проверьте getenforceОткройте терминал и выполните getenforce (вывод Enforcing, Permissive или Disabled). Затем при наличии прав администратора проверьте отказы через sudo ausearch -m AVC,USER_AVC -ts recent. Если появились записи, определите конкретный файл, службу и контекст; не выключайте SELinux ради устранения сообщения. В Alpine и Ubuntu SELinux обычно не основной механизм защиты.
  2. Найдите отказ в ausearchВ терминале Fedora выполните sudo ausearch -m AVC,USER_AVC -ts recent для последних отказов SELinux. Найдите время, команду/процесс (comm=), целевой объект и запрошенное действие (denied). Если ausearch отсутствует, проверьте наличие пакета audit и включён ли журнал аудита; не отключайте SELinux как метод диагностики. Запишите несколько строк без личных данных, чтобы сопоставить отказ с моментом ошибки.
  3. Установите setroubleshoot и запустите sealertДля анализа отказов администратор Fedora может установить sudo dnf install setroubleshoot-server, если пакет доступен в текущем выпуске, затем выполнить sudo sealert -a /var/log/audit/audit.log (при наличии журнала). Сравните подсказки с реальным контекстом файлов и назначением службы. Советы sealert не всегда следует применять автоматически: особенно не копируйте случайные правила audit2allow без проверки, какой доступ они предоставляют.
  4. Исправьте контекст файловЕсли журнал SELinux подтверждает отказ из-за неверной метки, сначала посмотрите её: ls -Z -- /реальный/путь и matchpathcon /реальный/путь (подставьте свой путь). Для стандартного расположения можно выполнить sudo restorecon -Rv -- /реальный/путь; сначала проверьте, что каталог указан правильно. Если нужен нестандартный постоянный контекст, согласуйте правило через semanage fcontext, а не используйте chcon как окончательное исправление.
  5. Включите нужный булев параметрСначала получите имя параметра из документации службы и вывода getsebool -a | grep -i httpd (пример для веб-сервера). Узнайте текущее значение getsebool НАЗВАНИЕ, затем при подтверждённой необходимости измените только этот параметр командой sudo setsebool -P НАЗВАНИЕ on. Замените НАЗВАНИЕ реальным идентификатором; команда меняет политику доступа постоянно, поэтому запишите исходное значение для отката.
  6. Недавние отказы SELinux
    Linux · Терминал (Bash)КомандаНужен sudo
    Недавние отказы SELinux.
    sudo ausearch -m avc -ts recent

#Если не помогло

Отключение SELinux снижает безопасность сервера. Используйте режим permissive только для диагностики.

#Проверка причины

Проверьте режим: getenforce. Быстрая проверка: sudo setenforce 0 (Permissive) и повторите действие — если заработало, причина SELinux; затем верните sudo setenforce 1. Отказы: sudo ausearch -m avc -ts recent или sudo journalctl -t setroubleshoot --since "10 min ago". Установите sudo dnf install setroubleshoot-server, затем sudo sealert -a /var/log/audit/audit.log — получите готовые команды.

#Контексты и булевы

Для файлов в нестандартных местах: sudo semanage fcontext -a -t httpd_sys_content_t "/srv/web(/.*)?" и sudo restorecon -Rv /srv/web. Просмотр контекстов: ls -Z. Булевы параметры: getsebool -a | grep имя, включение sudo setsebool -P httpd_can_network_connect on. Домашние каталоги для служб: httpd_enable_homedirs. NFS/Samba: use_nfs_home_dirs, samba_enable_home_dirs. Порты: sudo semanage port -a -t http_port_t -p tcp 8081.

#Собственный модуль политики

Если ни контекст, ни булев параметр не подходят, создайте модуль из отказов: sudo ausearch -c 'имя_процесса' --raw | audit2allow -M mymodule и sudo semodule -i mymodule.pp. Предварительно прочитайте mymodule.te: убедитесь, что правила не слишком широкие. Не отключайте SELinux постоянно в /etc/selinux/config. Документация: docs.fedoraproject.org.

Linux · Терминал (Bash)КомандаНужен sudo
Только проверка текущего режима SELinux и запретов AVC. Не устанавливайте пакеты и не переводите SELinux в Permissive без причины. Если ausearch отсутствует, сначала сверяйте журналы и версию Fedora.
getenforce
sudo ausearch -m AVC -ts recent

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

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

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