Недавно начал использовать Oracle Linux 8 на серверах. В RHEL-подобных дистрибутивах по умолчанию включен SELinux. Периодически это приводит к различного рода ошибкам. Например, nginx не может делать proxy_pass на внешний адрес. Я решил это с помощью команды setsebool httpd_can_network_connect 1
. Или другой пример: мое приложение на Node.JS падает с ошибкой avc: denied { execmem }
, при запуске как systemd service. С этим я еще не разобрался.
С одной стороны я могу отключить SELinux и жить дальше, но мне стало интересно, зачем вообще нужна эта технология. Читаю доку от Red Hat. Из доки я сделал вывод, что SELinux позволяет сделать более гранулярные правила доступа к ресурсам, чем в традиционном DAC. Таким образом, каждому файлу и директории можно поставить какую-то SELinux метку, а для процесса описать политику, в которой указано что можно делать с какими-то ресурсами, а что нельзя. Но разве в DAC делается не тоже самое? Обычно для веб сервера или базы данных создается свой собственный пользователь, которому выдаются доступы к определенным каталогам, а ко всем остальным каталогам доступы запрещаются. В доке от Red Hat пишут:
For example, if the Apache HTTP Server is compromised, an attacker cannot use that process to read files in user home directories, unless a specific SELinux policy rule was added or configured to allow such access.
Но разве Apache по умолчанию настроен так, что у него есть доступ к файлам в домашних каталогах пользователей? У него отдельный пользователь, который никаких доступов в /home
не имеет, если их не выдали явно. Или идея в том, что даже если я запустил Apache от своего пользователя с включенным SELinux, то и в этом случае взломанный Apache не будет иметь доступа к моему домашнему каталогу?
Получается, что SELinux это в некотором роде аналог песочниц типа jails в FreeBSD или lxc/bubblewrap в Linux?
В общем, камрады, поделитесь своими мыслями о SELinux: в чем основная идея, когда может быть нужен, нужен ли вообще?