Отключение selinux в boot android 7. Настройка SELinux, включение, отключение

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

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

Основы SELinux

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

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

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

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

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

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

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

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

В системе довольно часто встречаются процессы с одинаковыми типами. Чтобы это обойти, и настроить полномочия для разных процессов одного типа была придумана система категорий безопасности Multi Category Security (MCS). Мы можем добавить к объекту категорию, и настраивать полномочия уже в зависимости от этой категории.

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

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

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

Настройка SELinux

Система SELinux предустановлена вместе с дистрибутивом в системах,основанных на Red Hat, скорее всего, там уже все компоненты установлены, но в Ubuntu и других подобных дистрибутивах придется все делать самому. Для установки SELInux в Ubuntu выполните команду:

sudo apt-get install selinux

После завершения установки, систему необходимо будет перезагрузить для применения всех настроек, поскольку будет перезаписан файл конфигурации Grub, для передачи необходимых параметров ядру.

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

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: ubuntu
Current mode: permissive
Mode from config file: permissive
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 29

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

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

sudo setenforce 1

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

sudo setenforce 0

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

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

sudo vi /etc/selinux/config

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

SELINUX=permissive

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

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

SELINUXTYPE=ubuntu

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

Могут использоваться три основные политики:

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

Политики в Ubuntu необходимо устанавливать отдельно, для targeted и strict установите пакет:

sudo apt-get install selinux-policy-default

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

sudo vi ~/.autolabel

Хотите почувствовать всю мощь и заодно недостатки SELinux? Установите значение SELINUXTYPE в strict, и перезагрузите систему:

SELINUXTYPE=default

Только смотрите, чтобы SELinux работал в режиме permissive, иначе быть беде. Политика default реализует и targeted и strict, чтобы получить strict необходимо просто выгрузить модуль unconfined:

sudo semoule -r unconfined

Затем запускаем активный режим:

sudo setenforce 1

Ну а теперь можете попробовать почитать системные журналы, или включить обратно режим аудита. Ничего не работает? Правильно SELinux блокирует любые неразрешенные действия. У меня окно терминала сразу было закрыто и я больше не мог управлять своей системой. Чтобы получить обратно управление над своим компьютером его необходимо перезагрузить.

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

SELinux (Security-Enhanced Linux) - это система принудительного контроля доступа, она может работать параллельно со стандартной классической системой контроля доступа в linux. SELinux может создавать правила обращения пользователям или программам, что дает возможность ограничить некоторые возможности доступа им. В данной материале описано как задать различные режимы работы подсистемы защиты или просто выключить её в ОС Linux.

Статус SELinux

Команды /usr/sbin/getenforce и /usr/sbin/sestatus используются для проверки текущего статуса SELinux. Команда getenforce возвращает значение Enforcing , Permissive , или Disabled . Команда getenforce возвращает Enforcing когда SELinux активирован (правила политики SELinux принудительные):

# /usr/sbin/getenforce Enforcing

Команда getenforce возвращает Permissive когда SELinux активирован, но правила политики SELinux не принудительные enforced, и используются только правила DAC. Команда getenforce возвращает Disabled , если SELinux отключен.

Команда sestatus возвращает статус SELinux и используемой политики SELinux:

# /usr/sbin/sestatus

Значение SELinux status: enabled возвращается, когда SELinux включен. Current mode: enforcing возвращается, когда SELinux включен в принудительном enforced режиме. Policy from config file: targeted возвращается, когда используется политика SELinux targeted.

Управление SELinux

В операционных системах с отключенным SELinux, сконфигурирована опция SELINUX=disabled в /etc/selinux/config:

# 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=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted

Также, команда getenforce возвращает значение Disabled :

# /usr/sbin/getenforce Disabled

Для включения SELinux:

Если это не так, то выполните команду от root пользователя для исправления ошибок в отображениях пользователей. Безопаснее проигнорировать предупреждения SELinux-user username is already defined , если они появляются, где username может быть unconfined_u , guest_u , или xguest_u.

