it-swarm.com.de

Docker: Wann sollte Apparmor vs Seccomp vs --cap-Drop verwendet werden?

Docker scheint sowohl Apparmor als auch Seccomp zu unterstützen. Mit Docker können Sie auch Funktionen löschen, wenn Sie einen Container ausführen.

Ich konnte jedoch keine Dokumentation oder Richtlinie finden, wann welcher Ansatz verwendet werden sollte.

Es scheint eine signifikante Überschneidung zu geben, wofür sie verwendet werden können. Ich konnte keine allgemeine Richtlinie darüber finden, wann welche dieser Optionen verwendet werden sollen.

Kann jemand eine Richtlinie geben?

In meinem Fall muss ich viele Schülercodes auf dem Server ausführen. Ich möchte ihnen erlauben, Java und c ++ - Programme auszuführen. Schreibzugriff auf ein Verzeichnis (Datenvolumen) zulassen. Sie benötigen keinen Netzwerkzugriff oder etwas Kompliziertes.

Bitte geben Sie einige Richtlinien zur Sicherung an.

7
JackDaniels

Sie können alle verwenden.

Jedes dieser Sicherheitsmerkmale hat unterschiedliche Zwecke, und es gibt tatsächlich nur geringe Überlappungen. Sie alle reduzieren den Schaden, den ein Prozess verursachen kann, wenn er kompromittiert wurde. Sie sind alle sehr kostengünstig und können verwendet werden, um die Sicherheit von Software erheblich zu verbessern.

Seccomp ist eine Linux-Funktion, mit der ein Userspace-Programm Syscall-Filter einrichten kann. Diese Filter geben an, welche Systemaufrufe zulässig sind und welche Argumente sie haben dürfen. Es ist ein Filter auf sehr niedriger Ebene, der die Angriffsfläche des Kernels reduziert. Zum Beispiel wäre ein Fehler in keyctl(), der es einfachen Aufrufen dieses Systemaufrufs ermöglicht, die Berechtigungen zu erhöhen, nicht unbedingt für privesc in einem Programm verwendbar, das nur eingeschränkten Zugriff auf diesen Aufruf hat.

AppArmor ist ein obligatorisches Zugriffssteuerungsframework, das als LSM (Linux Security Module) fungiert. Es wird verwendet, um den Zugriff eines Subjekts (Programms) auf ein Objekt (Datei, Pfad usw.) auf die Whitelist oder Blacklist zu setzen. AppArmor kann verwendet werden, um einem Programm Lesezugriff auf /etc/passwd Zu ermöglichen, nicht jedoch auf /etc/shadow. Die Richtlinien können auch verwendet werden, um Funktionen einzuschränken oder sogar den Netzwerkzugriff einzuschränken.

Capabilities und Capability Drop ist eine allgemeine Technik, bei der ein privilegierter Prozess eine Teilmenge der Berechtigungen widerruft, mit denen er ausgestattet ist. Ein Root-Prozess kann beispielsweise die zum Löschen von Raw-Verbindungen zum Netzwerk erforderlichen Funktionen oder die zum Umgehen von Standard-UNIX-Dateiberechtigungen (DAC) erforderlichen Funktionen löschen, obwohl er root bleibt. Diese Technik ist nicht sehr feinkörnig, da nur eine begrenzte Anzahl von Funktionen entfernt werden kann. Sie verringert jedoch den Schaden, den ein Programm anrichten kann, wenn es dennoch kompromittiert wurde.

Im Allgemeinen sollten Sie Folgendes wissen:

  • Seccomp verringert die Wahrscheinlichkeit, dass eine Kernel-Sicherheitsanfälligkeit erfolgreich ausgenutzt wird.

  • AppArmor verhindert, dass eine Anwendung auf Dateien zugreift, auf die sie nicht zugreifen sollte.

  • Durch das Ablegen von Funktionen wird der Schaden verringert, den ein gefährdeter privilegierter Prozess anrichten kann.

Siehe auch Wie wird Sandboxing implementiert?

13
forest

