#Что означает ошибка
Permission denied при правильных правах на файлы SELinux is preventing
Если приложение в Fedora получает Permission denied при корректных правах файлов, возможно, блокирует SELinux. Он работает в режиме Enforcing и применяет собственные правила независимо от Unix-прав. Отключать SELinux целиком не нужно — достаточно создать нужное разрешение или исправить контекст.
Убедитесь, что причина именно SELinux, и найдите конкретный отказ.
Fedora помогает пакет setroubleshoot.
SELinux ограничивает доступ процессов к файлам независимо от обычных прав. Если служба получает «Permission denied», а права верные, смотрите журнал аудита и контекст файлов.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверный контекст файлов | Файлы перенесены из другого места. | Восстановите контекст restorecon. |
| Нужен булев параметр | Служба хочет сеть. | Включите setsebool. |
| Нестандартный порт | Служба на другом порту. | Добавьте порт через semanage. |
| Нужна политика | Редкий случай. | Создайте политику по рекомендации. |
#Пошаговое решение
- Проверьте getenforceОткройте терминал и выполните
getenforce(вывод Enforcing, Permissive или Disabled). Затем при наличии прав администратора проверьте отказы черезsudo ausearch -m AVC,USER_AVC -ts recent. Если появились записи, определите конкретный файл, службу и контекст; не выключайте SELinux ради устранения сообщения. В Alpine и Ubuntu SELinux обычно не основной механизм защиты. - Найдите отказ в ausearchВ терминале Fedora выполните
sudo ausearch -m AVC,USER_AVC -ts recentдля последних отказов SELinux. Найдите время, команду/процесс (comm=), целевой объект и запрошенное действие (denied). Еслиausearchотсутствует, проверьте наличие пакетаauditи включён ли журнал аудита; не отключайте SELinux как метод диагностики. Запишите несколько строк без личных данных, чтобы сопоставить отказ с моментом ошибки. - Установите setroubleshoot и запустите sealertДля анализа отказов администратор Fedora может установить
sudo dnf install setroubleshoot-server, если пакет доступен в текущем выпуске, затем выполнитьsudo sealert -a /var/log/audit/audit.log(при наличии журнала). Сравните подсказки с реальным контекстом файлов и назначением службы. Советы sealert не всегда следует применять автоматически: особенно не копируйте случайные правилаaudit2allowбез проверки, какой доступ они предоставляют. - Исправьте контекст файловЕсли журнал SELinux подтверждает отказ из-за неверной метки, сначала посмотрите её:
ls -Z -- /реальный/путьиmatchpathcon /реальный/путь(подставьте свой путь). Для стандартного расположения можно выполнитьsudo restorecon -Rv -- /реальный/путь; сначала проверьте, что каталог указан правильно. Если нужен нестандартный постоянный контекст, согласуйте правило черезsemanage fcontext, а не используйтеchconкак окончательное исправление. - Включите нужный булев параметрСначала получите имя параметра из документации службы и вывода
getsebool -a | grep -i httpd(пример для веб-сервера). Узнайте текущее значениеgetsebool НАЗВАНИЕ, затем при подтверждённой необходимости измените только этот параметр командойsudo setsebool -P НАЗВАНИЕ on. Замените НАЗВАНИЕ реальным идентификатором; команда меняет политику доступа постоянно, поэтому запишите исходное значение для отката. - Недавние отказы SELinuxLinux · Терминал (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. Документация: .
getenforcesudo ausearch -m AVC -ts recent