Всем привет, давайте поговорим немного о SELinux, но перед этим немного определения для тех, кто не слышал что это вообще такое. SELinux сокращение от анг. слова Security-Enhanced Linux что означает Linux с улучшенной безопасностью. Иными словами это реализация системы принудительного контроля доступа, которая способна функционировать параллельно с классической избирательной системой контроля доступа. Разница в том, что в SELinux посредством определенных политик определяются права доступа самой системой, в свою очередь избирательная система контроля доступа выполняет разделение доступа процессов к ресурсам, основываясь на правах пользователя, для простого понимания это права rwx на трех уровнях – владелец, группа-владелец и остальные пользователи.
После небольшого описания давайте попробуем рассмотреть некоторые команды и параметры SELinux. Наши примеры будут демонстрироваться на операционной системе Linux CentOS 6. Пожалуй, первое и наверное самое востребованное это команды для проверки статуса SELinux.

/usr/sbin/getenforce

/usr/sbin/sestatus

Возвращаемые значения для команды getenforce
Enforcing – указывает на то что SELinux активирован и правила политики принудительные;
Permissive – указывает на то что SELinux активирован, но правила политики не принудительные enforced и используются только правила DAC;
Disabled – указывает на то, что SELinux отключен.

Возвращаемые значения для команды sestatus
Данная команда возвращает помимо статуса SELinux так же используемую политику SELinux, пример:

$ /usr/sbin/sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 23 Policy from config file: targeted

SELinux status: enabled – обозначает что SELinux включен;
Current mode: enforcing – обозначает что SELinux включен в принудительном enforced режиме;
Policy from config file: targeted – обозначает что используется политика SELinux targeted.

Включение SELinux
Включается / отключается SELinux в операционной системе в файле конфигурации
/etc/selinux/config

# 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=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted

Опция SELINUX=disabled обозначает, что SELinux отключен. Перед тем как запустить SELinux необходимо выполнить некоторые манипуляции.
1. Проверить инсталляцию пакетов SELinux

Rpm -qa | grep selinux rpm -q policycoreutils rpm -qa | grep setroubleshoot

Так же убедитеть в том, что установлены следующие пакеты: selinux-policy-targeted, selinux-policy, libselinux, libselinux-python, libselinux-utils, policycoreutils, setroubleshoot, setroubleshoot-server, setroubleshoot-plugins . Пакеты policycoreutils-gui, setroubleshoot, selinux-policy-devel, и mcstrans опциональны.
Отсутствующие пакеты можно установить с помощью команды (под пользователем root)

Yum install package-name

2. Каждый файл файловой системы должен быть промаркирован контекстом SELinux перед запуском. До этого момента ограниченным доменам может быть отказано в доступе, что может привести к некорректной загрузке операционной системы. Ситуация исправляется выставлением опции SELINUX=permissive в конфигурационном файле /etc/selinux/config.

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

*** Warning -- SELinux targeted policy relabel is required. *** Relabeling could take a very long time, depending on file *** system size and speed of hard drives. ****

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

Grep "SELinux is preventing" /var/log/messages

Вывод должен быть пустой, это означает что всё в порядке, и SELinux не запрещает действия.
5. После того как вы убедились что сообщений о запретах в логах нет, установите параметр SELINUX в enforcing (файл /etc/selinux/config):

# 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=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted

6. После этого операционную систему следует перезапустить. После перезапуска нужно проверить возвращаемое значение Enforcing командой getenforce.

$ /usr/sbin/getenforce Enforcing

7. Для просмотра отображений между SELinux и пользователями системы, выполните команду

/usr/sbin/semanage login –l

Вывод команды должен быть такого плана:

Login Name SELinux User MLS/MCS Range __default__ unconfined_u s0-s0:c0.c1023 root unconfined_u s0-s0:c0.c1023 system_u system_u s0-s0:c0.c1023

Есть некоторые особенности, которые так же следует учитывать. При отключенном SELinux созданные пользователями файлы не маркируются, вследствие чего, при переводе в состояние enforcing могут появляться проблемы. Маркировка файлов произойдет по изменению опции с disabled на permissive/enforcing режим, таким образом, будет предотвращена проблема с появлением немаркированных файлов.

О SELinux написано довольно много, но у большинства этих материалов есть два недостатка. Либо это короткие практические советы как сделать что-то конкретное, но без объяснений того как это устроено и работает. А если статья (или глава в книге) описывает теоретические вопросы, то как-то длинно и запутанно.

Поэтому я и предпринял попытку кратко и доступно описать что такое SELinux. Доступно для тех, кто еще не сталкивался с системами безопасности. В силу стремления к краткости некоторые аспекты я пропустил, для того чтобы не перегружать - в этой статье только самая суть. В частности я не буду тут описывать что из себя представляет "старая" система безопасности Linux - DAC (discretionary access control, избирательное управление доступом). Или в чем отличия между DAC, MAC и RBAC. Желающие, могут об этом почитать например в википедии.

Что такое SELinux?

SELinux (Security Enhanced Linux) это система безопасности основанная на моделях мандатного и ролевого доступа. Была разработана в начале нулевых (2000-х) годов для того, чтобы исправить недостатки традиционной системы безопасности UNIX (DAC). SELinux реализована как компонент ядра Linux начиная с версии ядра 2.6. То есть SELinux можно использовать в любом дистрибутиве Linux с ядром 2.6 или более поздним. Конечно не во всех дистрибутивах использование SELinux облегчено до максимума, но в принципе можно установить почти в любом.

В нескольких дистрибутивах SELinux устанавливается "из коробки" - это RHEL, CentOS, Fedora. Так, что для реального использования нужно только перевести SELinux в режим enforced. Еще в нескольких дистрибутивах SELinux включен в репозитарий, так что его установка дело нескольких минут - например Debian, Ubuntu. В этих дистрибутивах SELinux устанавливается одной командой "sudo apt-get install selinux " с последующей перезагрузкой.

SELinux и DAC

SELinux работает "после" DAC. То есть операции, запрещенные в DAC не могут быть разрешены в SELinux.
Иными словами SELinux дополняет и конкретизирует действия разрешенные через DAC. При этом SELinux работает независимо от DAC.

Субъекты и объекты

Когда говорят о SELinux всегда упоминаются субъекты и объекты. То есть SELinux это разрешения и запреты которые применяются в действиях между субъектами и объектами.

Субъекты - строго говоря это пользователи, которые выполняют какие-либо операции на компьютере. Однако пользователи всегда действуют через те или иные прикладные программы. То есть человек-пользователь не может сам залезть внутрь компьютера и "своими руками" выполнить например запись в файл. Если ему нужно выполнить запись в файл, он запускает какую-либо программу. Поэтому, под субъектами чаще всего подразумеваются именно программы (процессы). Иначе говоря субъекты это те кто выполняет некие действия.

Объекты это то, над чем действия выполняются. Чаще всего под объектами подразумеваются файлы данных. Но это могут быть и устройства и даже программы. Пример:
cat /var/log/syslog | grep SELinux
в этой команде программа grep объект для программы cat . И соответственно программа cat субъект по отношению к программе grep.

Как включить или выключить SELinux

Включение или выключение SELinux выполняется командой selinuxenabled с параметром 1 (включить SELinux) или 0 (выключить SELinux). Если нужно чтобы SELinux был включен/выключен при запуске системы, тогда редактировать файл /etc/selinux/config (параметр SELinux=disable).

Режимы работы SELinux

Permissive - разрешается нарушение политики безопасности. Такие нарушения только регистрируются в системном журнале. То есть по сути SELinux не работает, а только лишь фиксирует нарушения политики безопасности.

Enforced - нарушения политики безопасности блокируются. SELinux работает полностью.

Переключение режимов работы выполняется командой setenforce с параметром 1 (включить enforced) или 0 (включить permissive). Но если нужно чтобы режим работы устанавливался сразу при загрузке системы, тогда редактировать файл /etc/selinux/config (параметр SELinux=) который может принимать одно из трех значений - permissive, enforced, disable (SELinux отключен).

Команда sestatus позволяется узнать текущий режим работы SELinux.

Журналирование SELinux (аудит)

  • настройка auditallow - журналировать события.
  • настройка dontaudit - не журналировать события.

Логика работы:

  • если операция allow, то она журналируется лишь в случае auditallow;
  • если операция disallow, то она НЕ журналируется лишь в случае dontaudit.

Контекст безопасности (метка, label) SELinux

Это набор данных состоящий из:

  1. типа пользователя
  2. типа данных или домена процесса
  3. уровней и категорий (используется только в специальных политиках MLS/MCS, в общих политиках эти значения установлены в полный доступ)

Контекст безопасности записывается в атрибуты файла (в файловой системе) и создается при установке SELinux (операция labeling). Уже присвоенный контекст безопасности может быть впоследствии изменен - операция transition.

Если файловая система не поддерживает запись меток SELinux (как например NFS), тогда метки записываются отдельно от файлов, при этом связь между файлами и метками происходит по путям файлов. Это может привести к "разрыву" между файлом и его меткой в том случае если файл будет перемещен по другому пути (например каталог с такими файлами будет перемонтирован в другую точку монтирования).

Метка файла может оказаться неверной даже в случае если файловая система поддерживает запись таких меток, но к файлу были неправильно применены операции копирования или перемещения внутри файловой системы. Например при копировании в другую папку файл может получить метку установленную для этой папки (наследование меток), вместо той метки, которая у него была раньше. Поэтому важно правильно выполнять операции копирования и перемещения файлов при использовании SELinux.

Узнать контексты SELinux можно используя стандартные команды с ключом -Z:

  • ps -eZ [| gerp имя_программы] : контекст SELinux для работающих программ (или для конкретной программы).
  • ls -Z : контекст SELinux для файлов.
  • id -Z : контекст SELinux для текущего пользователя.

Пользователь SELinux

Это описательный тип пользователя, а не какой-то конкретный пользователь с логином и паролем. Принципиально это то же самое что и группа пользователей в "старой" системе безопасности DAC. При добавлении, в систему, каждого нового пользователя он по умолчанию (или явным образом) сопоставляется с каким-либо типом пользователя SELinux и в дальнейшем будет иметь те разрешения или запреты, которые указаны для его типа пользователя.

Роль

Перечень разрешенных действий. Возможен переход из одной роли в другую, для изменения полномочий. При этом идентичность пользователя не изменяется (в отличии от команд su/sudo). Роли не совмещаются, они заменяют одна другую.

Политика безопасности определяет допустимые переходы из одной роли в другую. То есть невозможно перейти из любой роли в любую роль. Поскольку роли всегда связаны с типами (доменами), то часто говорят не о смене ролей, а о смене домена (Domain Transition).

Типы (домены) SELinux

Также известны как SELinux sandbox. Объединяют субъекты и объекты в группы, внутри этих групп определяют разрешенные действия субъектов над объектами. Для субъектов вместо термина тип используется термин домен.
Упрощенно можно сказать так:
тип SELinux - для данных;
домен SELinux - для процессов.
В SELinux, в общих политиках, используется механизм принудительного присвоения типов - Type Enforcement. То есть каждый объект и субъект должен быть обязательно приведен к какому-либо типу (или домену).

Политика SELinux (SELinux Policy)

Совокупность всех описанных в системе соотношений пользователь - роль - тип (домен) - уровень и категория. Все типы пользователей, все роли, все типы/домены. Используется два типа политик:

  • Type Enforcment (TE) - Roles Based Access Control (RBAC). Targeted и strict - наиболее широко используемые TE - RBAC политики SELinux.
  • Bell-La Padula Model Multi-Level Security (MLS) - Multi-Category Security (MCS).

Политика targeted - все процессы не внесенные в специальные ограниченные домены, работают в неограниченном домене unconfined_t. Таким образом осуществляется возможность выполнения процессов которые еще не описаны в политике. Но такие процессы фактически выполняются почти с административными правами. В этом слабое место политики targeted .

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

Политика MLS/MCS

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

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

Однако, логика тут есть, просто она другая. Если субъект, имеющий уровень "секретно", запишет данные в файл с уровнем "несекретно" то этот файл станет (потенциально) содержать данные уровня "секретно", но при этом будет доступен субъектам уровня "несекретно". То есть станет возможна утечка информации. Поэтому в MLS запись в файлы разрешена только с нижних уровней на верхние.

Эту особенность нужно понимать при присвоении меток уровней доступа.

