SELinux: avc denied в журнале аудита
Записи avc: denied означают, что операцию запретил SELinux. Права на файлы при этом в порядке, и без журнала аудита причина не видна. Отключать SELinux целиком — плохой ответ: обычно достаточно поправить метку файла.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Неверная метка файла или каталога
Файлы, установленные вручную или скопированные из домашнего каталога, получают неподходящий тип. Политика не разрешает службе работать с таким типом.
-
Служба слушает нестандартный порт
Политика разрешает службе только определённые порты. Перенос веб-сервера на порт 8081 без правки политики запрещается.
-
Нужна логическая переменная политики
Часть возможностей выключена по умолчанию: исходящие соединения веб-сервера, доступ к домашним каталогам. Они включаются переключателями политики.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Записи о запретах: тип источника, тип цели, операция.
sudo ausearch -m avc -ts recent | tail -20Человеческое объяснение запрета и подсказка, что делать.
sudo ausearch -m avc -ts recent | audit2allow -w 2>/dev/null | head -20Режим SELinux: в permissive запреты только записываются.
getenforceРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Файлы, установленные вручную или скопированные из домашнего каталога, получают неподходящий тип. Политика не разрешает службе работать с таким типом.
- Как проверить
-
Посмотрите метки и записи аудита.
ls -Z /var/www/site/index.html 2>/dev/null sudo ausearch -m avc -ts recent | tail -10
- Как исправить
-
Назначьте правильный тип и восстановите контексты по каталогу.
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/site(/.*)?" && sudo restorecon -R -v /var/www/site
- Почему происходит
- Политика разрешает службе только определённые порты. Перенос веб-сервера на порт 8081 без правки политики запрещается.
- Как проверить
-
Посмотрите разрешённые порты для типа.
sudo semanage port -l | grep -i http sudo ausearch -m avc -ts recent | grep -i port
- Как исправить
-
Добавьте порт в политику для нужного типа.
sudo semanage port -a -t http_port_t -p tcp 8081
- Почему происходит
- Часть возможностей выключена по умолчанию: исходящие соединения веб-сервера, доступ к домашним каталогам. Они включаются переключателями политики.
- Как проверить
-
Посмотрите доступные переключатели.
sudo getsebool -a | grep -i httpd | head -10
- Как исправить
-
Включите нужный переключатель постоянно.
sudo setsebool -P httpd_can_network_connect on
Пример вывода
Веб-сервер не может прочитать файл с неверной меткой. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
audit[4100]: AVC avc: denied { read } for pid=4100 comm="nginx" name="index.html" dev="vda2" ino=131074 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
nginx[4100]: [error] open() "/var/www/site/index.html" failed (13: Permission denied)
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=229/SELINUX_CONTEXT в systemd Код 229/SELINUX_CONTEXT: не удалось определить или сменить контекст SELinux для процесса службы.
- nginx 403 Forbidden и Permission denied на файлы сайта nginx отдаёт 403: нет прав на файлы сайта, закрыт каталог по пути, мешает SELinux или AppArmor, нет индексного файла.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Interactive authentication required при управлении службой systemctl требует аутентификации: обращение от непривилегированного пользователя через polkit. Как разрешить точечно.
Где встречается чаще всего
Источники
- Документация SELinux: устранение запретов
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено файлом с меткой домашнего каталога в корне сайта.