Что такое 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/html
2. Установить правильный тип
sudo chcon -R -t httpd_sys_content_t /var/www/html
3. Сделать изменения постоянными (после перезагрузки или 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 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний