SELinux (Security-Enhanced Linux) — расширение ядра Linux, реализующее систему мандатного контроля доступа (MAC — Mandatory Access Control). В отличие от стандартного DAC (Discretionary Access Control, права rwxrwxrwx), SELinux применяет политики безопасности, которые ограничивают действия процессов вне зависимости от прав пользователя.
Как работает
Каждый объект в системе (файл, процесс, сокет, порт) получает метку безопасности (security context) в формате user:role:type:level. Например, файл Nginx: system_u:object_r:httpd_exec_t:s0. Ядро проверяет: разрешает ли политика процессу с контекстом httpd_t обращаться к объекту с типом httpd_exec_t. Нет разрешения — доступ запрещён и записывается в audit-лог.
Режимы SELinux: Enforcing — политики применяются, нарушения блокируются (продакшн). Permissive — политики только логируются, не блокируются (для отладки). Disabled — SELinux выключен. Проверка: getenforce. Переключение: setenforce 0 (временно) или правка /etc/selinux/config (постоянно, требует перезагрузки).
Типичные проблемы при настройке: Nginx не может прочитать файлы сайта из нестандартной директории (chcon -R -t httpd_sys_content_t /srv/www), Nginx не может открыть нестандартный порт (semanage port -a -t http_port_t -p tcp 8080).
История
SELinux разработан NSA (Агентство национальной безопасности США) совместно с Red Hat. Первая версия опубликована в 2000 году. В ядро Linux 2.6 (2003) SELinux включён как стандартный модуль безопасности через LSM (Linux Security Modules). В RHEL 4 (2005) стал компонентом по умолчанию. AppArmor (Ubuntu) — альтернативная реализация MAC с другим подходом (пути файлов вместо меток).
SELinux: практика управления политиками
Типичная ситуация: после перемещения файлов nginx теряет к ним доступ — SELinux блокирует из-за неправильного контекста. Исправление: restorecon -Rv /path/to/files восстанавливает контекст из политики. chcon -t httpd_sys_content_t /path/to/file — ручное изменение. semanage fcontext -a -t httpd_sys_content_t '/path(/.*)?' — добавить в политику постоянно.
audit2allow — инструмент для создания custom-политик из audit.log: ausearch -c nginx --raw | audit2allow -M mynginx && semodule -i mynginx.pp. Это загружает новый модуль политики, разрешающий конкретную операцию. Для VPS-серверов SELinux рекомендуется оставить в enforcing — это дополнительный уровень защиты при компрометации PHP/веб-приложения. На AlmaLinux/RHEL SELinux включён по умолчанию.
На что обращать внимание
Не рекомендуется отключать SELinux на продакшн-серверах — это снижает безопасность при компрометации. Правильный подход: использовать audit2allow для генерации правил из audit-лога, а не переключать в permissive при проблемах. AlmaLinux, RHEL и Fedora поставляются с SELinux в режиме Enforcing по умолчанию. Ubuntu и Debian используют AppArmor вместо SELinux.
SELinux в хостинге
SELinux — обязательный компонент безопасности в AlmaLinux/RHEL. Режимы: enforcing — блокирует нарушения политик, permissive — только логирует. Для nginx: SELinux по умолчанию запрещает nginx слушать нестандартные порты и обращаться к файлам вне /var/www/html. Добавить разрешение: semanage fcontext -a -t httpd_sys_content_t '/srv/www(/.*)?'. Для Docker: используйте :z или :Z при bind mount volumes — SELinux иначе блокирует доступ контейнера к файлам хоста. На Ubuntu/Debian: SELinux не используется по умолчанию — вместо него AppArmor. VPS-провайдеры на AlmaLinux обычно оставляют SELinux в permissive режиме для совместимости.