Защита Linux-сервера с SELinux и AppArmor: внедрение MAC-политик

Сервисы падают после включения ограничений, а доступы приходится выдавать вручную? Мы настраиваем SELinux и AppArmor под ключ: проводим аудит, внедряем политики и передаём документацию. Ваши сервисы работают стабильно, а поверхность атаки сокращается.
Часто задаваемые вопросы

Настройка SELinux: сервисы падают после включения ограничений

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

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

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

Цена такой картины — не один простой, а постепенная деградация. Администраторы либо отключают мандатный доступ целиком, возвращая исходный уровень риска, либо добавляют разрешения наугад. Через месяц уже никто не объяснит, зачем выдано очередное правило, и диагностика политик превращается в археологию.

Порядок работ здесь обратный привычному: сначала аудит запретов — что и к какому объекту не получило доступ, какие метки реально стоят на файлах и портах, — и только потом правки политики. Разбираем, как это закрывается.

Измеримый эффект: что меняется после внедрения MAC-политик

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

Поверхность атаки сокращается

Разграничение прав уезжает на уровень ядра: сервис видит только свои каталоги, порты и сокеты, остальное для него не существует. Процесс с захваченным веб-приложением больше не читает чужие конфигурации и не пишет в системные каталоги. Класс сценариев «вошли через сервис — закрепились на хосте» перестаёт работать на этом шаге.

Время реакции на инцидент сокращается

Раньше разбор начинался с вопроса «что вообще произошло»: сверяли права, историю изменений, открытые порты. Теперь запрет фиксируется в журнале с именем процесса, путём и типом операции — точка входа и виновник видны сразу. Расследование укладывается в один проход по журналу, без полного сбора событий со всего хоста.

Предсказуемость сервисов

Политика перечисляет штатный набор операций, поэтому сервис ведёт себя одинаково на стенде и на боевом контуре: после обновления он не получает случайно расширенных прав. Отклонения от разрешённого набора видны явно, а не всплывают через недели в виде странных ошибок.

Ушедший класс отказов

Запуск от чужой учётной записи, унаследованные права после ручной правки, скрипт из постороннего каталога — эти ситуации закрываются политикой до их появления. Чек-лист приёмки релиза сокращается: часть гарантий даёт ядро, а не регламент.

Режимы защиты и способы настройки: сравнение вариантов

Выбор режима определяет, что произойдёт при отклонении процесса от разрешённого поведения: событие попадёт только в журнал или операция будет заблокирована. Для SELinux настройка начинается с этого решения — от него зависит порядок внедрения и объём разбора срабатываний.

Что выбрать

Вариант Когда подходит Ограничения
Мягкий режим наблюдения Первый прогон правил на боевом узле, инвентаризация обращений Ничего не блокирует: нарушения копятся в журнале, защиты как таковой пока нет
Принудительный режим Сервисы с устойчивым набором операций, публичные узлы Ложные срабатывания после обновления приложений — нужен разбор и правка правил
Профили отдельных приложений Один-два сервиса с известным поведением, изоляция процесса Покрывают только свой процесс, остальные живут вне мандатных ограничений
Полный отказ от мандатного контроля Узкие задачи, где сопровождение политики дороже риска Разграничение сводится к обычным правам файловой системы

Рабочий порядок — начать в мягком режиме наблюдения, собрать журнал за полный цикл работы сервиса вместе с обновлениями, затем перевести узел в принудительный режим. Исключения оставляют только там, где поведение процесса разобрано: необъяснённое правило обнуляет смысл политики доступа.

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

Порядок внедрения политик: от аудита до передачи

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

  1. Инвентаризация и аудит конфигурации. Фиксируем списки служб, слушающих порты, их каталоги данных, сокеты, каталоги обмена и точки монтирования. Отдельно отмечаем, где уже стоят локальные послабления — их придётся пересобрать.
  2. Режим наблюдения. Переводим контур в щадящий режим, когда нарушения только логируются, а не блокируются, и держим его не меньше полного цикла: суточные задания, ротация журналов, обновление пакетов, ночная выгрузка.
  3. Сбор и разбор срабатываний. Записи аудита группируем по процессу и типу доступа, отделяем штатное поведение от реальных выходов за профиль. На этом шаге видно, какие службы придётся описать точнее, а какие пишут в неожиданные места.
  4. Оформление правил. Свой модуль на каждый сервис вместо одного общего: при обновлении службы пересобирается только её профиль, а не весь контур. Послабления описываем точечно, с привязкой к пути и метке.
  5. Проверка на копии контура. Поднимаем слепок, включаем блокировку и прогоняем регресс: запуск, миграции, резервное копирование, переключение при отказе узла.
  6. Ввод в эксплуатацию. Включаем по группам служб, с окном наблюдения после каждой группы и готовым возвратом в щадящий режим.
  7. Передача. Политики и регламент их обновления уходят в репозиторий: схемы зависимостей, журнал послаблений, порядок действий при добавлении новой службы.

Настройка SELinux: конфигурации, политики, документация

