Определение простыми словами
SELinux — это второй слой проверки прав поверх классических Unix-прав (rwx). Даже если nginx запущен от root, SELinux не даст ему прочитать файл с контекстом, который не описан в политике. Каждый процесс получает домен (например, httpd_t), а каждый файл — тип (httpd_sys_content_t). Разрешённые переходы между ними определяются жёсткими правилами, а не пользовательскими ACL.
Идея пришла из проектов NSA для систем с высокой степенью защиты. В обычной CMS-инфраструктуре SELinux ловит ситуации, когда уязвимый PHP-скрипт пытается прочитать /etc/shadow или открыть TCP-порт за пределами разрешённого диапазона. Без него атакующий получил бы доступ ко всему, до чего дотягиваются права процесса. С ним — только к файлам и портам, явно прописанным в политике.
Сравнение режимов
| Режим | Что делает | Когда применять |
|---|---|---|
| enforcing | Блокирует и логирует | Production |
| permissive | Только логирует | Отладка политики |
| disabled | Полностью выключен | Не рекомендуется |
Кейсы использования
- Защита веб-сервера: эксплойт в PHP не даст доступа к чужим vhost.
- Изоляция контейнеров: container-selinux добавляет домен
container_t. - Сертификация PCI DSS и ФСТЭК: MAC обязателен для ряда стандартов.
- Негативный сценарий: «всё работало, после rsync сайт перестал отдаваться» — типичная проблема потерянных контекстов. Решается командой
restorecon -Rv /var/wwwвместо отключения SELinux.
Технические детали
getenforce
setenforce 0
sestatus
ls -Z /var/www/html
chcon -t httpd_sys_content_t /var/www/html/index.html
restorecon -Rv /var/www
semanage port -a -t http_port_t -p tcp 8080
ausearch -m AVC -ts recent
audit2allow -a -M mypol
semodule -i mypol.pp
Альтернатива SELinux — AppArmor в Ubuntu и Debian, который оперирует путями вместо контекстов. Для глубокой изоляции отдельных операций используют seccomp и chroot. Все три механизма дополняют, а не заменяют классические права UNIX.
🔥 Где это применяется
Частые вопросы
Можно ли выключить SELinux на проде?
Технически да, но это снимает целый слой защиты. Лучше перевести в permissive, починить контексты и вернуть enforcing.
Чем SELinux отличается от AppArmor?
SELinux работает с контекстами и метками файлов и сложнее в настройке. AppArmor описывает разрешённые пути и проще в освоении.
Как понять, что SELinux что-то заблокировал?
В логах появляются записи AVC denied. Утилита <code>ausearch</code> и <code>audit2allow</code> помогают сгенерировать правильную политику.