Найпростіший можливий безпечний пісочниці (потрібні обмежені ресурси)


15

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

Кожен вузол є екземпляром віртуальної машини 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 або групи? Чи є в моїй моделі явний отвір безпеки? У керівництві має бути "працівник, котрий має право збити себе, але нічого іншого" .


2
Якщо обмеження [ing] ваших цілей, ви можете зробити набагато краще, ніж гість Ubuntu (або насправді будь-який похідний Debian з цього приводу) . У будь-якому випадку, ви , ймовірно , хочете , призначений для користувача режим Linux і / або (з останніх ядер) імен користувача
mikeserv

2
LXC звучить як саме те, що вам потрібно. Чому ти вважаєш, що це з важкої сторони і невпевнено? (Зрозуміло, у ньому були помилки, але ви можете використати все, що ви могли використовувати.)
Жил "ТАК - перестаньте бути злим"

Пов'язана презентація (правда, з 2011 року) та розділ безпеки документації на Ubuntu LXC, що розповідає про «витоки простору імен», не дуже переконливі. Схоже, LXC, який базується в основному на просторах імен та груп, може бути найкращим варіантом зараз у будь-якому випадку. Я також знайшов Linux-Sandboxing , цікаве читання
StephQ

Може знадобитися трохи переобладнати, але ви думали про те, щоб бігти по в'язницях BSD?
Райдер

Хоча LXC може бути «важким» в тому, що він схожий на купу ВМ, зробити їх дуже просто. Деякі з цих рішень, хоча "легші" можуть вимагати великої конфігурації. З LXC вам, можливо, не знадобиться налаштовувати такі речі, як написання, оскільки в одному додатку буде весь контейнер.
MikeP

Відповіді:


1

Так, ви можете використовувати cgroups та SELinux / AppArmor виключно для контролю та контролю довільного коду, який ви будете виконувати.

З групами ви можете зробити наступне:

  1. Обмежте використання основного процесора на 1 ЦП за допомогою cpusetпідсистеми
  2. Встановіть обмеження на використання пам'яті за допомогою memoryпідсистеми, відстежуючи навіть вилки. Див. Https://github.com/gsauthof/cgmemtime для прикладу.
  3. Забороніть доступ до мережі до всього, що не loмає net_prioпідсистеми.

А за допомогою SELinux / AppArmor ви можете обмежити доступ для читання / запису процесу.

Примітка. Я не знайомий з AppArmor, але це система обов'язкового контролю доступу (MAC), це означає, що захист написання та читання - це його робота.

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

Щасти!


1

Я б відкинув SELinux для AppArmor, тільки якщо я використовував Ubuntu . (насправді досить складно)

LXC не захищений сам по собі Якщо вам потрібна безпека, ви повинні використовувати їх за допомогою libvirt (на основі MLS SELinux ).

Ваша проблема нескінченна, тому не намагайтеся знайти якесь рішення з полиці та без нескінченного часу, пам’ятайте, що навіть kernel.org був завалений, і зовсім недавно ФБР заявило, що хтось використовує їхні системи протягом багатьох років, не виявляючи досі.

Я буду їхати з LXC / libvirt для досить хорошої безпеки або спробую "нові" чіткі контейнери Intel , які використовують дуже легкий VM для вашого контейнера з чітким використанням DAX / KSM (я не перевіряв їх, але вони виглядають дуже справді обіцяючи).

Якщо ви стурбовані експлуатацією ядра, безпека - це ваше рішення, але вам доведеться інтегрувати його зі своїм контейнерним рішенням (головний біль точно).

Тож непросте завдання напевно, LXC / libvirt дійсно акуратний, але, можливо, прозорі контейнери - це шлях.

Докер? Я не / не використовував би докер для більш ніж місцевого тестування, коли не було доступних бродячих коробок, їм потрібна набагато більше роботи та краща громада.

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

Якщо ви хочете чогось "простішого" та більш любительського, ви можете перевірити firejail , я використовую його для деяких настільних "додатків", і це робить роботу (створити шаблон для вашого спеціального додатка досить просто, використовуйте "приватний" встановлюється на вашій парі та обмежує мережу лише для місцевого використання, породжені процеси успадковуються для батьків і продовжуються ...).

Будьте веселі і веселіться, не з глузду. ;)


0

seccomp-bpf - це ще одна опція, яка добре працює для OpenSSH, vsftpd і Chromium, вона має лише вихід (), sigreturn (), read (), він також використовує write (), хоча дозволяє фільтрувати системні виклики за допомогою налаштованих правил Berkeley Packet Filter. Він також може бути використаний спільно з групами для пам'яті, процесора тощо ...

https://wiki.mozilla.org/Security/Sandbox/Seccomp


0

Ви можете заглянути в сіткові обчислювальні системи. Зокрема, BOINC ( http://boinc.berkeley.edu ) перевіряє майже всі ваші скриньки.

Я вважаю, що він працює за вашими параметрами:

fs: може читати / писати у свій каталог, ніде більше

net: може бути налаштовано на доступ лише до мережі до вашого сервера BOINC, але це не за замовчуванням з поля IIRC

mem: так, окремі межі пам’яті для машин, що працюють в режимі очікування та без роботи

CPU: так, навіть можна сказати "не запускати, якщо комп'ютер не працює"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.