Настройка SELinux

  • Михаил
  • 12 мин. на прочтение
  • 170
  • 19 Jan 2023
  • 19 Jan 2023

Security-Enhanced Linux (SELinux) - это новый метод контроля доступа в Linux на основе модуля ядра Linux Security (LSM). SELinux включен по умолчанию во многих дистрибутивах на основе Red Hat, использующих пакетную базу rpm, например, Fedora, CentOS и т д.

В этой статье будет рассмотрена настройка SELinux, мы не будем трогать создание новых политик, а постараемся подойти к системе с другой стороны, посмотреть чем она может быть полезна обычному пользователю Linux, рассмотрим основы её работы, включение, отключение и изменение состояний. В качестве системы для выполнения примеров использовалась CentOS 8.

Основы SELinux

SELinux представляет собой систему маркировки, каждый процесс имеет метку. Каждый файл, каталог или даже пользователь в системе имеет метку. Даже портам и устройствам и именам хостов в системе присвоены метки. SELinux определяет правила доступа процесса к объектам с определенными метками. Это и называется политикой. За соблюдением правил следит ядро. Иногда это еще называется обязательный контроль доступа (Mandatory Access Control, MAC)

Владелец файла не имеет полной свободы действий над атрибутами безопасности. Стандартные атрибуты контроля доступа, такие как группа и владелец ничего не значат для SELinux. Полностью все управляется метками. Значения атрибутов могут быть установлены и без прав root, но на это нужно иметь специальные полномочия SELinux.

Теперь поговорим немного о политиках. Мы определяем метку для процессов определенного типа, а также на объекты файловой системы тоже определенного типа. Вот представьте, себе систему, в которой объекты (процессы) это кошки и собаки. Это типы процессов. И у нас есть объекты, к которым они хотят иметь доступ - еда. Но еда у них разная еда_котов и еда_собак. Нужно чтобы объекты имели доступ только к своей еде.

У собаки есть разрешение есть свою пищу, а у кошки - свою. В политиках SELinux это будет выглядеть вот так:

разрешить кошке корм_кошек есть

разрешить собаке корм_собак есть

Теперь ядро будет следить, чтобы соблюдались эти правила. В системе SELinux все по умолчанию запрещено, таким образом, если собака попытается съесть кошачий корм, ядро не позволит это сделать.

Допустим, процесс Apache имеет метку httpd_t, а файлы, к которым у Apache должен быть доступ мы назвали httpd_sys_content. Также у нас есть данные кредитных карт, которые хранятся в базе данных mysql. Если хакер взломает процесс Apache и у него будет root доступ, то он все равно не сможет получить доступ к файлам от mysql.

SELinux может вызвать у системных администраторов большое количество проблем, многие её просто отключают, таким образом, решив проблему и уменьшив безопасность. Как уже говорилось выше, по умолчанию SELinux блокирует все и вся. Это подходит под описание строгой политики. Но чтобы облегчить системным администраторам работу, были разработаны другие стандартные политики. Во многих дистрибутивах используется целевая политика (targeted), она охватывает около 200 сетевых служб и процессов, все же остальные программы запускаются и работают свободно, к ним никакие модели SELinux не применяются.

SELinux может работать в трех режимах - отключен, система полностью отключена и не работает, режим ограничений  Enforcing - программа активирована и блокирует все не соответствующие политикам действия и третий режим Permissive - только фиксировать нарушения.

Политики SELinux бывают тоже нескольких типов. Политика targeted, которую мы рассматривали выше относится к типу Type Enforcment (TE) политик, в которых управление доступом к файлам осуществляется на основе ролей. Сюда же относится политика strict. Есть ещё политики Multi-Level Security (MLS), в которых добавлены дополнительные категории, они сложные и ненужные рядовому пользователю, поэтому начинающим можно пока забыть об их существовании. Надо понять, что подсистема SELinux разработана военными для военных, поэтому обычным пользователям все её возможности вряд ли понадобятся. В этой статье мы будем обсуждать именно политику targeted.

Теория в общих чертах рассмотрена. А теперь перейдем к практической части.

Настройка SELinux

1. Состояние

После перезагрузки вы можете посмотреть посмотреть состояние SELinux:

sestatus

Здесь мы видим, что система включена SELinux status: enabled, Текущий режим Current mode - enforcing, то есть система будет блокировать неразрешенные действия. Используемая сейчас политика - targeted. Эта политика используется для того, чтобы правила SELinux распространялись только на определённые службы.

3. Режим работы

Сейчас давайте включим активный режим, для этого выполните команду:

sudo setenforce 1

Отключить активный режим можно передав в ту же команду 0:

sudo setenforce 0

Посмотреть используемый сейчас режим тоже можно подобной командой:

getenforce

Вся основная настройка SELinux выполняется через файл /etc/selinux/config. Здесь можно как полностью отключить selinux, так и настроить используемую политику безопасности.

sudo vi /etc/selinux/config

Этот параметр означает режим работы SELinux, вы можете указать здесь один из трех параметров enforcepermissive и disabled

SELINUX=enforcing


Используйте disabled чтобы полностью отключить SELinux или любой другой, чтобы включить SELinux обратно. Этот режим будет применяться по умолчанию при старте системы.

4. Выбор политики

Настройка SELinux политик выполняется тоже в этом файле. За политику отвечает параметр SELINUXTYPE:

SELINUXTYPE=targeted

 

