Mithilfe der sogenannten Posix-Capabilities lässt sich eine fein abgestufte Rechteverwaltung realisieren.
Die Rechte des allgewaltigen Users Root soll der Admin nur mit Bedacht nutzen, lautet eine Binsenweisheit. Schon ein Moment Unachtsamkeit kann großen Schaden anrichten, wenn es keine Schranken für die Befehlsgewalt gibt. Nicht zuletzt deshalb operieren normale Benutzer mit deutlich reduzierten Rechten, und auch Admins sollten das in der Regel tun. Was aber, wenn doch einmal erweiterte Berechtigungen unumgänglich sind? Ganz offensichtlich nötig ist das zum Beispiel, will man das Kommando »su« ausführen, das einem Nutzer die Identität eines anderen verleiht.
In solchen Fällen leistet oft ein unscheinbares Bit erste Hilfe, das sogenannte SetUID-Bit oder kurz SUID-Bit: Ist es bei einer Kommandodatei gesetzt, wird sie nicht wie üblich mit den Rechten des Ausführenden gestartet, sondern mit den Rechten des Dateieigentümers. Entsprechend gehört eine solche Datei normalerweise Root, was dem Benutzer Root-Rechte nur für dieses spezielle Kommando einräumt. Davon kann man sich leicht überzeugen (Listing 1).
Listing 1
SetUID finden und verwenden
# Die Kommandodatei gehört Root $ ls -al /bin/su -rwsr-xr-x 1 root root 67816 Apr 2 17:29 /bin/su # Das SetUID-Bit ist gesetzt $ stat -c "%a %A" /bin/su 4755 -rwsr-xr-x # Ausführung $ su # im anderen Terminalfenster: # tatsächlich führt Root aus $ ps aux | grep su | grep -v grep root 36365 0.0 0.0 11236 3716 pts/2 S+ 11:51 0:00 su
Das ist allerdings immer noch recht grobschlächtig, billigt das SUID-Bit doch volle Root-Rechte zu, wenn auch nur für einzelne Kommandos. Es geht auch feiner abgestuft, nämlich mit den sogenannten Posix-Capabilities. Die verleihen dem Ausführenden einer Datei sehr spezielle zusätzliche Rechte, zum Beispiel jenes, beliebigen Prozessen Signale zu senden, privilegierte Ports zu verwenden, das System zu rebooten, Kernel-Module zu laden und so weiter. Eine umfassende Übersicht aller 33 übertragbaren Berechtigungen zeigt »man capabilities«.
Ein gutes Beispiel dafür, wie man die Posix-Capabilities verwendet, liefert das Kommando »ping«. Eigentlich müsste es ein SUID-Bit haben, denn es muss auf Netzwerk-Sockets zugreifen, was ein gewöhnlichen User nicht darf. Zumindest unter Ubuntu 20.04 fehlt aber das SUID-Bit. Warum »ping« aber dennoch funktioniert, das verrät folgender Aufruf:
$ getcap /bin/ping
/bin/ping = cap_net_raw+ep
Ping kommt also mit gesetzter Capability »NET_RAW«, die unter anderem die Verwendung von Raw- und Packet-Sockets erlaubt. Die Flags »e« und »p« stehen für “effective” und “permitted”, also eingeschaltet und erlaubt. Die Capabilities lassen sich nicht nur abfragen, sondern mit »setcap« auch setzen. Das nützt allerdings nicht in allen Fällen etwas, denn manche Linux-Kommandos (beispielsweise »mount«) prüfen, ob der Ausführende die User-ID 0 von Root hat und verweigern den Dienst, sollte das nicht so sein – ganz gleich, welche Capabilities gesetzt sind.





