В операционных системах семейства Linux существует такое понятие как Security Enhanced Linux (SELinux). Это – не что иное, как система контроля доступа. Данная система разрабатывалась как защита ОС от несанкционированного доступа к ней. В настоящее время SELinux включена во многие Linux-дистрибутивы. Ниже посмотрим, как работать с SELinux в Ubuntu 20.04.
Что это такое вообще?
При помощи SELinux в систему внедряется мандатная модель управления доступом. В оригинале – Mandatory Access Control (MAC). Такая модель по сути является методом разграничения контроля доступа, имеющим определённый набор привилегий. В дистрибутиве операционной системы MAC реализуется поверх модели избирательного управления доступом, или Discretionary Access Control (DAC).
Модель избирательного управления доступом представляет собой систему управления доступом на основе списков, в которых объектами доступа являются пользователи, группы и прочее. Такие объекты обладают комбинациями полномочий (чтение/запись/выполнение). В свою очередь, SELinux может ограничивать доступ к пользовательским объектам таким образом, что суперпользователь не будет иметь суперпривилегий в отношении всех объектов такого пользователя.
Иначе говоря, SELinux позволяет настроить систему контроля доступа, в которой определяется степень влияния пользователей на процессы, описанные в настройках. С помощью таких настроек можно предотвратить получение несанкционированного доступа к процессам и объектам системы. Для лучшего понимания работы системы мы попробуем произвести настройку SELinux на виртуальном сервере, который работает под управлением Ubuntu 20.04.
Инсталляция SELinux
В рамках настоящего руководства следует использовать VPS, на котором выполнены работы по первоначальной настройке виртуального сервера. В частности, авторизацию в системе необходимо производить при помощи учётной записи, не являющейся суперпользователем, но имеющей привилегии sudo. Также, полезно обезопасить сервер настройкой брандмауэра. Как это сделать, описано в соответствующей статье нашего справочника.
Во-первых, перед тем, как запустить установку SELinux, нужно обновить список пакетов:
$ sudo apt update
Команда для инсталляции SELinux выглядит следующим образом:
$ sudo apt install policycoreutils selinux-utils selinux-basics
Установочная инструкция содержит необходимые пакеты, а именно:
policycoreutils
– основные утилиты политики, необходимые для базовой работы SELinux;selinux-utils
– различные утилиты с расширенной поддержкой SELinux;selinux-basics
– базовые компоненты SELinux, направленные на упрощение установки.
Состояние SELinux
Сразу после установки SELinux будет находиться в выключенном состоянии. Чтобы это увидеть, наберите команду sestatus
:

Для запуска SELinux необходимо ввести команду sudo selinux-activate
:

После активации системы нужно будет перезагрузить сервер. В результате команда sestatus
сообщит нам о том, что SELinux теперь находится во включенном состоянии.

Режимы SELinux
Запущенный SELinux может работать в двух состояниях – permissive
и enforcing
. Для вывода активного на данный момент режима применяется команда getenforce
:

При работе режиме в permissive
система SELinux не может блокировать доступ к тем объектам, которые не имеют разрешений в соответствии с настройками политик SELinux. Но при этом, все отказы в доступе регистрируются в /var/log/audit/audit.log
.
В свою очередь, режим enforcing
применяет в системе набор политик SELinux и запрещает доступ к остальным объектам и процессам. Для просмотра загруженных в память политик используется следующая команда:
$ sudo semodule -l
Основные настройки SELinux находятся в файле /etc/selinux/config
. При помощи данного файла можно отключить SELinux полностью, а также произвести настройки требуемой политики безопасности. Содержимое файла выглядит примерно следующим образом:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# default - equivalent to the old strict and targeted policies
# mls - Multi-Level Security (for military and educational use)
# src - Custom policy built from source
SELINUXTYPE=default
# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0
Параметр SELINUX как раз и указывает на применённый в данный момент режим, принимая значения permissive
или enforcing
. Значение disabled
будет означать, что система SELinux полностью отключена.
Переключение между режимами также можно производить с использованием команды setenforce
. Активация режима enforcing
происходит при выполнении следующей инструкции:
$ sudo setenforce 1

В свою очередь режим permissive
включается командой:
$ sudo setenforce 0

Контекст SELinux
Каждый объект в системе маркируется при помощи SELinux, и такую маркировку принято называть контекстом. Все процессы в операционной системе, а также, файлы и пользователи имеют соответствующие метки, которые, в свою очередь, состоят из трёх частей – пользователь, роль и тип. Роли, получаемые пользователями, контролируются политикой SELinux. Каждая из ролей содержит определённые ограничения по типам файлов, и данные ограничения определяются политикой SELinux. Именно контекст содержит в себе набор соответствующих меток, тем самым сообщая системе информацию о наложенных ограничениях.
Посмотреть содержимое контекста, к примеру, какой-либо директории можно используя команду ls -Z
. Например, для каталога /home
запись данной команды будет иметь вид:
$ ls -Z /home

В данном случае каталог /home
содержит всего один объект – директорию your-user
. При этом вы можете заметить, что содержимое контекста для него описано следующим синтаксисом:
user:role:type:level
Здесь, значение user
соответствует имени пользователя, role
– имени объекта, type
– имени типа для каталогов и файлов или имени домена для процессов, а level
– уровню доступа.
Подобным же образом отображается контекст для процессов. Например, так выглядит контекст для процесса httpd
:
$ ps Z | grep httpd

Логические параметры SELinux
Логические параметры служат для включения и отключения позиций SELinux. Полный список таких логических переменных доступен для просмотра по команде getsebool -a
. Поскольку данный список довольно обширный, то для поиска необходимых параметров удобнее пользоваться фильтром grep
:
$ getsebool -a | grep cron

Изменение значения какой-либо переменной происходит при помощи команды setsebool
. Для того, чтобы изменённое значение сохранилось в конфигурации после перезагрузки системы, необходимо использовать опцию -P
. Отсутствие данной опции означает, что внесённые изменения будут касаться исключительно текущих значений, и при перезапуске системы значения вернутся в установленные конфигурацией. Например, так будет выглядеть команда для включения логической переменной cron_read_all_user_content
:
$ setsebool -P cron_read_all_user_content ON

Вместо заключения
Данным введением в SELinux для Ubuntu 20.04 мы лишь поверхностно коснулись основных понятий о SELinux. Мы ознакомились с тем, как SELinux защищает операционную систему, что такое режимы работы SELinux, как происходит маркирование объектов системы и каким образом можно вносить изменения в логические позиции SELinux.