Введение
Security Enhanced Linux (SELinux) предоставляет дополнительный уровень системной безопасности. SELinux принципиально отвечает на вопрос: «Может ли <субъект> выполнить <действие> над <объектом>?», например: «Может ли веб-сервер получить доступ к файлам в домашних каталогах пользователей?». Стандартная модель управления доступом на основе прав пользователя, группы и других — Discretionary Access Control (DAC, дискреционное управление доступом) — не позволяет администраторам создавать комплексные и детализированные политики безопасности. Например, нельзя ограничить одни приложения только чтением лог-файлов, а другим разрешить добавлять в них новые записи. SELinux реализует Mandatory Access Control (MAC, мандатное управление доступом). Каждый процесс и системный ресурс имеют специальную метку безопасности, называемую контекстом SELinux. Контекст SELinux, также называемый меткой SELinux, — это идентификатор, который абстрагируется от системных деталей и фокусируется на свойствах безопасности объекта. Это не только даёт единый способ ссылаться на объекты в политике SELinux, но и убирает неоднозначности, которые могут возникнуть при других методах идентификации. Например, файл может иметь несколько корректных путей в системе, где используются bind-mount’ы. Политика SELinux использует эти контексты в наборе правил, которые определяют, как процессы могут взаимодействовать друг с другом и с системными ресурсами. По умолчанию политика не разрешает никакого взаимодействия, если только правило явно не предоставляет доступ.
Важно помнить, что правила политики SELinux проверяются после правил DAC. Если правила DAC изначально запрещают доступ, правила SELinux не применяются. Это означает, что отказ SELinux не будет зафиксирован в логах, если доступ был отклонён традиционными правилами DAC.
Контексты SELinux содержат несколько полей: пользователь, роль, тип и уровень безопасности. Наиболее важным при работе с политикой SELinux является именно тип, так как большинство правил, определяющих допустимые взаимодействия между процессами и системными ресурсами, основаны на типах SELinux, а не на полном контексте. Типы SELinux обычно оканчиваются на _t. Например:
- тип для веб-сервера —
httpd_t; - тип для файлов и каталогов в
/var/www/html/—httpd_sys_content_t; - тип для файлов и каталогов в
/tmpи/var/tmp/—tmp_t; - тип для портов веб-сервера —
http_port_t.
Например, в политике есть правило, которое разрешает Apache (веб-серверный процесс, работающий как httpd_t) доступ к файлам и каталогам с контекстом, обычно встречающимся в /var/www/html/ и других веб-каталогах (httpd_sys_content_t). Для файлов в /tmp и /var/tmp/ соответствующего правила нет, поэтому доступ запрещён. Таким образом, даже если Apache будет скомпрометирован, и вредоносный скрипт получит доступ к серверу, он всё равно не сможет обратиться к каталогу /tmp.
Рисунок 1.1. SELinux разрешает процессу Apache, работающему с типом httpd_t, доступ к каталогу /var/www/html/ и запрещает этому же процессу доступ к каталогу /data/mysql/, так как отсутствует правило allow для взаимодействия типов httpd_t и mysqld_db_t. С другой стороны, процесс MariaDB, работающий с типом mysqld_t, имеет доступ к каталогу /data/mysql/. При этом SELinux корректно запрещает процессу с типом mysqld_t доступ к каталогу /var/www/html/, помеченному контекстом httpd_sys_content_t.