Помимо уровней, доступ дополнительно регулируется категориями. Субъект не имеющий права доступа к категории "ВМС", не может получить доступ к данным которые имеют метку этой категории. Даже если этот субъект имеет самый высокий уровень доступа.
В контексте SELinux запись об уровнях и категориях выглядит так: "s0-s0:c0.c1023 " где "s0-s0 " допустимые уровни, а "c0.c1023 " допустимые категории. Конкретно такая запись - "s0-s0:c0.c1023 " означает высший уровень доступа к любой категории объектов.

Эта часть контекста используется только в специальных политиках MLS/MCS. В общих политиках типа targeted или strict эта часть контекста просто установлена в максимальный уровень разрешений и таким образом не влияет на доступ.

Резюме

Максимальную защиту SELinux дает когда переключен в режим enforced и при этом используется политика strict или политика MLS/MCS.

Если SELinux работает в режиме permissive, то фактически никакой защиты нет - только лишь фиксируются нарушения текущей политики.

Если SELinux переключен в режим enforced, но используется политика targeted, то защита осуществляется только применительно к "известным" программам, для которых в политике определены разрешения и запреты. "Неизвестная" программа фактически имеет административные привилегии.

Если вы живете в г. Краснодар, для вас есть простой способ установить SELinux и научиться им пользоваться.

Если вам оказалась полезна или просто понравилась эта статья, тогда не стесняйтесь - поддержите материально автора. Это легко сделать закинув денежек на Яндекс Кошелек № 410011416229354 . Или на телефон +7 918-16-26-331 .

Даже небольшая сумма может помочь написанию новых статей:)

Сопутствующие статьи

О SELinux на Хабре уже писали, однако, не так много опубликовано подробных мануалов по данной системе. Сегодня мы публикуем именно такой, подробный мануал по SELinux, начиная от информации по системе, и заканчивая гибкой настройкой политик.
Для того, чтобы не превращать пост в «простыню», сложную для понимания, мы решили разделить мануал на две части. Первая будет рассказывать о самой системе, и некоторых ее особенностях. Вторая – о настройке политик. Сейчас публикуем первую часть, чуть позже будет опубликована и вторая часть.

1. Введение

SELinux (SELinux) - это система принудительного контроля доступа, реализованная на уровне ядра. Впервые эта система появилась в четвертой версии CentOS, а в 5 и 6 версии реализация была существенно дополнена и улучшена. Эти улучшения позволили SELinux стать универсальной системой, способной эффективно решать массу актуальных задач. Стоит помнить, что классическая система прав Unix применяется первой, и управление перейдет к SELinux только в том случае, если эта первичная проверка будет успешно пройдена.

1.1 Некоторые актуальные задачи.

Для того, чтобы понять, в чем состоит практическая ценность SELinux, рассмотрим несколько примеров, когда стандартная система контроля доступа недостаточна. Если SELinux отключен, то вам доступна только классическая дискреционная система контроля доступа, которая включает в себя DAC (избирательное управление доступом) или ACL(списки контроля доступа). То есть речь идет о манипулировании правами на запись, чтение и исполнение на уровне пользователей и групп пользователей, чего в некоторых случаях может быть совершенно недостаточно. Например:

- Администратор не может в полной мере контролировать действия пользователя. Например, пользователь вполне способен дать всем остальным пользователям права на чтение собственных конфиденциальных файлов, таких как ключи SSH.

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

Процессы наследуют права пользователя, который их запустил. Например, зараженная трояном версия браузера Firefox в состоянии читать SSH-ключи пользователя, хотя не имеет для того никаких оснований.

По сути, в традиционной модели избирательного управления доступом (DAC), хорошо реализованы только два уровня доступа - пользователь и суперпользователь. Нет простого метода, который позволил бы устанавливать для каждого пользователя необходимый минимум привилегий.
Конечно, есть множество методов обхода этих проблем в рамках классической модели безопасности, но ни один из них не является универсальным.

1.1.1 Основные термины, использующиеся в SELinux:

Домен - список действий, которые может выполнять процесс. Обычно в качестве домена определяется минимально-возможный набор действий, при помощи которых процесс способен функционировать. Таким образом, если процесс дискредитирован, злоумышленнику не удастся нанести большого вреда.

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

Тип - набор действий, которые допустимы по отношения к объекту. Тип отличается от домена тем, что он может применяться к пайпам, каталогам и файлам, в то время как домен применяется к процессам.

