Я працюю над проектом, який реалізує розподілене моделювання: довільний код виконується на декількох вузлах, а результати згодом збираються та агрегуються.
Кожен вузол є екземпляром віртуальної машини Ubuntu Linux і запускає головний процес, який піклується про переадресацію коду для виконання декількох робочих процесів (1 для кожного ядра).
Це питання стосується того, як переконатися, що кожен працівник працює в пісочному середовищі, не вдаючись до використання екземпляра віртуальної машини для кожного з них. Точні вимоги до працівників:
- fs : відсутність дозволу на запис, дозвіл лише для читання, обмежений однією каталогом (і підпапками)
- нетто : дозволено лише локальну комунікацію (IPC, TCP, що б там не було ...)
- mem : обмеження на використання пам’яті (без заміни пам’яті) вбивати, якщо перевищити мему пам’яті
- CPU : дозволено лише 1 ядро, вбивати, якщо з часом
Ніяких інших обмежень не повинно встановлюватися: працівник повинен мати можливість завантажувати динамічні бібліотеки (з папки лише для читання), породити нові потоки або процеси, функціонувати в системі виклику, ecc ecc, але обмеження повинні бути успадковані породженими / завантаженими об'єктами та слід застосовувати підсумковий спосіб (наприклад, у нас не може бути робочого породжено двох потоків, що використовують 800 Мб, кожен обмеження пам'яті для такого працівника становить 1 ГБ).
Само собою зрозуміло, що працівникові не повинно бути способом підвищити свої права.
Я витратив чималий час на перегляд доступних альтернатив (SELinux, AppArmor, cgroups, ulimit, простори імен Linux, LXC, Docker, ...) для найпростішого рішення, яке задовольняє мої вимоги, але мій досвід у цій галузі обмежений.
Сучасне розуміння: LXC і Docker трохи важкі для мого випадку використання і не є повністю безпечними 1 . AppArmor переважніший для SELinux через простішу конфігурацію, використовуйте його для обмежень fs та net; cgroups переважніше для ulimit (який працює на єдиному процесі), використовував його для обмежень mem та cpu.
Це найпростіший спосіб досягти своєї мети? Чи можу я використовувати виключно AppArmor або групи? Чи є в моїй моделі явний отвір безпеки? У керівництві має бути "працівник, котрий має право збити себе, але нічого іншого" .