Данное руководство – введение в SELinux под CentOS Stream.
Security Enhanced Linux (SELinux) – это система контроля доступа, которая в настоящее время встраиватся в большинство Linux-дистрибутивов. В своё время система была разработана для защиты компьютерных систем от взлома и несанкционированного доступа к ним со стороны злоумышленников. С момента появления SELinux в открытом доступе многие дистрибутивы включили систему в свой код. В этом мануале попробуем протестировать SELinux на сервере под управлением CentOS Stream.
Что такое SELinux?
В операционную систему при помощи SELinux внедряется, так называемая, мандатная модель управления доступом (Mandatory Access Control), сокращённо MAC. Данная модель управления представляет собой способ разграничения контроля доступа с определённым набором привилегий. В дистрибутиве Linux MAC реализована поверх того, что мы называем моделью избирательного управления доступом (Discretionary Access Control), сокращённо DAC.
DAC – это управление доступом на основе списков управления доступом, где объектами доступа служат пользователь, группа и другие. Эти объекты имеют комбинацию полномочий чтение/запись/выполнение или r/w/x. SELinux позволяет ограничить доступ к объектам пользователя, который определён именно им так, что суперпользователь не может иметь суперпривилегии по отношению ко всем объектам нашего пользователя.
Другими словами, SELinux позволяет произвести точную настройку требований контроля доступа, с помощью которой определяется степень влияния пользователя на описанный настройкой процесс. Это в полной мере может предотвратить получение злоумышленником доступа ко всем объектам и процессам системы.
Чтобы понять работу системы, мы произведём настройку конфигурации SELinux на сервере, работающем на операционной системе CentOS Stream.
Установка SELinux
В этом разделе мы установим различные пакеты, используемые в SELinux. Они призваны помочь в создании, управлении и анализе политик SELinux. Сначала необходимо проверить, какие пакеты уже установлены в вашей системе:
# rpm -aq | grep selinux
Если ваша CentOS Stream развёрнута только что, то в системе должны быть установлены следующие пакеты:
Теперь, необходимо запустить установку следующих пакетов и их зависимостей:
# dnf install policycoreutils-python-utils setools setools-console setroubleshoot
Данная инсталляция содержит следующие пакеты:
policycoreutils-python-utils
– содержит инструменты для администрирования SELinux-среды и политик;setools
– обеспечивает инструменты командной строки возможностью работы с политиками SELinux (в том числе:sediff
– инструмент, использующийся для просмотра различий между политиками,seinfo
– инструмент для просмотра информации о компонентах, которые создают политики, иsesearch
– инструмент для поиска внутри политик);setools-console
– содержитsediff
,seinfo
иsesearch
;setroubleshoot
– набор инструментов, которые помогают определить, что именно (скрипт, файл и т.д.) блокируется системой SELinux.
Состояния SELinux
Установленная на сервер система может находиться во включенном или выключенном состоянии. Сразу после инсталляции на CentOS Stream система будет находиться в состоянии “disabled” (выключено). Для её запуска отредактируйте файл /etc/selinux/config
:
# cd /etc/selinux
# vi config
В нём значение переменной SELINUX
измените с disabled
на enabled
. После чего перезагрузите сервер:
# reboot
После перезагрузки подключитесь к вашему VPS и проверьте статус SELinux:
# sestatus
Режимы SELinux
Во включенном состоянии SELinux может быть запущен в режимах enforcing
и permissive
.
В режиме enforcing
система SELinux принуждает ОС к применению SELinux-политик и запрещает несанкционированный, с точки зрения SELinux, доступ остальным объектам и процессам. Следующей инструкцией вы можете увидеть загруженные в память системы SELinux-политики:
# semodule -l
В режиме permissive
SELinux не блокирует доступ к объектам, не имеющим разрешений от политик SELinux. Вместо этого, система регистрирует любые отказы в доступе, используя /var/log/audit/audit.log
.
Проверить, в каком режиме SELinux функционирует сейчас, можно командой:
# getenforce
Переключаться между режимами можно, используя команду setenforce:
# setenforce enforcing
или
# setenforce permissive
Также, режим permissive
можно активировать при помощи инструкции:
# setenforce 0
Активированный режим виден при выводе набора текущих настроек командой sestatus
.
Контекст SELinux
SELinux маркирует каждый объект в системе при помощи контекста. Все файлы, пользователи и процессы имеют такую маркировку, которая делится на три части – пользователь, роль и тип. Политика SELinux контролирует роли, получаемые пользователями. Каждая роль несёт в себе ограничения по типам файлов, к которым пользователь имеет доступ. Эти ограничения определены политиками SELinux и содержатся как раз в наборе этих самых меток, который мы и называем контекстом.
Увидеть содержимое контекста для какого-либо каталога можно при помощи команды ls
. Для примера, давайте зарегистрируемся в системы под учётной записью пользователя, имеющего привилегии sudo, но не являющимся root’ом. После чего в домашней директории давайте создадим какой-нибудь каталог:
$ mkdir ~/your_dir
А теперь посмотрите, как выглядит контекст этого каталога:
$ ls -Z ~/
Для корневого каталога системы контекст будет выглядеть примерно так:
$ ls -Z /
Мы видим, что содержимое контекста для каждого файла или каталога описано следующим синтаксисом:
user:role:type:level
Здесь:
user
– это имя пользователя;role
– это имя объекта;type
– это имя типа для файлов и каталогов, и имя домена для процессов;level
– это уровень доступа.
А вот, как будет выглядеть в нашей системе контекст для процесса systemd
, например:
$ ps Z | grep systemd
Логичекие параметры SELinux
Включение и выключение логических позиций в SELinux может производиться без пересборки политик SELinux.
Во-первых, вы можете увидеть список логических переменных при помощи команды getsebool -a
. Для вывода этого списка используйте фильтр grep
:
# getsebool -a | grep "httpd_can"
Значение какой-либо переменной изменяется при помощи команды setsebool
. Использование опции -P
позволяет применять изменения в настройках через перезагрузку. Например, если вы хотите разрешить HTTPD-скриптам подключаться к сети, обновите значение логической переменной следующим образом:
# setsebool -P httpd_can_network_connect ON
Проверить изменения можно при помощи предыдущей инструкции:
# getsebool -a | grep "httpd_can"
В строке httpd_can_network_connect
вы должны увидеть значение on
:
Заключение
Данное введение в SELinux под CentOS Stream – это ваше первое короткое знакомство с основными понятиями о SELinux: о том, как SELinux может защитить систему, что представляют из себя режимы работы SELinux, как выглядит маркировка объектов и как оперировать логическими параметрами SELinux.