Захист 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, де аналог спостереження — режим скарг: профіль активний і пише спрацювання, але доступ не відсікає.

Сенс проміжного кроку саме в цьому — побачити поведінку системи на живому навантаженні до того, як заборони почнуть діяти.

Журнал спрацювань — єдине надійне джерело для переходу між режимами. Звідти витягуються відмови із зазначенням домену, цільового типу й класу об'єкта: за ними видно, який процес стукає не туди, а де політика просто надто вузька.

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

Безпечний перехід роблять поетапно: загальний режим залишають спостережним, а в примус переводять по одному домену чи службі.

Якщо після ввімкнення сервіс не піднімається, повернення в спостереження займає секунди й не потребує перезавантаження — відмову отримує лише конкретний домен, а не весь вузол.

Примусовий режим виправданий тоді, коли журнал чистий від несподіваних спрацювань і є відрепетируваний регламент відкату.

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

Сумніви тут закономірні: мандатний контроль — це шар, який може заблокувати роботу застосунку там, де звичайні права доступу її пропускали.

Тому впровадження будуємо не як «увімкнути й подивитися», а як керований перехід за вузлами й сервісами зі спостережуваністю на кожному кроці.

Нестандартний застосунок не запрацює під 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