SELinux в CentOS основные моменты

Опубликовано: 3 Апрель, 2015 в разделе: Обучение

Давно хотел разобраться в этой системе контроля доступа, да всё никак руки не доходили. Попробую это исправить. Итак, что же такое SELinux?

SELinux — это система принудительного контроля доступа, работающая на уровне ядра Linux.

Надо сказать, что до этого мы знали две стандартные модели разграничения прав: DAC (избирательное управление доступом) и ACL (списки доступа). Но порой этого оказывается недостаточно. Здесь важно помнить, что политики (а правила здесь называются политиками) проверяются после того, как были проверены DAC и ACL. То есть если запрещен доступ на уровне DAC прав, то до SELinux даже не дойдёт дело.

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

В SELinux имеется три режима работы:

  1. Enforcing — основной режим работы. В этом режиме все действия, которые приводят к нарушению установленных политик логируются и запрещаются.
  2. Permissive — отладочный режим. В этом режиме все действия, которые приводят к нарушению установленных политик так же логируются, но выполняются.
  3. Disabled — SELinux не проверяет политики доступа.

Проверить, в каком режиме работает SELinux достаточно просто. Есть целых две команды: getenforce или sestatus:

Получить статус SELinux

Получить статус SELinux

Установить режим по умолчанию можно в конфиг-файле /etc/selinux/config

Режим SELinux по умолчанию

Режим SELinux по умолчанию

Итак, система под контролем SELinux в режиме Enforced работает в режиме минимальных прав, то есть процессам разрешено делать только необходимый набор функций и ни шагу в сторону. Как правило, такой подход сопряжен и с наименьшим удобством пользователя и администратора, настраивающего систему.

Овчинка стоит выделки только на Enterprise серверах, где безопасность выходит на первое место перед удобством, на пользовательских же машинах эта система может доставлять определенные неудобства. Хотя, смотря как к ней подойти. Для всех популярных сервисов уже заготовлены базовые политики. Политику видно по контексту. Те процессы, для которых политики не определены — выполняются в домене unconfined_t.

Терминология SELinux

Чтобы далее понимать о чём идет речь, необходимо совершенно определенно пояснить несколько моментов:

  • Домен — это список действий, которые может выполнить процесс.
  • Тип — список действий, которые можно выполнить, обращаясь к объекту. Здесь объектом может служить и файл и каталог и поток.
  • Роль — список доменов, которые могут быть использованы.
  • Контекст — полный перечень (домен, тип, роль) какого-либо объекта.

Как контролируется доступ в SELinux

Принято выделять три модели управления доступом:

  1. Type Enforcement (TE) — основной тип. Для каждого объекта контекст настраивается детально.
  2. Role-Based Access Control (RBAC) — расширенный (TE) — здесь права реализуются при помощи так называемых «ролей». На мой взгляд, нечто похожее реализовано в Windows с группами пользователей.
  3. MultiLevel Security (MLS) — многоуровневая модель безопасности. Каждому объекту в системе присваивается некий уровень. В зависимости от соотношения этих уровней и определяется дальнейший результат операции.

Контекст безопасности определяется теми же утилитами, что и права доступа, (ls, ps и т.д.), с использованием ключа -Z.

На прошлом уроке я создавал HTTP-сервер. Посмотрим, какой контекст у индексного файла:

# ls -Z /var/www/linux-my.ru/index.html

Проверяем контекст файла

Проверяем контекст файла

Увидим метки root:object_r:httpd_sys_content_t

Метки контекста приводятся в формате user:role:type:mls, где mls зачастую скрыто.

Чтож, посмотрим, какой контекст у процесса httpd:

# ps axZ | grep httpd

Смотрим контекст процесса

Смотрим контекст процесса

Как видим, у процесса указан домен httpd_t. Это значит, что процесс httpd сможет получить доступ к файлам с типом httpd_sys_content_t. А если вдруг веб-сервер будет сломан, сможет ли злоумышленник получить с помощью него…скажем….файл из домашнего каталога пользователя? Проверим:

Контекст файла в домашнем каталоге

Контекст файла в домашнем каталоге

Здесь тип указан как user_home_t — по умолчанию такой контекст накладывается на все пользовательские файлы. Но это так же означает, что веб-сервер не сможет получить доступ к пользовательским файлам даже на чтение. Даже если у файла будет стоять 777 атрибуты. Это убережет от значительной потери документов, если веб, например, сервер, будет скомпрометирован злоумышленником или неправильно настроен.

Пример блокирования SELinux

Всё хорошо, но как вот проверить настоящую работу этой системы? Для этого я смоделировал ситуацию из предыдущей статьи с веб-сервером. Модифицируем наш виртуальный хост backup.com. Создадим новый каталог:

# mkdir /home/site.ru

И создадим в нём индексный файл:

# echo '<h1>SITE.RU</h1>' > /home/site.ru/index.html

Далее, оформим виртуальный хост:

Виртуальный хост

Виртуальный хост

Само-собой подправим /etc/hosts. Перезагрузим сервер

# service httpd restart

и попытаемся открыть сайт:

Сайт не открывается

Сайт не открывается

Что? Почему тестовая страница? Пойдём в логи, путь к которым указан в виртуальном хосте:

Читаем лог об ошибках apache

Читаем лог об ошибках apache

Первая же запись: Permission denied: access to /index.html denied — доступ запрещён. Хм.. Интересно, чем это? Взглянем на лог аудита:

Лог аудита SELinux

Лог аудита SELinux

Интересующие нас события помечаются типом AVC. Я подчеркнул интересные моменты: доступ запрещен. Файл /home/site.ru/index.html, контекст источника httpd_t, контекст цели: user_home_t. Вот и несовпадение! Естественно, что доступ не был получен. Но не беда.

Контекст файла

Контекст файла

Проверили контекст файла:

# ls -Z /home/site.ru/

Увидели user_home_t. Будем менять его на необходимый (httpd_sys_content_t):

# chcon -v --type=httpd_sys_content_t -R /home/site.ru/

Меняем контекст

Меняем контекст

Теперь пробуем открыть сайт:

Сайт открылся!

Сайт открылся!

Всё получилось! Теперь вы, надеюсь, представляете, как работает SELinux и где искать логи безопасности.

Отключить SELinux

Для отключения SELinux в CentOS много мудрить не надо. Просто переводим его в режим Permissive.

# setenforce 0

или равнозначно

# setenforce Permissive

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.