Вы можете ссылаться на любую политику, расположенную в каталоге /etc/selinux. Могут использоваться три основные политики:

  • targeted - защищает основные системные сервисы, например, веб-сервер, DHCP, DNS, но не трогает все остальные программы.
  • strict - самая строгая политика, управляет не только сетевыми службами, но и программами пользователя.
  • mls - содержит не только правила, но и различные уровни безопасности. Она позволяет реализовать многоуровневую систему безопасности на основе SELinux.

Также можно добавить свои политики. Для применения политики необходимо перезагрузить компьютер, и желательно чтобы SELinux во время этой перезагрузки был в режиме аудита (permissive). Также, чтобы система обновила все метки в файловой системе, возможно, придется создать пустой файл в корне:

sudo vi /.autolabel

5. Просмотр контекста

Каждый файл и каждый процесс имеет свою SELinux метку, которую принято называть контекстом. Какая метка будет присвоена тому или иному файлу или процессу определяется политикой, в нашем случае это targeted. Посмотреть контекст SELinux можно с помощью команды ls:

ls -lZ /

Синтаксис у строки контекста такой:

имя_пользователя:имя_объекта:тип_или_домен:уровень_доступа

В политике targeted имя пользователя и имя объекта практически не используются, уровень доступа - относится к MLS политикам и на него тоже можно внимания не обращать. А смотреть стоит на третье поле. Для файлов или папок оно называется типом, а для процессов доменом. Например, у папки /bin тип bin_t.

Чтобы посмотреть домен процесса используйте команду ps, например, для httpd:

ps auxZ | grep httpd

Как видите, здесь у сервиса httpd домен httpd_t, это значит что ему будут доступны только те ресурсы, которые разрешено трогать этому домену, в данном случае это тип sys_httpd_content. Все это, включая названия, определено в политике targeted. В то же время другие процессы, здесь, например grep, запущены с доменом unconfined_t, это означает, что им будут доступны все без исключения ресурсы в системе, потому что именно такое поведение настроено в политике для этого домена.

6. Изменение контекста

По умолчанию папка веб-сервера находится по пути /var/www/html. У неё контекст такой, как мы обсудили ранее:

Если вы захотите перенести эту папку в другое место, то надо будет сменить контекст для новой папки. Для этого используется команда chcon, надо указать только тип:

sudo chcon -Rv --type=httpd_sys_content_t /home/losst/htdocs

Однако, можно указать контекст полностью:

sudo chcon -Rv system_u:object_r:httpd_sys_content_t:s0 /home/losst/htdocs

Это изменение сохранится после перезагрузки, но после обновления меток файловой системы оно будет стёрто. Чтобы этого избежать надо добавить правило в политику.

7. Модификация политики

Вы можете добавить дополнительные правила присвоения меток файлам в политику с помощью утилиты semanage. Чтобы установить тип httpd_sys_content_t для директории /home/losst/httdocs и все файлы в ней надо выполнить:

semanage fcontext -a -t httpd_sys_content_t "/home/losst/httdocs(/.*)?"

Если надо поменять контекст только для одного файла, то маску использовать не обязательно:

semanage fcontext -a -t httpd_sys_content_t "/home/losst/httdocs/index.html"

Сама собой эта команда в файловой системе ничего не меняет надо создать файл /.autolabel и перезагрузить компьютер или выполнить команду restorecon для нужной папки:

restorecon -R -v /home/losst/httdocs

Посмотреть все добавленные таким образом правила можно с помощью такой команды:

semanage fcontext -C -l

8. Логи

Несмотря на режим, в котором работает SELinux, все сообщения о нарушениях пишутся в лог файл /var/log/audit/audit.log. Вы можете посмотреть его вручную:

less /var/log/audit/audit.log

Или для более удобного просмотра можно использовать утилиту sealert. Для её установки выполните:

sudo yum install setroubleshoot

Затем можно смотреть:

sealert -a /var/log/audit/audit.log

Утилита отображает не все строки, а только сообщения об ошибках доступа и при этом выводит предлагаемые решения. Очень удобно. В числе решений утилита предлагает создать свой модуль для политики targeted, который разрешает делать то, что сейчас нельзя.

9. Модули

Политика targeted модульная. Она состоит из множества модулей, для различных программ. Чтобы посмотреть все активные на данный момент модули выполните:

semodule -l

Для просмотра всех установленных модулей выполните:

semodule --list-modules=full

В прошлом пункте было показано, как с помощью утилиты sealert посмотреть возможные решения проблемы доступа. Самое частое решение - создать свой модуль для политики на основе лога. Утилита audit2allow анализирует лог файл, находит там сведения об объектах, к которым нет доступа, а затем разрешает этот доступ в новом модуле. В предыдущем примере утилита sealert посоветовала такую команду:

ausearch -c 'httpd' --raw | audit2allow -M my-httpd

После этого в текущей папке появится пакет модуля с расширением .pp, который можно уже установить с помощью утилиты semodule:

sudo semodule -i my-httpd.pp

10. Флаги

Кроме того, поведение политики можно настраивать с помощью флагов. Обычно, флаги, которые надо включить рекомендует та же утилита sealert. Все флаги определены в модулях политики. Посмотреть какие флаги доступны сейчас и их состояние можно с помощью команды:

getsebool -a

Чтобы изменить состояние флага используйте команду setsebool. Например, чтобы разрешить модулям httpd подключаться к сети выполните:

setsebool -P httpd_can_network_connect on