Контекст безопасности - все атрибуты SELinux - роли, типы и домены.

1.2 Решение проблем традиционной модели безопасности.

SELinux следует модели минимально необходимых привилегий для каждого сервиса, пользователя и программы намного более строго. По умолчанию установлен «запретительный режим», когда каждый элемент системы имеет только те права, которые жизненно необходимы ему для функционирования. Если же пользователь, программа или сервис пытаются изменить файл или получить доступ к ресурсу, который явно не необходим для решения их, то им будет просто отказано в доступе, а такая попытка будет зарегистрирована в журнале.

SELinux реализована на уровне ядра, так что прикладные приложения могут совсем ничего не знать о версии этой системы принудительного контроля доступа, особенностях её работы и т.д. В случае грамотной настройки, SELinux никак не повлияет на функционирование сторонних программ и сервисов. Хотя, если приложение способно перехватывать сообщения об ошибках этой системы контроля доступа, удобство пользования таки приложением существенно возрастает. Ведь в случае попытки доступа к защищенному ресурсу или файлу, SELinux передает в основное приложение ошибку из семейства «access denied». Но лишь немногие приложения используют получаемые от SELinux коды возврата системных вызовов.

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

- Создание и настройка списка программ, которые могут читать ssh-ключи.

Предотвращение несанкционированного доступа к данным через mail-клиент.

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

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

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

Enforcing : Режим по-умолчанию. При выборе этого режима все действия, которые каким-то образом нарушают текущую политику безопасности, будут блокироваться, а попытка нарушения будет зафиксирована в журнале.

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

Disabled : Полное отключение системы принудительного контроля доступа.

Вы можете посмотреть текущий режим и другие настройки SELinux (а в случае необходимости и изменить его) при помощи специального GUI-инструмента, доступного в меню «Администрирование» (system-config-selinux). Если же вы привыкли работать в консоли, то можете посмотреть текущий статус командой sestatus.

# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 21 Policy from config file: targeted

Также вы можете узнать статус SELinux при помощи команды getenforce.
Команда «setenforce» позволяет быстро переключаться между режимами Enforcing и Permissive, изменения вступают в силу без перезагрузки. Но если вы включаете или отключаете SELinux, требуется перезагрузка, ведь нужно заново устанавливать метки безопасности в файловой системе.
Для того, чтобы выбрать режим по-умолчанию, который будет применяться при каждой загрузке системы, задайте значение строки "SELINUX=" в файле /etc/selinux/config, задав один из режимов - "enforcing", "permissive" или "disabled". Например: "SELINUX=permissive".

3. Политики SELinux

Как отмечалось ранее, SELinux по-умолчанию работает в режиме Enforcing, когда любые действия, кроме разрешенных, автоматически блокируются, каждая программа, пользователь или сервис обладают только теми привилегиями, которые необходимы им для функционирования, но не более того. Это довольно жесткая политика, которая обладает как плюсами - наибольший уровень информационной безопасности, так и минусами - конфигурирование системы в таком режиме сопряжено с большими трудозатратами системных администраторов, к тому же, велик риск того, что пользователи столкнутся с ограничением доступа, если захотят использовать систему хоть сколько-нибудь нетривиальным образом. Такой подход допустим в Enterprise-секторе, но неприемлем на компьютерах конечных пользователей. Многие администраторы просто отключают SELinux на рабочих станциях, чтобы не сталкиваться с подобными проблемами.

Для того, чтобы избежать этого, для ключевых приложений и сервисов, таких как, например, httpd, named, dhcpd, mysqld, определены заранее сконфигурированные целевые политики, которые не позволят получить злоумышленнику доступ к важным данным. Те же приложения, для которых политика не определена, выполняются в домене unconfined_t и не защищаются SELinux. Таким образом, правильно выбранные целевые политики позволяют добиться приемлемого уровня безопасности, не создав при этом для пользователя лишних проблем.

4. Контроль доступа в SELinux

SELinux предоставляет следующие модели управления доступом:

Type Enforcement (TE): основной механизм контроля доступа, используемый в целевых политиках. Позволяет детально, на самом низком уровне управлять разрешениями. Самый гибкий, но и самый трудоемкий для системного администратора механизм.

