Перейти до вмісту

Посилила ізоляцію systemd для кожного юніта

Знизила оцінку відкритості (exposure) у пісочниці systemd для кожного юніта, який встановлює платформа: служба dead man's switch — з 9,6 UNSAFE до 1,5, відкритий в інтернет git‑сервер — з 8,3 EXPOSED до 1,5, — і додала перевірку парсером під час converge, після того як знайшла директиву з орфографічною помилкою, яку мовчки ігнорували три шаблони юнітів.

  • Fence, chain link, bokeh lights
    Фото: Pexels / Pixabay
  • Golden eagle, eagle, cage
    Фото: daschorsch / Pixabay

кожен юніт у пісочниці — і друкарська помилка, яку ігнорували

Ситуація. Тринадцять юніт‑файлів встановлював цей репозиторій, і на продакшн‑хості вони працювали з привілеями, які супервізор надає за замовчуванням, тобто майже з усіма. Оцінка захищеності дала службі dead man’s switch 9,6 і назвала її небезпечною; git‑сервер, доступний з інтернету, отримав 8,3 і позначку «відкритий». Обидва числа були точними, і жодне ні до чого не спонукало, бо оцінка без порога — це число, яке люди звикають пропускати.

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

Дія. Обмеження привілеїв додано до кожного шаблону юніта — верхня межа привілеїв на рівні власних привілеїв юніта, фільтр системних викликів, обмежені сімейства адрес і пам’ять, яка може бути записуваною або виконуваною, але ніколи водночас. Виміряні результати: dead man’s switch — з 9,6 до 1,5, git‑сервер — з 8,3 до 1,5, обидва юніти резервного копіювання — з 9,6 до 2,3 і 2,5. Під час роботи над ними знайшлося дещо цінніше за оцінки. Одна директива відтоді, як існують ці ролі, була написана з помилкою у трьох шаблонах юнітів — правдоподібна на вигляд назва, якої не існує; супервізор відповідає на неї записом у журналі, що не розпізнає ключ, і все одно запускає юніт. Пошук директиви через grep доводить лише, що її написали; що вона набула чинності, доводить тільки парсер. Тому тепер окрема роль перевірки під час converge проганяє кожен юніт через вбудований верифікатор супервізора, і її підключає кожна роль, що встановлює юніт. Чого ця перевірка досі не бачить, прямо сказано в тих самих документах: кожна директива, здатна зламати ці юніти, ламає їх під час виконання, а не під час розбору, а оцінка не скаже, чи скрипт досі доходить до останнього рядка.

Результат. Кожен юніт працює з тими привілеями, які йому потрібні, і без зайвих, числа виміряно, а не задекларовано, а клас дефектів, де описка непомітно перетворюється на відсутній засіб контролю, тепер обриває прогін. Межі вимірювання записано поруч із ним, і саме це вбереже наступного читача від надмірної довіри до зеленої зони.

Одна частина довшого переліку — і він увесь на цьому сайті.

Кожен запис написано однаково: ситуація, завдання, що ми зробили і що змінилося.

Переглянути весь перелік