Funktionen ermöglichen die Auswertung einiger wichtiger Systemprivilegien in einem separaten Thread, der sich vom aktuellen Prozess unterscheidet. Auf diese Weise müssen Sie kein Programm als root ausführen, damit es auf bestimmte Teile des Systems zugreifen kann.
Als Lösung, die sich aus den Bedürfnissen ergibt, befasst sich Abschnitt 25 von POSIX.1e mit diesem Problem. Die Entwicklung der in diesem Abschnitt definierten Privilegien und mehr wurde mit der Veröffentlichung der Linux-Kernel-Version 2.6.26 abgeschlossen. Hier finden Sie alles, was Sie über die Fähigkeiten im Linux-Kernel wissen müssen.
Verständnis der Capabilities-API-Logik
Die Berechtigungskontrolle in Unix-basierten Systemen besteht aus zwei Schritten:
- Wenn der aktuelle Eigentümer (effektive Benutzer-ID, EUID) der laufenden Anwendung Null ist, prüft das System nicht auf Autorisierung
- Wenn der EUID-Wert von Null verschieden ist, führt das System den Kontrollprozess gemäß den Berechtigungen des effektiven Benutzers und der Gruppe der betreffenden Anwendung durch
Einige Anwendungen benötigen während der Ausführung umfassendere Berechtigungen (SUID, SGIT-Bits). Als typischstes Beispiel können Sie sich vorstellen die passwd-Anwendung. Damit können Benutzer eines Systems ihre Passwörter ändern. Um jedoch an die zu schreiben /etc/shadow Datei, in der die verschlüsselten Passwörter aufbewahrt werden, muss mit Root-Benutzerrechten (d. h. Benutzer-ID = 0) gearbeitet werden.
Um dieses Problem zu lösen, hat die Anwendung passwd ein SUID-Bit. Unabhängig davon, welcher Benutzer diese Anwendung ausführt, ist der aktive Besitzer (EUID) immer root:
ls -l /usr/bin/passwd
# Ausgabe
-rwsr-xr-x. 1 root root 32552 23. Juli 2021 /usr/bin/passwd
Die Möglichkeit, SUID-Anwendungen im traditionellen Unix-Authentifizierungsmodell auszuführen, scheint das Problem gelöst zu haben. Kritische Fehler in Anwendungen mit SUID-Bits öffnen jedoch die Tür zum Ausführen unerwünschter Codes für Benutzer mit voller Berechtigung im System. Eine ideale Anwendung sollte nach Möglichkeit ohne Root-Benutzerrechte ausgeführt werden können.
Das Problem endet nicht nur mit dem SUID-Bit. Sie müssen auch über Root-Benutzerrechte verfügen, wenn Sie a abhören möchten privilegierter TCP- oder UDP-Port weniger als 1024 auf Unix-basierten Systemen. Um beispielsweise den TCP 80-Port eines Webservers abzuhören, müssen Sie die Anwendung als Root-Benutzer ausführen.
Im Laufe der Jahre wurde klar, wie verheerend es ist, Software auszuführen, die Dienste für die Netzwerkumgebung mit einem vollständig autorisierten Benutzerkonto bereitstellt. Als Zwischenlösung wurde angenommen, dass nur ein gewisser und kleinerer Teil des Programms als Root auf dem privilegierten Port lauscht, und ändert dann die aktive Benutzer-ID für nachfolgende Prozesse in einen anderen Benutzer (z. B. den Benutzer "nobody" mit eingeschränkten Rechten).
Dieses seit Jahren eingesetzte System hat sich durch seine Einfachheit bewährt und wird immer noch effizient eingesetzt. Heutzutage ist es jedoch möglich, einige zusätzliche Funktionen zu erhalten, die für die Anwendung spezifisch sind, z. über die Linux Capabilities API, ohne dass Root-Rechte erforderlich sind, abgesehen von den oben genannten System.
Das Linux-Fähigkeitsmodell, erklärt!
Die umfassendste Implementierung der Capabilities-API finden Sie im Linux-Kernel. Moderne Linux-Distributionen versuchen auch, dieses neue Modell so weit wie möglich systemweit zu verwenden.
Damit beispielsweise die Ping-Anwendung funktioniert, muss sie in der Lage sein, RAW-Sockets zu öffnen, die im Allgemeinen nur Root-Benutzern vorbehalten sind. Bei alten Linux-Distributionen besteht das Problem darin, der Anwendung das SUID-Bit zu geben, damit normale Benutzer es verwenden können. Wenn Sie in diesen Versionen das SUID-Bit aus der Anwendung entfernen und versuchen, die Anwendung als normaler Benutzer auszuführen, erhalten Sie die folgende Fehlermeldung:
Klingeln 8.8.8.8
# Ausgabe
ping: icmp open socket: Operation nicht erlaubt
Während bei modernen Linux-Distributionen die Ping-Anwendung wahrscheinlich kein SUID-Bit hat:
ls -l /bin/ping
# Ausgabe
-rwxr-xr-x. 1 root root 95232 25. Juli 2021 /bin/ping
Trotzdem können Sie die Anwendung als normaler Benutzer erfolgreich ausführen. Der Mechanismus, der dies ermöglicht, besteht darin, dass die Ping-Anwendung über die spezielle Fähigkeit verfügt CAP_NET_RAW.
Sie können die zusätzlichen Funktionen der Anwendung mit lernen getcap Befehl wie folgt:
sudo getcap /bin/ping
# Ausgabe
/bin/ping cap_net_raw=ep
Wenn der Befehl getcap eine leere Antwort zurückgibt, können Sie diesen Wert manuell festlegen mit:
sudo Setcap cap_net_raw+ep /bin/ping
Das Prozessfähigkeitsmodell
In der Linux-Implementierung werden die Fähigkeiten jedes Prozesses unter drei Überschriften gruppiert:
Fähigkeit | Erklärung |
gestattet | In diesem Cluster gibt es eine Liste erlaubter zusätzlicher Fähigkeiten für den relevanten Prozess. Das Erteilen der Erlaubnis bedeutet nicht, dass es zu diesem Zeitpunkt aktiv verwendet werden kann. Hier besteht die Möglichkeit, die Berechtigungen mit einer zusätzlichen Aktion in den effektiven Capability-Set aufzunehmen. |
Wirksam | Es zeigt die derzeit aktive Capability-Liste des zugehörigen Prozesses. Mit den Hilfsfunktionen, die das Skillsystem regulieren, ist es möglich, einen Skill aufzugeben oder wiederzuerlangen. Dies ist jedoch in jedem Fall nur unter den bereits Berechtigten der zugelassenen Gruppe möglich. |
vererbbar | Wenn eine Anwendung einen neuen Prozess startet, zeigt der neu gestartete Prozess die Liste der Fähigkeiten an, die er von der Zulassungsliste erben wird. |
Die Liste der zulässigen, wirksamen und vererbbaren Fähigkeiten für laufende Prozesse wird jederzeit als Bitmaske auf den Zeilen angezeigt CapPrm, CapEff, und CapInh in der Datei /proc/
Versuchen Sie beispielsweise, die Werte Ihrer laufenden Shell-Anwendung aus der zu lesen /proc/self/status Datei:
Katze /proc/selbst/status | grep Kappe
# Ausgabe
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 000000000000000
CapBnd: 000001ffffffffff
CapAmb: 000000000000000
Das Dateifähigkeitsmodell in Linux
Der Betrieb des Fähigkeitssystems für Dateien hängt von der Voraussetzung ab, dass diese Eigenschaften in der Schicht des virtuellen Dateisystems (VFS) gespeichert werden können. Ähnlich wie beim Prozessmodell fallen die Fähigkeiten für Dateien unter drei Überschriften:
1. Gestattet
Das System bestimmt die zulässigen Fähigkeiten des Prozesses, wenn die entsprechende ausführbare Datei in diesem Cluster läuft.
2. Wirksam
Im Gegensatz zum Prozessfähigkeitsmodell speichert dieser Header nur ein Bit: aktiv oder inaktiv. Ist das Bit aktiv, werden automatisch die in der Erlaubtliste der Datei definierten Capabilities in die Wirkfähigkeitsliste des jeweiligen Prozesses übertragen, wenn diese Datei ausgeführt wird und ein Prozess läuft erstellt. Wenn das Bit nicht aktiv ist, wird die automatische Übertragung der erlaubten Capabilities auf der Datei an den laufenden Prozess nicht durchgeführt.
Wenn jedoch der Code der betreffenden Anwendung in das Capability-System integriert ist, kann es die Berechtigungen im zulässigen Satz der Datei mit Systemaufrufen aktivieren. Der Hauptzweck dieses Verhaltens besteht darin, sicherzustellen, dass alte Anwendungen, die keine systemspezifischen Funktionen enthalten Code kann die Entwicklung auf der Ebene des Softwarecodes mit dem Capability System arbeiten, ohne dass Quellcode benötigt wird Änderungen.
Sie könnten denken, dass besser geschriebene Anwendungen Funktionen nur dann verwenden, wenn sie benötigt werden. Wenn das Bit aktiv ist, werden alle Fähigkeiten in der Zulassungsliste aktiv, wenn die Anwendung startet.
3. Vererbbar
Wie im Prozessmodell läuft die entsprechende Datei und ein Prozess findet statt. Wenn danach eine andere Anwendung innerhalb des Prozesses ausgeführt wird, wird sie in die Zulassungsliste des neuen Prozesses aufgenommen. Zusammenfassend zeigt es eine Liste von Fähigkeiten an, die geerbt werden sollen.
Die Rolle von Fähigkeiten in einem Linux-System
Wenn Sie einen bestimmten Prozess als normaler Benutzer ausführen, haben Sie keinerlei Privilegien. Dadurch können Sie nur auf die Partitionen zugreifen, die das System für normale Benutzer zulässt. Der Hauptgrund dafür ist die Erhöhung der Systemsicherheit und die Umsetzung solcher Maßnahmen.
Allen Benutzern den Zugriff auf alle Ressourcen zu gestatten, kann zu einer ernsthaften Sicherheitslücke führen. Es wird für Personen, die das System für böswillige Zwecke verwenden, sehr einfach sein, Systemschwachstellen auszunutzen. Linux-Fähigkeiten sind in solchen Angelegenheiten praktisch. Sie können die Sicherheit Ihrer Anwendungen ganz einfach mit der vom Kernel unterstützten Capabilities-API stärken.
Linux-Fähigkeiten sind nur eines der Probleme, über die nachgedacht werden muss, um sehr leistungsfähige Methoden wie das Teilen der des Root-Benutzers durchzuführen Berechtigungen, das Zuweisen verschiedener Berechtigungen für nicht privilegierte Benutzer und das Ergreifen verschiedener Vorsichtsmaßnahmen bezüglich offener Ports in Internetdiensten mit Linux-Server.
Verbessern Sie die Sicherheit Ihres Linux-Servers mit diesen 7 Härtungsschritten
Lesen Sie weiter
Verwandte Themen
- Linux
- Programmierung
- Linux Kernel
- Betriebssystem
Über den Autor

Ein Ingenieur und Softwareentwickler, der ein Fan von Mathematik und Technik ist. Schon immer mochte er Computer, Mathematik und Physik. Er hat Spiele-Engine-Projekte sowie maschinelles Lernen, künstliche neuronale Netze und lineare Algebra-Bibliotheken entwickelt. Darüber hinaus arbeitet er weiter an maschinellem Lernen und linearen Matrizen.
Abonnieren Sie unseren Newsletter
Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!
Klicken Sie hier, um sich anzumelden