CGroups
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Linux Control Groups, oder cgroups, sind ein Feature des Linux-Kernels, das die Zuweisung, Begrenzung und Priorisierung von Systemressourcen wie CPU, Speicher und Festplatten-I/O zwischen Prozessgruppen ermöglicht. Sie bieten einen Mechanismus zur Verwaltung und Isolierung der Ressourcennutzung von Prozesssammlungen, was für Zwecke wie Ressourcenbegrenzung, Arbeitslastisolierung und Ressourcenpriorisierung zwischen verschiedenen Prozessgruppen von Vorteil ist.
Es gibt zwei Versionen von cgroups: Version 1 und Version 2. Beide können gleichzeitig auf einem System verwendet werden. Der Hauptunterschied besteht darin, dass cgroups Version 2 eine hierarchische, baumartige Struktur einführt, die eine nuanciertere und detailliertere Ressourcenzuteilung zwischen Prozessgruppen ermöglicht. Darüber hinaus bringt Version 2 verschiedene Verbesserungen mit sich, darunter:
Neben der neuen hierarchischen Organisation führte cgroups Version 2 auch mehrere andere Änderungen und Verbesserungen ein, wie die Unterstützung für neue Ressourcencontroller, bessere Unterstützung für Legacy-Anwendungen und verbesserte Leistung.
Insgesamt bietet cgroups Version 2 mehr Funktionen und eine bessere Leistung als Version 1, aber letztere kann in bestimmten Szenarien, in denen die Kompatibilität mit älteren Systemen ein Anliegen ist, weiterhin verwendet werden.
Sie können die v1- und v2-cgroups für jeden Prozess auflisten, indem Sie die cgroup-Datei in /proc/<pid> ansehen. Sie können damit beginnen, die cgroups Ihrer Shell mit diesem Befehl anzusehen:
Die Ausgabestruktur ist wie folgt:
Zahlen 2–12: cgroups v1, wobei jede Zeile ein anderes cgroup darstellt. Die Controller dafür sind neben der Zahl angegeben.
Zahl 1: Ebenfalls cgroups v1, jedoch ausschließlich für Verwaltungszwecke (gesetzt von z.B. systemd) und ohne einen Controller.
Zahl 0: Stellt cgroups v2 dar. Es sind keine Controller aufgeführt, und diese Zeile ist ausschließlich auf Systemen, die nur cgroups v2 ausführen, vorhanden.
Die Namen sind hierarchisch, ähnlich wie Dateipfade, und zeigen die Struktur und Beziehung zwischen verschiedenen cgroups an.
Namen wie /user.slice oder /system.slice spezifizieren die Kategorisierung von cgroups, wobei user.slice typischerweise für Anmeldesitzungen, die von systemd verwaltet werden, und system.slice für Systemdienste verwendet wird.
Das Dateisystem wird typischerweise für den Zugriff auf cgroups verwendet, abweichend von der Unix-Systemaufrufschnittstelle, die traditionell für Kernel-Interaktionen genutzt wird. Um die cgroup-Konfiguration einer Shell zu untersuchen, sollte die /proc/self/cgroup-Datei überprüft werden, die die cgroup der Shell offenbart. Anschließend kann man im Verzeichnis /sys/fs/cgroup (oder /sys/fs/cgroup/unified
) navigieren und ein Verzeichnis finden, das den Namen der cgroup trägt, um verschiedene Einstellungen und Informationen zur Ressourcennutzung der cgroup zu beobachten.
Die wichtigsten Schnittstellendateien für cgroups sind mit cgroup vorangestellt. Die cgroup.procs-Datei, die mit Standardbefehlen wie cat angezeigt werden kann, listet die Prozesse innerhalb der cgroup auf. Eine andere Datei, cgroup.threads, enthält Thread-Informationen.
Cgroups, die Shells verwalten, umfassen typischerweise zwei Controller, die den Speicherverbrauch und die Prozessanzahl regulieren. Um mit einem Controller zu interagieren, sollten Dateien mit dem Präfix des Controllers konsultiert werden. Zum Beispiel würde pids.current herangezogen, um die Anzahl der Threads in der cgroup zu ermitteln.
Die Angabe von max in einem Wert deutet auf das Fehlen eines spezifischen Limits für die cgroup hin. Aufgrund der hierarchischen Natur von cgroups können jedoch Limits von einer cgroup auf einer niedrigeren Ebene in der Verzeichnisstruktur auferlegt werden.
Prozesse werden cgroups zugewiesen, indem ihre Prozess-ID (PID) in die cgroup.procs
-Datei geschrieben wird. Dies erfordert Root-Rechte. Um beispielsweise einen Prozess hinzuzufügen:
Ebenso wird das Ändern von cgroup-Attributen, wie das Festlegen eines PID-Limits, durchgeführt, indem der gewünschte Wert in die entsprechende Datei geschrieben wird. Um ein Maximum von 3.000 PIDs für eine cgroup festzulegen:
Das Erstellen neuer cgroups beinhaltet das Anlegen eines neuen Unterverzeichnisses innerhalb der cgroup-Hierarchie, was den Kernel dazu veranlasst, automatisch die erforderlichen Schnittstellendateien zu generieren. Obwohl cgroups ohne aktive Prozesse mit rmdir
entfernt werden können, sollten Sie sich bestimmter Einschränkungen bewusst sein:
Prozesse können nur in Blatt-cgroups platziert werden (d.h. in den am tiefsten geschachtelten in einer Hierarchie).
Eine cgroup kann keinen Controller besitzen, der in ihrem Elternteil fehlt.
Controller für untergeordnete cgroups müssen ausdrücklich in der Datei cgroup.subtree_control
deklariert werden. Zum Beispiel, um CPU- und PID-Controller in einer untergeordneten cgroup zu aktivieren:
Der root cgroup ist eine Ausnahme von diesen Regeln und ermöglicht die direkte Platzierung von Prozessen. Dies kann verwendet werden, um Prozesse aus der Verwaltung von systemd zu entfernen.
Die Überwachung der CPU-Nutzung innerhalb eines cgroups ist über die Datei cpu.stat
möglich, die die insgesamt verbrachte CPU-Zeit anzeigt, was hilfreich ist, um die Nutzung über die Unterprozesse eines Dienstes zu verfolgen:
Buch: Wie Linux funktioniert, 3. Auflage: Was jeder Superuser wissen sollte von Brian Ward
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)