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, вы можете указать здесь один из трех параметров enforce, permissive и disabled
Используйте disabled чтобы полностью отключить SELinux или любой другой, чтобы включить SELinux обратно. Этот режим будет применяться по умолчанию при старте системы.
4. Выбор политики
Настройка SELinux политик выполняется тоже в этом файле. За политику отвечает параметр SELINUXTYPE:
Вы можете ссылаться на любую политику, расположенную в каталоге /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
Выводы
Теперь вы знаете как включить, отключить SELinux, а также как поменять политику или режим работы программы. Мы рассмотрели работу с контекстом, модулями политики, а также флагами. Этого вполне достаточно чтобы понимать как настроить SELinux на вашем сервере. Все остальное выходит за рамки нашей небольшой статьи.
Спасибо, написано доступным языком, в отличии от на некоторых других ресурсах.
Как обновить Ubuntu 16 версии на более новую. так как поддержка уже окончена?. SElinux не ставиться простой командой "sudo apt-get install selinux"
Идиот, поддержка до апреля 2021! Как не ставится selinux? Показал бы вывод? И зачем тебе это нужно?
Опечатка, вместо "sudo semoule -r unconfined" нужно sudo semodule -r unconfined
По мне так - это большая головная боль, использование SELinux, т.к. при политике targeted будут использованы политики для известных программ, а неизвестные - будут работают в неограниченном домене unconfined_t, что позволяет им работать с неограниченными административными правами; какая уж тут безопасность? Мнимая, наверное...или не использовать неизвестное SELinux-у ПО - только тогда зачем SELinux, непонятно.
А настройка strict - та ещё развлекуха, с учётом наличия в системе кучи прикладных консольных утилиток - к каждой из 1000+ устанешь политики прописывать....
Если уж безопасность - лучше в сторону постоянных бекапов и виртуализации подумать: jail, xen и т.п., более гибко и удобно в настройке.
Вы пишите: Стандартные атрибуты контроля доступа, такие как группа и владелец ничего не значат для SELinux.
Но это не так. Важно помнить, что SELinux срабатывает только после классической схемы
доступа. То есть, если есть некий файл, владелец/группа root:root и права 0600, то какие бы SELinux-метки не стояли, простой пользователя не сможет прочитать этот файл
Естественно. Если бы это работало иначе, то и не было бы и смысла все это делать. Поэтому "Стандартные атрибуты контроля доступа, такие как группа и владелец ничего не значат для SELinux", если надо запретить, SELinux запретит несмотря на владельца или группу.
А с каких пор сьюза selinux юзает? #аффтарисправь
Ещё бы автору научиться делать "скриншоты" нужного окна программы, а не всего рабочего стола...
П.2 Здесь мы видим, что система включена SELinux status: enabled, Текущий режим Current mode - enforcing, то есть мы будем только получать сообщения о нарушениях в логе.
Выше написано, что
Enforcing - программа активирована и блокирует все не соответствующие политикам действия и третий режим Permissive - только фиксировать нарушения.
Т.е. получается, что мы будем только получать сообщения о нарушениях в логе при Current mode - permissive а не enforcing?
Прошу пояснить этот момент.
Вы правы, в тексте была ошибка. Поправил, спасибо, что сообщили.
Добрый день. Подскажите, SeLinux работает с директориями на кириллице? Стоит самба и до недавнего времени все политики применялись и работали без проблем (все названия директорий были латиницей). Но пришло распоряжение Создавать в проектах новые директории на русском языке. А SeLinux пишет "... в названии пути неопределенные символы ..." и не применяет политики. Пока отключил его, но не хотелось бы терять этот уровень защиты.
Спасибо!
Исправление. В этом тексте:
После перезагрузки вы можете посмотреть посмотреть состояние SELinux:
2 раза повторяется слово "посмотреть"
Исправление. В тексте:
sudo vi /.autolabel
надо:
sudo vi /.autorelabel