Ich arbeite an einem Projekt, das verteilte Simulationen implementiert: Beliebiger Code wird auf mehreren Knoten ausgeführt und die Ergebnisse werden später gesammelt und aggregiert.
Jeder Knoten ist eine Instanz einer virtuellen Ubuntu Linux-Maschine und führt einen Master-Prozess aus, der den auszuführenden Code an eine Reihe von Worker-Prozessen weiterleitet (1 für jeden Kern).
Bei dieser Frage geht es darum, wie sichergestellt werden kann, dass jeder Mitarbeiter in einer Sandkastenumgebung arbeitet, ohne dass für jeden von ihnen eine Instanz einer virtuellen Maschine verwendet wird. Die genauen Anforderungen an die Arbeiter sind:
- fs : keine Schreibberechtigung, nur Leseberechtigung für ein einziges Verzeichnis (und Unterordner)
- net : nur lokale Kommunikation erlaubt (IPC, TCP, was auch immer ...)
- mem : Begrenzung der Speichernutzung (kein Auslagerungsspeicher) kill, wenn das mem-Limit überschritten wird
- cpu : nur 1 core erlaubt, kill wenn über zeitlimit
Es sollten keine weiteren Einschränkungen auferlegt werden: Der Worker sollte in der Lage sein, dynamische Bibliotheken (aus dem schreibgeschützten Ordner) zu laden, neue Threads oder Prozesse zu erzeugen, die Systemfunktion aufzurufen, ecc ecc, aber die Grenzen müssen von den erzeugten / geladenen Entitäten und übernommen werden sollte in Summe angewendet werden (zum Beispiel kann ein Worker nicht zwei Threads erzeugen, die jeweils 800 MB belegen. Dies ist das Speicherlimit für einen solchen Worker von 1 GB).
Es versteht sich von selbst, dass es für den Arbeitnehmer keine Möglichkeit geben sollte, seine Rechte geltend zu machen.
Ich habe viel Zeit darauf verwendet, die verfügbaren Alternativen (SELinux, AppArmor, cgroups, ulimit, Linux-Namespaces, LXC, Docker, ...) zu überprüfen, um die einfachste Lösung zu finden, die meinen Anforderungen entspricht, aber meine Erfahrung auf dem Gebiet ist begrenzt.
Derzeitiges Verständnis: LXC und Docker sind für meinen Anwendungsfall etwas schwierig und nicht ganz sicher 1 . AppArmor ist wegen der einfacheren Konfiguration SELinux vorzuziehen. Verwenden Sie es für fs und Netzbeschränkungen. cgroups, die ulimit vorzuziehen sind (das mit einem einzelnen Prozess arbeitet), haben es für mem- und cpu-Einschränkungen verwendet.
Ist dies der einfachste Weg, um mein Ziel zu erreichen? Kann ich AppArmor oder cgroups ausschließlich verwenden? Gibt es eine offensichtliche Sicherheitslücke in meinem Modell? Die Richtlinie sollte lauten: "Arbeiter dürfen sich selbst stürzen, aber sonst nichts" .