Role-Based Access Control (RBAC): в этой модели права доступа реализуются в качестве ролей. Ролью называется разрешения на выполнение определенных действий одним или несколькими элементами системы над другими частями системы. По-сути, RBAC является дальнейшим развитием TE.

Multi-Level Security (MLS): многоуровневая модель безопасности, в которой всем объектам системы присваивается определенный уровень доступа. Разрешение или запрет доступа определяется только соотношением этих уровней.

Все процессы и файлы в рамках SELinux имеют контекст безопасности.
Давайте посмотрим на контекст на практике, подробно рассмотрев стартовую страницу веб-сервера Apache, находящуюся по адресу /var/www/html/index.html

$ ls -Z /var/www/html/index.html -rw-r--r-- username username system_u:object_r:httpd_sys_content_t /var/www/html/index.html

В дополнение к стандартным правам доступа к файлу, мы можем видеть контекст безопасности SELinux: system_u: object_r: httpd_sys_content_t.

Контекст базируется на user:role:type:mls, но поля user:role:type отображаются, в то время как поле mls скрыто. Также мы можем видеть целевую политику, в данном случае httpd_sys_content_t.

Теперь рассмотрим контекст безопасности SELinux для процесса "httpd" (веб-сервер Apache):

$ ps axZ | grep httpd system_u:system_r:httpd_t 3234 ? Ss 0:00 /usr/sbin/httpd

Как мы видим, этот процесс запущен на домене httpd_t.

Ну а теперь давайте посмотрим на контекст безопасности файла в нашем домашнем каталоге:

$ ls -Z /home/username/myfile.txt -rw-r--r-- username username user_u:object_r:user_home_t /home/username/myfile.txt

Мы видим, что файл имеет тип user_home_t, этот тип присваивается по умолчанию всем файлам в домашнем каталоге.
Доступ разрешен только между элементами с одинаковым типом, именно поэтому веб-сервер Apache может без проблем читать файл /var/www/html/index.html, который имеет тип httpd_sys_content_t. В то же самое время, так как Apache запущен на домене httpd_t и не имеет заполненных полей userid:username, он не может получить доступ к файлу home/username/myfile.txt, хотя этот файл доступен для чтения процессам, для которых не определена целевая политика. Таким образом, если веб-сервер Apache будет взломан, то злоумышленник не сможет получить доступ к файлам или запускать процессы, которые не находятся в домене httpd_t.

5. Устранение проблем SELinux

Рано или поздно происходит ситуация, когда вы сталкиваетесь с ситуацией, когда SELinux запрещает вам доступ к чему-то. Есть несколько основных причин отказа доступа:

Неправильно маркированный файл.
- Процесс работает в неправильном контексте
- Ошибка в политике. Процесс требует доступ к файлу, который не был учтен при создании политики.
- Попытка вторжения.

Первые три причины отказа доступа разрешаются достаточно легко, в то время как во время попытки вторжения звучит сигнал тревоги и пользователю посылается соответствующее уведомление.
Для того, чтобы разобраться с любой проблемой, достаточно просмотреть журнал SELinux. По умолчанию он записывается процессом auditd в файл /var/log/audit/audit.log. Если этот процесс не запущен, то SELinux ведет журнал в файле /var/log/messages, в этом случае все сообщения системы контроля доступа маркируются ключом AVC, что позволяет быстро отфильтровать нужные строки, например. при помощи команды grep.
В последние версии дистрибутивов (начиная с CentOS 5), включена утилита с графическим интерфейсом пользователя, которая позволяет отображать журнал SELinux в удобном и понятном для пользователя виде. Вызвать её можно из консоли, набрав sealert -b. Утилита входит в состав пакета setroubleshoot. В том случае, если X-сервер не запущен, вы можете сгенерировать понятные и удобные для человека отчеты следующей командой:

Sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt

5.1 Изменение меток контекста безопасности файлов.

Команда «chcon» позволяет изменяет контекст SELinux для файлов или каталогов точно таким же образом, как команды «chown» и «chmod» позволяют менять владельца файла или права доступа к нему в рамках стандартной системы контроля доступа.

