Pracuję nad projektem, który implementuje rozproszone symulacje: dowolny kod jest wykonywany na wielu węzłach, a wyniki są później gromadzone i agregowane.
Każdy węzeł jest instancją maszyny wirtualnej Ubuntu Linux i uruchamia proces główny, który dba o przekazanie kodu do wykonania do wielu procesów roboczych (1 dla każdego rdzenia).
To pytanie dotyczy sposobu upewnienia się, że każdy pracownik działa w środowisku piaskownicy bez uciekania się do użycia wystąpienia maszyny wirtualnej dla każdego z nich. Dokładne wymagania dla pracowników to:
- fs : brak uprawnień do zapisu, uprawnienie tylko do odczytu ograniczone do jednego katalogu (i podfolderów)
- net : dozwolona tylko komunikacja lokalna (IPC, TCP, cokolwiek ...)
- mem : ograniczenie wykorzystania pamięci (brak pamięci wymiany) zabij, jeśli przekroczy limit pamięci
- procesor : dozwolony tylko 1 rdzeń, zabij, jeśli z upływem czasu
Nie należy nakładać żadnych innych ograniczeń: pracownik powinien mieć możliwość ładowania bibliotek dynamicznych (z folderu tylko do odczytu), tworzenia nowych wątków lub procesów, wywoływania funkcji systemowej, ecc ecc, ale ograniczenia muszą być dziedziczone przez spawnowane / ładowane jednostki i należy zastosować w sposób sumaryczny (na przykład nie możemy sprawić, by robotnik spawnował dwa wątki, które używają 800 MB każdy to limit pamięci dla takiego pracownika to 1 GB).
Oczywiste jest, że pracownik nie powinien mieć możliwości podniesienia swoich praw.
Sporo czasu poświęciłem na sprawdzenie dostępnych alternatyw (SELinux, AppArmor, cgroups, ulimit, Linux namespaces, LXC, Docker, ...) pod kątem najprostszego rozwiązania, które spełnia moje wymagania, ale moje doświadczenie w tej dziedzinie jest ograniczone.
Obecne zrozumienie: LXC i Docker są trochę ciężkie dla mojego przypadku użycia i nie są całkowicie bezpieczne 1 . AppArmor jest lepszy niż SELinux ze względu na łatwiejszą konfigurację, użyj go do ograniczeń fs i net; cgroups lepiej niż ulimit (który działa na jednym procesie), używał go do ograniczeń mem i cpu.
Czy to najprostszy sposób na osiągnięcie mojego celu? Czy mogę używać wyłącznie AppArmor lub cgroups? Czy w moim modelu jest jakaś dziura w zabezpieczeniach? Wytyczną powinien być „pracownik może sam siebie obalić, ale nic więcej” .