Gut beantwortet von @ Forest , aber ich möchte ein paar Vorschläge hinzufügen, die meine Sicht auf Sicherheits-Frameworks und Sicherheitsdesign im Allgemeinen widerspiegeln. Die Durchsetzung von Sicherheit geht einher mit dem Wissen, wovor Sie sich schützen oder zumindest was Sie schützen. All dies muss jedoch mit einer Sicherheitsrichtlinie beginnen. Sobald die Richtlinie formuliert ist, ist die Auswahl einfacher. Betrachten wir einige Fälle, die möglicherweise Ihre Anwendungsfälle widerspiegeln oder nicht. Bevor Sie sie jedoch in Betracht ziehen, kann es hilfreich sein, die verfügbaren Optionen auf Folgendes einzugrenzen:

  1. Wenn Sie das Zielprogramm nicht ändern können , haben Sie nur die Option MAC - Obligatorische Zugriffskontrolle bestenfalls), da Sie nur Folgendes benötigen Geben Sie eine Sicherheitsrichtlinie an, anhand derer ein bestimmtes Programm bewertet wird. Unabhängig vom Programm und der Implementierungssprache, da sich die Sicherheitsebenen des Betriebssystems darum kümmern. Sandkästen sind eine weitere Option, fallen jedoch in Kategorie 3.
  2. Wenn Sie Ihr Programm [neu] schreiben (oder ändern können) : Dann viel Glück, denn Sie können tatsächlich ein sicherheitsbewusstes Programm schreiben, indem Sie es aufrufen bestimmte Sicherheitsgrundelemente, die von einem Framework Ihrer Wahl bereitgestellt werden [mehr unten]. Möglicherweise sind Sie jedoch dadurch eingeschränkt, dass das von Ihnen ausgewählte Framework keine Bindungen in Ihrer Programmiersprache enthält, da die meisten davon auf niedriger Ebene sind. Ist es C, Java, Go oder Javascript (ja, als ob!)? In den meisten Fällen sind Sie möglicherweise allein. Willkommen im Club. Es gibt aber Optionen. Und manchmal dumme.
  3. Es ist dir egal und du willst nur verhindern, dass Dinge in deinem Gesicht explodieren (dh keiner der oben genannten Punkte ist deine Zeit wert): Sandkästen dann? Vielleicht etwas so Dramatisches wie eine VM, oder wenn Sie Lust auf Unbekanntes haben, sind Anwendungscontainer Ihre besten Freunde. Die sicherheitsbewusstesten Köpfe da draußen warnen jedoch davor, dass --- (Container enthalten nicht . Sie profitieren jedoch zumindest von einer gewissen Ressourcenisolation, ohne die Interna Ihrer Programme kennen zu müssen. Unprivilegierte Container werden dringend empfohlen. Ansonsten sind VMs immer noch cool.

Und jetzt die Fälle:

  • Ich möchte ein Programm auf eine Weise ausführen, die immun gegen böswillige Ausbeutung ist: da dies jeden bekannten Angriff bedeutet oder unbekannt, nichts erfüllt garantiert Ihre Anforderungen (jedes Sicherheits-Framework sollte Ihnen dies mitteilen). Wenn Sie Ihr Programm jedoch auf möglichst wenige Systemaufrufe beschränken, wird die Angriffsfläche reduziert, obwohl Sie immer noch von überall angegriffen werden können, selbst wenn dies nur 1% der möglichen Methoden sind. Wenn Sie jedoch Berechtigungen von Anwendungen entfernen, um sie für den Angreifer weniger nützlich zu machen, sind Systemaufruffilter- und Funktionssysteme hilfreich. Seccomp (verfügbar unter Linux), Capsicum (verfügbar unter FreeBSD und bald auch unter Linux) und POSIX-Funktionen sind hier Optionen.
  • Ich möchte meine Programme auf bekanntes/erwartetes Verhalten beschränken: easy (für einfache Programme) - Wenn Sie das Laufzeitverhalten in Bezug auf Dateien oder Kernelobjekte definieren können, dann [~ # ~] mac [~ # ~] Frameworks können Ihnen helfen (AppArmor, SELinux, ...). Sie müssen jedoch auch entscheiden, auf welcher Abstraktionsebene Sie Ihre Richtlinien ausdrücken möchten, damit Präzision und Flexibilität Sie in verschiedene Richtungen führen (sind Pfade präzise genug, sind Inodes für Sie verwaltbar, was ist mit Speichersegmenten? ).
  • Ich muss oft Programme mit erhöhten Rechten ausführen und befürchte, dass dies zu riskant ist: Wir waren alle dort. Das Löschen von Funktionen ist wahrscheinlich die vernünftigste Option. Es ist betriebssystemspezifisch (und alle anderen auch), aber zumindest implementierungsunabhängig, wenn es im Rahmen der Zugriffskontrolle auf einem bestimmten Computer ausgeführt wird (im Gegensatz zum programmgesteuerten Aufrufen der Funktionsschnittstelle, die von den verfügbaren Bindungen in Ihrer Sprache abhängt ).
3
Butshuti