Рассмотрим несколько примеров.
Предположим, что в системе установлен веб-сервер Apache и нам необходимо изменить папку, в которой хранятся сайты (по-умолчанию это /var/www/html/) на, допустим, /html/ и создать в этом каталоге файл index.html.
# mkdir /html # touch /html/index.html # ls -Z /html/index.html -rw-r--r-- root root user_u:object_r:default_t /html/index.html # ls -Z | grep html drwxr-xr-x root root user_u:object_r:default_t html

Выше мы видим, что и каталог /html, и файл /html/index.html в рамках контекста безопасности имеют тип default_t. Это означает, что если мы запустим Apache и попробуем начать работать с этим каталогом или файлом, то SELinux откажет нам в доступе. И это будет абсолютно правильно, ведь правильный контекст безопасности для файлов, взаимодействующих с Apache, это httpd_sys_content_t.
Изменим контекст и проверим правильно ли все сделано:

# chcon -v --type=httpd_sys_content_t /html context of /html changed to user_u:object_r:httpd_sys_content_t # chcon -v --type=httpd_sys_content_t /html/index.html context of /html/index.html changed to user_u:object_r:httpd_sys_content_t # ls -Z /html/index.html -rw-r--r-- root root user_u:object_r:httpd_sys_content_t /html/index.html # ls -Z | grep html drwxr-xr-x root root user_u:object_r:httpd_sys_content_t html
Не обязательно вручную обрабатывать каждый файл и каждый каталог, можно просто воспользоваться опцией рекурсивного обхода каталога -R:

# chcon -Rv --type=httpd_sys_content_t /html

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

Для того, чтобы SELinux корректно работал даже после изменения меток файловых систем, мы можем использовать как инструменты для управления SELinux c GUI-интерфейсом, так и консольную утилиту semanage:

Semanage fcontext -a -t httpd_sys_content_t "/html(/.*)?"

В примере выше мы присвоили контекст httpd_sys_content_t всем файлам, находящимся в катологе /html.

5.2 Восстановление контекста безопасности SELinux.

Команда «restorecon» позволяет изменить контекст безопасности на тот, который был присвоен по-умолчанию.
Снова используем в качестве примера веб-сервер Apache. Предположим, что пользователь отредактировал в своем домашнем каталоге копию файла index.html и переместил (командой mv) его в каталог, в котором храняться сайты (/var/www/html).

Следует обратить внимание, что при копировании (команда cp) контекст безопасности файла будет совпадать с контекстом каталога назначения, при перемещении же, контекст безопасности будет совпадать с контекстом источника. Конечно, мы могли бы использовать команду chcon для изменения контекста безопасности, но так как перемещенные файлы находятся сейчас в каталоге /var/www/html, мы можем просто восстановить параметры контекста для всех файлов, находящихся в этом каталоге.

Для того, чтобы восстановить контекст только для файла index.html, мы можем применить команду:

# restorecon -v /var/www/html/index.html

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

# restorecon -Rv /var/www/html

5.3 Изменение меток для всей файловой системы.

Иногда бывает необходимо заново устанавливать метки безопасности во всей файловой системе. Чаще всего такую операцию производят при повторном включении SELinux, после того, как система была на некоторое время отключена. Также это бывает нужно, если мы меняем тип управления политиками на strict (в этом случае все процессы работают в своих специальных доменах, в домене unconfined_t не может работать никто).

Для того, чтобы автоматически переразметить файловую систему при следующей перезагрузке, введите следующие команды:
# touch /.autorelabel # reboot
Иногда автоматическая переразметка не срабатывает (чаще всего в тех случаях, когда дистрибутив с выключенной системой SELinux был обновлен). В таком случае воспользуйтесь следующей командой:

# genhomedircon # touch /.autorelabel # reboot

5.4 Предоставление доступа к портам.

Нередко мы хотим, чтобы сервисы, подобные Apache, имели возможность прослушивать нестандартные порты и принимать на них входящие соединения. Базовые политики SELinux позволяют получить доступ только к заранее предопределенным портам, которые жестко связаны с тем или иным сервисом. Допустим, мы хотим, чтобы Apache прослушивал 81 порт. В таком случае, нам надо добавить правило при помощи команды semanage:

# semanage port -a -t http_port_t -p tcp 81

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

# semanage port -l

В следующей, второй части мануала, мы покажем возможность гибкой настройки политик системы.