AppArmor-Profile in Docker / LXC

11

Ich habe einen Docker-Container (LXC), auf dem MySQL ausgeführt wird. Da die Idee hinter Docker im Allgemeinen "ein laufender Prozess pro Container" ist, werden sie durchgesetzt, wenn ich AppArmor-Profile definiere, die auf die MySQL-Binärdatei abzielen? Gibt es eine Möglichkeit für mich, dies zu testen?

Naftuli Kay
quelle
Warum möchten Sie Apparmor im Container verwenden?
c4f4t0r
3
Falls ein Zero-Day- oder anderer Exploit für die Datenbank ausgeführt wird, um zu verhindern, dass sie auf etwas anderes zugreift . Ich vertraue Linux cgroups, aber nicht so sehr . Es ist besser, auf Nummer sicher zu gehen, als es zu entschuldigen. Ich würde MySQL lieber sperren lassen, als dass ein MySQL-Zero-Day einen Weg findet, aus einer cgroup auszubrechen.
Naftuli Kay

Antworten:

8

Erstens werden cgroups nicht verwendet, um eine Anwendung von anderen auf einem System zu isolieren. Sie werden zum Verwalten der Ressourcennutzung und des Gerätezugriffs verwendet. Es sind die verschiedenen Namespaces (PID, UTS, Mount, User ...), die eine gewisse (begrenzte) Isolation bieten.

Darüber hinaus kann ein Prozess, der in einem Docker-Container gestartet wird, das AppArmor-Profil, unter dem er ausgeführt wird, wahrscheinlich nicht verwalten. Derzeit wird ein bestimmtes AppArmor-Profil eingerichtet, bevor der Container gestartet wird.

Es sieht so aus, als ob der libcontainer-Ausführungstreiber in Docker das Festlegen von AppArmor-Profilen für Container unterstützt , aber ich kann kein Beispiel oder keine Referenz im Dokument finden.

Anscheinend wird AppArmor auch mit LXC in Ubuntu unterstützt .

Sie sollten ein AppArmor-Profil für Ihre Anwendung schreiben und sicherstellen, dass LXC / libcontainer / Docker / ... es lädt, bevor Sie die Prozesse im Container starten.

Auf diese Weise verwendete Profile sollten erzwungen werden. Um sie zu testen, sollten Sie einen illegalen Zugriff versuchen und sicherstellen, dass er fehlschlägt.

In diesem Fall besteht keine Verbindung zwischen dem binären und dem tatsächlich erzwungenen Profil. Sie müssen Docker / LXC ausdrücklich anweisen, dieses Profil für Ihren Container zu verwenden. Wenn Sie ein Profil für die MySQL-Binärdatei schreiben, wird es nur auf dem Host und nicht im Container erzwungen.

Siosm
quelle
Dies war bisher meine (begrenzte) Erfahrung. Ich hatte Probleme beim Generieren eines Profils aus einem Docker-Container heraus. Wenn jedoch ein Profil außerhalb des Containers generiert und dann kopiert wurde, sollte es nur funktionieren ™, vorausgesetzt, Sie starten AppArmor im Container, bevor Sie die ausführbare Datei ausführen.
Naftuli Kay
@Siosm: LCX! = Libcontainer. Die Frage betraf den LXC-Treiber.
0xC0000022L
@ 0xC0000022L: Das AppArmor-Profildurchsetzungsmodell ist für jedes Tool, das zum Beschränken von Prozessen in Containern verwendet wird, dasselbe.
Siosm
3

Die Antwort ist sehr wahrscheinlich: nein.

Das Ubuntu Server-Leitfadenthema LXC behandelt ziemlich genau Ihre Frage und gibt die folgende Aussage ab:

Programme in einem Container können nicht weiter eingeschränkt werden. Beispielsweise wird MySQL unter dem Containerprofil ausgeführt (Schutz des Hosts), kann jedoch das MySQL-Profil nicht eingeben (Schutz des Containers).

Eine bessere Option, um Exploits mit unerwünschten Effekten zu vermeiden, besteht darin, den Benutzer, der den Container und LXC-Container im Benutzerbereich zu verwenden, die die Benutzerfunktion des Kernels nutzen. Doch dockerzur Zeit - meines Wissens - nicht unterstützt userns.

In einem solchen Fall würde MySQL - aus Sicht des Hosts - als nicht privilegierter Benutzer ausgeführt, während es im Container als ausgeführt werden könnte root. Sie können dann iptablesMySQL bei Bedarf an einen externen Port des Hosts binden.

0xC0000022L
quelle