Что такое SELinux и как правильно настроить контексты безопасности
Многие администраторы хотя бы раз сталкивались с ситуацией: «всё настроено правильно, права 755, владелец верный — а сервис всё равно не видит файлы».
Чаще всего виноват не chmod, а SELinux — дополнительный уровень безопасности в Linux, который контролирует, что процессы могут делать с какими файлами.
Разберём, что такое SELinux, зачем он нужен и как разобраться с контекстами безопасности, чтобы не выключать его «ради простоты».
SELinux (Security-Enhanced Linux) — это система обязательной политики безопасности, разработанная NSA и интегрированная в ядро Linux.
Она дополняет стандартную модель прав доступа (user/group/other) и проверяет не только владельцев и разрешения, но и контексты безопасности.
Если обычная модель Linux отвечает на вопрос «кто может читать файл», то SELinux добавляет «какой процесс и с какой целью может это сделать».
Режимы работы SELinux
SELinux работает в одном из трёх режимов:
- Enforcing — активен, блокирует запрещённые действия;
- Permissive — только пишет предупреждения в лог (
/var/log/audit/audit.log), но не блокирует; - Disabled — полностью отключён.
Проверить текущий режим можно так:
sestatusили:
getenforceПереключить:
setenforce 0 # permissive
setenforce 1 # enforcing(Чтобы изменить режим навсегда — правь /etc/selinux/config.)
Что такое контексты безопасности
Каждый файл, процесс и порт в системе имеет SELinux-контекст, который выглядит так:
system_u:object_r:httpd_sys_content_t:s0
Он состоит из 4 частей:
| Элемент | Пример | Описание |
|---|---|---|
| user | system_u | SELinux-пользователь |
| role | object_r | Роль объекта (файл, процесс и т.п.) |
| type | httpd_sys_content_t | Тип — ключевой параметр, определяющий, что разрешено |
| level | s0 | Уровень безопасности (обычно не используется в простых политиках) |
Тип (type) — это основное, что управляет доступом.
Например:
httpd_sys_content_t— файлы, доступные веб-серверу;httpd_log_t— логи веб-сервера;ssh_port_t— порт, который разрешён для SSH.
Просмотр контекста файла
ls -Z /var/www/htmlили для процесса:
ps -eZ | grep httpdКак исправить проблемы с контекстами
Самая частая ошибка: ты копируешь сайт в /var/www/html, но Apache не может прочитать файлы, потому что у них неправильный контекст.
Решение:
1. Проверить контекст
ls -Z /var/www/html2. Установить правильный тип
sudo chcon -R -t httpd_sys_content_t /var/www/html3. Сделать изменения постоянными (после перезагрузки или relabel)
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
sudo restorecon -Rv /var/www/htmlРазрешение доступа к нестандартным портам
Если ты, например, хочешь, чтобы Nginx слушал 8080 порт, SELinux может заблокировать это.
Проверим, какие порты разрешены:
semanage port -l | grep http_port_tДобавим свой:
sudo semanage port -a -t http_port_t -p tcp 8080Отладка: как понять, что блокирует SELinux
Если сервис «не работает без причины», посмотри логи:
sudo cat /var/log/audit/audit.log | grep deniedЧтобы проще читать логи, установи утилиту setroubleshoot:
sudo yum install setroubleshoot
sudo sealert -a /var/log/audit/audit.logОна расшифрует ошибки и даже предложит решения — какой контекст назначить или какое правило добавить.
SELinux vs AppArmor
Некоторые дистрибутивы (например, Ubuntu) используют AppArmor — упрощённую альтернативу.
AppArmor проверяет доступ на основе путей, SELinux — на основе контекстов.
SELinux гибче и надёжнее, но требует внимательной настройки.
Когда SELinux стоит выключать
Почти никогда. В 90% случаев проблема решается одной из команд:
restorecon -Rv /path/to/dirили
semanage fcontext -a -t нужный_тип "/path(/.*)?"Отключать SELinux стоит только временно, для диагностики, но не в продакшене.
Заключение
SELinux — это мощный механизм, который защищает систему даже при взломе приложения.
Он не заменяет права доступа, а дополняет их, добавляя слой «кто с кем может взаимодействовать».
Понимание контекстов (httpd_sys_content_t, ssh_port_t, и др.) — ключ к тому, чтобы система оставалась безопасной и рабочей.
Один раз разобравшись, ты перестанешь видеть SELinux как врага — и начнёшь использовать его как союзника в защите сервера.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний