SELinux permission denied сначала зафиксируйте ошибку и время, проверьте режим SELinux и найдите соответствующий AVC-отказ. Затем выбирайте самое узкое исправление: восстановление метки, постоянное правило контекста для пути, предусмотренный политикой Boolean или метку нестандартного порта. Глобальный Permissive допустим только как краткая диагностическая мера с возвратом в Enforcing; Disabled не является штатным способом исправления доступа.Как SELinux принимает решение о доступе
SELinux — механизм мандатного контроля доступа, работающий через каркас Linux Security Modules. Он дополняет, а не заменяет дискреционный контроль доступа: владельца, группу, Unix-права и ACL.
Обычно на RHEL, Rocky Linux, AlmaLinux и Fedora применяется Targeted policy. В её основе лежит Type Enforcement: процесс — субъект — работает в домене SELinux, объект имеет тип, а политика SELinux определяет допустимые операции домена над этим типом.
Полный контекст SELinux выглядит как user:role:type:level, например system_u:system_r:httpd_t:s0 у процесса. В повседневной диагностике чаще всего важен третий компонент — type: httpd_t, httpd_sys_content_t, var_log_t и другие. Поэтому корректные Unix-права на файл ещё не означают, что веб-сервер в домене httpd_t сможет его прочитать: политика может не разрешать этому домену операцию read над фактическим типом файла.
Не расширяйте Unix-права вместо исправления SELinux
chmod 777, смена владельца или запуск службы от root не исправляют неверный SELinux-тип и могут создать отдельную проблему безопасности. При этом сообщение приложения Permission denied может быть вызвано Unix-правами, ACL, неверным путём, конфигурацией приложения или SELinux. Найденный AVC фиксирует запрет политики SELinux, но его ещё нужно сопоставить с наблюдаемым сбоем по времени, процессу, объекту и операции.SELinux status: Enforcing, Permissive и Disabled
getenforceEnforcingsestatus| Режим | Поведение | Типичное применение |
|---|---|---|
Enforcing | Операции, запрещённые политикой, блокируются; отказы о бычно фиксируются как AVC. | Штатный режим работающего сервера. |
Permissive | Запрещённые политикой операции не блокируются, но могут фиксироваться как AVC. Обычные Unix-права продолжают действовать. | Краткая контролируемая диагностика или поэтапное внедрение. |
Disabled | Политика не загружена, SELinux не проверяет и не ограничивает доступ. | Только отдельные документированные сценарии миграции или совместимости. |
getenforce показывает фактический режим в работающей системе. sestatus помогает сравнить его с конфигурацией на следующую загрузку: после временного setenforce 1 текущий режим может стать Enforcing, хотя в конфигурационном файле всё ещё задан другой режим.
Перевод SELinux в Enforcing
Команды предполагают права root или sudo. Для RHEL-совместимых систем типичный постоянный параметр находится в /etc/selinux/config; сверяйте процедуру со справочником именно своего выпуска ОС.
- 1Проверьте текущий и настроенный режимВыполните
getenforceиsestatus. ЕслиgetenforceвозвращаетPermissive, SELinux уже активен и его можно перевести в блокирующий режим без перезагрузки. - 2Включите Enforcing временноВыполните
sudo setenforce 1, затем снова выполнитеgetenforce. Ожидаемый результат —Enforcing. Если команда сообщает, что SELinux disabled, она не сможет включить защиту: политика не загружена. - 3Закрепите режим на следующую загрузкуПроверьте строку
SELINUX=в/etc/selinux/configи установитеSELINUX=enforcing. Затем подтвердите значение командойgrep '^SELINUX=' /etc/selinux/config. Это изменение задаёт режим для последующих загрузок, но не заменяетsetenforceдля уже работающей системы. - 4Проверьте сервис в EnforcingПовторите действие, которое раньше завершалось ошибкой, и проверьте новые AVC-события. Если служба не работает, не оставляйте систему в Permissive как постоянное решение: разберите конкр етный отказ и примените узкое исправление.
sudo setenforce 0Почему Disabled не заменяет диагностику
setenforce переключает только Enforcing и Permissive. Переход в режим Disabled SELinux и возврат из него требуют отдельной постоянной процедуры включения SELinux, relabel файловой системы и перезагрузки по док ументации конкретного дистрибутива и версии. Отключение скрывает причину отказа, снимает слой контроля и может оставить файлы без ожидаемых меток. Не используйте Disabled как обычное исправление ошибки приложения.Как использовать Permissive безопасно
Permissive, это сильный признак влияния политики SELinux, но результат не говорит, какое разрешение следует добавить. Зафиксируйте время теста и действие, соберите AVC, верните setenforce 1 и исправьте причину. Если действие не работает и в Permissive, ищите проблему в конфигурации сервиса, сети, Unix-правах или данных приложения.Маршрут диагностики AVC-отказа
Отказ AVC нужно связывать с конкретным действием службы, а не с общей строкой Permission denied в журнале приложения. До изменений сохраните текст ошибки, время с часовым поясом, имя сервиса, путь или порт и команду либо запрос, вызвавший проблему.
Найдите и разберите событие SELinux is preventing
- 1Повторите сбой в контролируемый моментВоспроизведите один запрос, запуск службы или операцию с файлом. Запишите точное время: это позволит отличить нужный AVC от старых и посторонних событий.
- 2Проверьте контексты процесса и объектаДля процесса используйте
ps -eZ | grep -E 'httpd|nginx|имя_процесса'; для файла или каталога —ls -lZ /путьлибоls -Zd /каталог. Сравнивайте прежде всего компонент type в контексте процесса — его домен — и компонент type в контексте объекта. - 3Найдите AVC через auditВ типичной системе с работающим auditd выполните
sudo ausearch -m AVC,USER_AVC -ts recent -i. Для фильтрации по имени команды процесса можно использоватьsudo ausearch -m AVC -c httpd -ts recent -i, подставив фактическое значениеcomm. Ищите событие, близкое по времени к воспроизведённой ошибке. - 4Разберите поля отказаВ AVC определите
comm=илиexe=— какой процесс запрашивал доступ. Поляscontext=иtcontext=содержат полные контексты видаuser:role:type:level: третий компонентscontextобозначает домен процесса, а третий компонентtcontext— тип целевого объекта. Полеtclass=задаёт класс объекта, напримерfile,dirилиtcp_socket; содержимое{ ... }— запрошенную операцию, напримерread,writeилиname_connect. Полеname=иногда помогает определить объект, но его нужно сверить с фактическим путём или конфигурацией сервиса. - 5Выберите минимальн ое исправлениеНеверный тип файла исправляйте через
restoreconили постоянное правилоsemanage fcontext; предусмотренное поведение службы — Boolean; нестандартный порт — меткой порта. Локальный модуль рассматривайте только после исключения этих вариантов. - 6Повторите действие в EnforcingПосле изменения снова воспроизведите исходную операцию при результате
Enforcingкомандыgetenforce. Затем проверьте, не появился ли новый AVC. Успешный запуск службы сам по себе не доказывает, что требуемая операция приложения действительно выполнена.