Результат внедрения — не только работающий сервер, но и комплект, по которому ваша команда сопровождает политику без нас. Ниже — перечень того, что остаётся на руках после сдачи.

  • Файлы конфигурации — снятое с рабочего сервера состояние главного конфига и параметров загрузки, с пометками, какие значения обязательны, а какие допустимо менять.
  • Модули политик — исходники и собранные модули под каждый сервис, с комментарием, за что отвечает домен и почему правило сформулировано именно так.
  • Схема потоков доступа — карта: какой процесс в каком домене работает, к каким типам файлов и сетевым портам обращается, где стоит запрет.
  • Регламент изменений — последовательность: собрать отчёт о блокировках на тестовом контуре, сформировать модуль, проверить и только потом выкатить на боевой.
  • Инструкции для дежурной смены — что искать в журнале аудита, как отличить ложную блокировку от попытки эксплуатации и как точечно ослабить правило, не снимая защиту целиком.
  • Процедура отката — снимок конфигурации и политик до изменений плюс порядок возврата, если обновление сервиса ломает существующие правила.
  • Карта покрытия — список сервисов под политикой, список в работе и явно указанное, что осознанно оставлено без ограничений и почему.

Кейс: сервис перестал падать после включения ограничений

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

Что показывали метрики до

Доля простоев держалась на уровне нескольких часов в квартал: средний эпизод — около 50 минут, восстановление занимало от 40 минут, потому что инженер вручную сопоставлял записи ядра с конфигурацией. Открытых разрешающих правил накопилось больше двухсот — половину добавляли «на всякий случай» при очередном сбое. Повторные инциденты возвращались каждые две-три недели, и правки их число не уменьшали.

Что изменили и что получили

Мы пересобрали политику с нуля: оставили только разрешения, подтверждённые трассировкой рабочих сценариев, и переводили домены в режим принуждения по одному. Число открытых правил сократилось примерно до сорока, каждое описано и привязано к конкретному процессу или каталогу. Время восстановления после сбоя упало до нескольких минут: раскладка политики читается человеком, а не только ядром.

За два квартала наблюдения повторных инцидентов не было ни одного, а доля простоев сократилась в разы. Профиль AppArmor на втором хосте собрали по той же схеме — от трассировки реальных вызовов, а не от запрета всего подряд.

Чем отличается мягкий режим от принудительного

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

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

Журнал срабатываний — единственный надёжный источник для перехода между режимами. Оттуда вытаскиваются отказы с указанием домена, целевого типа и класса объекта: по ним видно, какой процесс стучится не туда, а где политика просто слишком узкая. Сначала отделяют ложные срабатывания от настоящих запретов, снимают лишние ограничения, проверяют результат на тестовом контуре — и только потом включают принуждение.

Безопасный переход делают поэтапно: общий режим оставляют наблюдательным, а в принуждение переводят по одному домену или службе. Если после включения сервис не поднимается, возврат в наблюдение занимает секунды и не требует перезагрузки — отказ получает только конкретный домен, а не весь узел. Принудительный режим оправдан тогда, когда журнал чист от неожиданных срабатываний и есть отрепетированный регламент откатa.

Частые технические сомнения перед внедрением политик

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

Нестандартное приложение не заработает под enforcing — что тогда?

Сначала узел переводится в режим permissive: политики применяются, но не блокируют, а все отказы попадают в журнал с метками процессов и файлов. Инженер разбирает их и описывает локальный модуль или правила для нужных путей и типов — правки точечные, а не «разрешить всё». В enforcing переводим отдельно взятый сервис, а не машину целиком, чтобы не тянуть за собой остальные.

Что будет при обновлении системы и приложений?

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

Нужен ли простой и насколько длинный?

На большинстве сервисов простой не требуется: развёртывание политик и сбор отказов идут на работающей системе в permissive. Короткая остановка возможна только на переключении в enforcing у сервисов, которые нельзя перезапускать на лету, — окно согласуем заранее и держим его в пределах одного цикла обслуживания.

Кто поддерживает политики после передачи?

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

Какие риски остаются и как откатиться?

Слишком узкая политика ломает работу при редком сценарии, слишком широкая — не даёт защиты; баланс проверяем на стенде, а не на бою. Возврат в permissive — одна команда, узел продолжает обслуживать нагрузку. Отдельно фиксируем состояния до внедрения, чтобы откат занимал минуты, а не часы разбора.

Обсудим задачу и вернёмся с оценкой и планом работ

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

  • Состав сервисов и узлов: какие приложения работают, под какими учётными записями, какие каталоги, порты и сокеты им действительно нужны.
  • Схема контура: где проходят границы между периметром, приложением и данными, какие узлы обмениваются трафиком.
  • Текущее состояние защиты: включён ли режим ограничения прав или пока только режим аудита, какие профили уже применены, что дописано руками.
  • Ограничения и запреты: что нельзя менять — порядок обновления, допустимое время простоя, окна работ, требования к доступности.
  • Цели по доступам: кому и к каким данным нужно ходить, какие операции должны быть разрешены, а какие заблокированы безусловно.
  • Роли и автоматизация: кто из сотрудников что обслуживает, какие задачи выполняются скриптами и от чьего имени.
  • Логи и оповещения: куда собираются события, есть ли контроль блокировок и падений служб после смены политики.

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

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139