So verwenden Sie SUID, SGID und Sticky Bits unter Linux

SUID, SGID und Sticky Bits sind leistungsstarke Sonderberechtigungen, die Sie für ausführbare Dateien und Verzeichnisse unter Linux festlegen können. Wir teilen Ihnen die Vorteile – und potenzielle Fallstricke – ihrer Verwendung mit.

Sie sind bereits im Einsatz

Die Integration von Sicherheit in ein Mehrbenutzer-Betriebssystem bringt mehrere Probleme mit sich. Nehmen Sie zum Beispiel das (scheinbar) grundlegende Konzept von Passwörtern. Sie müssen alle gespeichert werden, damit das System jedes Mal, wenn sich jemand anmeldet, das von ihm eingegebene Passwort mit der gespeicherten Kopie vergleichen kann. Da Passwörter die Schlüssel zum Königreich sind, müssen sie natürlich geschützt werden.

Unter Linux sind gespeicherte Passwörter auf zwei Arten geschützt: Sie sind verschlüsselt und nur jemand mit Root-Rechten kann auf die Datei zugreifen, die die Passwörter enthält. Das mag gut klingen, stellt aber ein Dilemma dar: Wenn nur Personen mit Root-Rechten auf gespeicherte Passwörter zugreifen können, wie ändern dann diejenigen, die diesen Zugang nicht haben, ihre Passwörter?

Erhöhen Ihres Status

Normalerweise werden Linux-Befehle und -Programme mit denselben Berechtigungen ausgeführt wie die Person, die das Programm startet. Wenn root den passwd-Befehl ausführt ein Passwort ändern, es wird mit Root-Rechten ausgeführt. Das bedeutet, dass der Befehl passwd frei auf die gespeicherten Passwörter in der Datei /etc/shadow zugreifen kann.

Ideal wäre ein Schema, bei dem jeder auf dem System das Programm passwd starten könnte, das Programm passwd jedoch die erhöhten Rechte von root behält. Dies würde es jedem ermöglichen, sein eigenes Passwort zu ändern.

Das obige Szenario ist genau das, was das Set User ID Bit (SUID) bewirkt. Es führt Programme und Befehle aus mit den Berechtigungen des Dateibesitzers und nicht mit den Berechtigungen der Person, die das Programm startet.

Sie erhöhen den Status des Programms

Es gibt jedoch noch eine andere Zwickmühle. Die Person muss daran gehindert werden, sich in das Passwort anderer einzumischen. Linux enthält das SUID-Schema, das es ermöglicht, Anwendungen mit einer Reihe von vorübergehend geliehenen Berechtigungen auszuführen – aber das ist nur die Hälfte der Sicherheitsgeschichte.

Der Kontrollmechanismus, der verhindert, dass jemand mit dem Passwort einer anderen Person arbeitet, ist im Programm passwd enthalten, nicht im Betriebssystem und im SUID-Schema.

Programme, die mit erhöhten Rechten ausgeführt werden, können Sicherheitsrisiken darstellen, wenn sie nicht mit einer „Sicherheit durch Design“-Mentalität erstellt wurden. Das heißt, Sicherheit ist das Erste, was Sie berücksichtigen, und dann bauen Sie darauf auf. Schreiben Sie Ihr Programm nicht und versuchen Sie es anschließend mit einem Sicherheitsmantel zu versehen.

Der größte Vorteil von Open-Source-Software ist du kannst dir den Quellcode selbst anschauen oder beziehen Sie sich auf vertrauenswürdige Peer-Reviews. Im Quellcode des Programms passwd gibt es Prüfungen, damit Sie sehen können, ob die Person, die das Programm ausführt, root ist. Verschiedene Fähigkeiten sind erlaubt, wenn jemand root ist (oder jemand, der sudo verwendet).

Dies ist der Code, der erkennt, ob jemand root ist.

Ein Quellcode-Snippet von

Das Folgende ist ein Beispiel, in dem dies berücksichtigt wird. Da root jedes Passwort ändern kann, muss sich das Programm nicht mit den Prüfungen herumschlagen, die es normalerweise durchführt, um zu sehen, welche Passwörter die Person ändern darf. Also, für root, es überspringt diese Prüfungen und beendet die Prüffunktion.

  Last Light Redux unter Linux

Ein Quellcode-Snippet von

Mit den grundlegenden Linux-Befehlen und -Dienstprogrammen können Sie sicher sein, dass sie mit Sicherheit ausgestattet sind und der Code viele Male überprüft wurde. Natürlich drohen immer noch unbekannte Exploits. Patches oder Updates erscheinen jedoch schnell, um neu identifizierten Schwachstellen zu begegnen.

Es handelt sich um Software von Drittanbietern – insbesondere bei Software, die nicht Open Source ist –, bei der Sie SUID mit äußerster Vorsicht verwenden. Wir sagen nicht, dass Sie es nicht tun sollten, aber wenn Sie dies tun, möchten Sie sicherstellen, dass Ihr System keinen Risiken ausgesetzt wird. Sie möchten nicht die Privilegien eines Programms erhöhen, das sich selbst und die Person, die es ausführt, nicht korrekt selbst verwaltet.

Linux-Befehle, die SUID verwenden

Im Folgenden sind einige der Linux-Befehle aufgeführt, die das SUID-Bit verwenden, um dem Befehl erhöhte Berechtigungen zu erteilen, wenn er von einem normalen Benutzer ausgeführt wird:

ls -l /bin/su
ls -l /bin/ping
ls -l /bin/mount
ls -l /bin/umount
ls -l /usr/bin/passwd

Beachten Sie, dass die Dateinamen rot hervorgehoben sind, was anzeigt, dass das SUID-Bit gesetzt ist.

Die Berechtigungen für eine Datei oder ein Verzeichnis werden normalerweise durch drei Gruppen von drei Zeichen dargestellt: rwx. Diese stehen für Lesen, Schreiben und Ausführen. Wenn die Briefe vorhanden sind, wurde diese Erlaubnis erteilt. Wenn jedoch ein Bindestrich (-) anstelle eines Buchstabens vorhanden ist, wurde diese Erlaubnis nicht erteilt.

Es gibt drei Gruppen dieser Berechtigungen (von links nach rechts): die für den Eigentümer der Datei, für Mitglieder der Dateigruppe und für andere. Wenn das SUID-Bit für eine Datei gesetzt ist, steht ein „s“ für die Ausführungsberechtigung des Besitzers.

Wenn das SUID-Bit auf einer Datei gesetzt ist, die keine ausführbaren Fähigkeiten hat, zeigt ein großes „S“ dies an.

Wir schauen uns ein Beispiel an. Der normale Benutzer dave gibt den Befehl passwd ein:

passwd

Der

Der Befehl passwd fordert Dave auf, sein neues Passwort einzugeben. Wir können den ps-Befehl verwenden um die Details laufender Prozesse anzuzeigen.

Wir verwenden ps mit grep in einem anderen Terminalfenster und suchen Sie nach dem passwd-Prozess. Wir werden auch die Optionen -e (jeder Prozess) und -f (Vollformat) mit ps verwenden.

Wir geben folgenden Befehl ein:

ps -e -f | grep passwd

Der

Es werden zwei Zeilen gemeldet, von denen die zweite der grep-Prozess ist, der nach Befehlen mit der Zeichenfolge „passwd“ sucht. Es ist jedoch die erste Zeile, die uns interessiert, denn sie ist diejenige für den von dave gestarteten passwd-Prozess.

Wir können sehen, dass der passwd-Prozess genauso läuft, als ob root ihn gestartet hätte.

Setzen des SUID-Bits

Es ist einfach, das SUID-Bit mit chmod zu ändern. Der symbolische Modus u+s setzt das SUID-Bit und der symbolische Modus us löscht das SUID-Bit.

Um einige der Konzepte des SUID-Bits zu veranschaulichen, haben wir ein kleines Programm namens htg erstellt. Es befindet sich im Stammverzeichnis des Dave-Benutzers, und das SUID-Bit ist nicht gesetzt. Wenn es ausgeführt wird, zeigt es die echten und effektiven Benutzer-IDs (UID).

  So verwenden Sie den rev-Befehl unter Linux

Die reale UID gehört der Person, die das Programm gestartet hat. Die effektive ID ist das Konto, mit dem sich das Programm so verhält, als wäre es gestartet worden.

Wir geben folgendes ein:

ls -lh htg
./htg

Der

Wenn wir die lokale Kopie des Programms ausführen, sehen wir, dass die echte und die effektive ID beide auf dave gesetzt sind. Es verhält sich also wie ein normales Programm.

Kopieren wir es in das Verzeichnis /usr/local/bin, damit andere es verwenden können.

Wir geben Folgendes ein, verwenden chmod, um das SUID-Bit zu setzen, und überprüfen dann, ob es gesetzt wurde:

sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg

Der

Das Programm wird also kopiert und das SUID-Bit wird gesetzt. Wir führen es erneut aus, aber diesmal führen wir die Kopie im Ordner /usr/local/bin aus:

htg

Der

Obwohl Dave das Programm gestartet hat, wird die effektive ID auf den Root-Benutzer gesetzt. Wenn Mary das Programm startet, passiert dasselbe, wie unten gezeigt:

htg

Der

Die echte ID ist mary und die effektive ID ist root. Das Programm wird mit den Berechtigungen des Root-Benutzers ausgeführt.

Das SGID-Bit

Das Set Group ID (SGID)-Bit ist dem SUID-Bit sehr ähnlich. Wenn das SGID-Bit in einer ausführbaren Datei gesetzt ist, wird die effektive Gruppe auf die Gruppe der Datei gesetzt. Der Prozess wird mit den Berechtigungen der Mitglieder der Dateigruppe ausgeführt und nicht mit den Berechtigungen der Person, die ihn gestartet hat.

Wir haben unser htg-Programm optimiert, damit es auch die effektive Gruppe zeigt. Wir ändern die Gruppe des htg-Programms in die Standardgruppe des Benutzers mary, mary. Wir werden auch die symbolischen Modi us und g+s mit chown verwenden, um das SUID-Bit zu entfernen und die SGID zu setzen.

Dazu geben wir Folgendes ein:

sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg

Der

Sie können das SGID-Bit, das durch das „s“ gekennzeichnet ist, in den Gruppenberechtigungen sehen. Beachten Sie auch, dass die Gruppe auf mary gesetzt ist und der Dateiname jetzt gelb hervorgehoben ist.

Bevor wir das Programm ausführen, stellen wir fest, zu welchen Gruppen dave und mary gehören. Wir verwenden den Befehl id mit der Option -G (Gruppen), um alle Gruppen-IDs auszudrucken. Dann führen wir das htg-Programm als dave aus.

Wir geben die folgenden Befehle ein:

id -G dave
id -G mary
htg

Der

Die ID der Standardgruppe für mary ist 1001 und die effektive Gruppe des htg-Programms ist 1001. Obwohl es von dave gestartet wurde, läuft es mit den Berechtigungen der Mitglieder der mary-Gruppe. Es ist so, als ob Dave der Mary-Gruppe beigetreten wäre.

Wenden wir das SGID-Bit auf ein Verzeichnis an. Zuerst erstellen wir ein Verzeichnis namens „work“ und ändern dann seine Gruppe in „geek“. Wir setzen dann das SGID-Bit im Verzeichnis.

Wenn wir ls verwenden, um die Einstellungen des Verzeichnisses zu überprüfen, verwenden wir auch die Option -d (Verzeichnis), damit wir die Details des Verzeichnisses sehen, nicht seinen Inhalt.

  So passen Sie das Linux-Terminal an

Wir geben die folgenden Befehle ein:

sudo mkdir work
sudo chown dave:geek work
sudo chmod g+s work
ls -lh -d work

Der

Das SGID-Bit und die „Geek“-Gruppe werden gesetzt. Diese wirken sich auf alle Elemente aus, die innerhalb des Arbeitsverzeichnisses erstellt werden.

Wir geben Folgendes ein, um das Arbeitsverzeichnis einzugeben, ein Verzeichnis namens „demo“ zu erstellen und seine Eigenschaften zu überprüfen:

cd work
mkdir demo
ls -lh -d demo

Der

Das SGID-Bit und die „Geek“-Gruppe werden automatisch auf das „Demo“-Verzeichnis angewendet.

Geben wir Folgendes ein, um eine Datei mit dem zu erstellen berühren Befehl und überprüfen Sie seine Eigenschaften:

touch useful.sh
ls -lh useful.sh

Der

Die Gruppe der neuen Datei wird automatisch auf „Geek“ gesetzt.

Das klebrige Bit

Der Sticky Bit hat seinen Namen von seinem historischen Zweck. Wenn es für eine ausführbare Datei festgelegt ist, wird dem Betriebssystem angezeigt, dass die Textteile der ausführbaren Datei im Swap gehalten werden sollen, um ihre Wiederverwendung zu beschleunigen. Unter Linux wirkt sich das Sticky-Bit nur auf ein Verzeichnis aus – es auf eine Datei zu setzen, wäre nicht sinnvoll.

Wenn Sie das Sticky-Bit für ein Verzeichnis festlegen, können Benutzer nur Dateien löschen, die ihnen innerhalb dieses Verzeichnisses gehören. Sie können keine Dateien löschen, die einer anderen Person gehören, unabhängig davon, welche Kombination von Dateiberechtigungen für die Dateien festgelegt ist.

Auf diese Weise können Sie ein Verzeichnis erstellen, das jeder – und die von ihm gestarteten Prozesse – als gemeinsam genutzten Dateispeicher verwenden kann. Die Dateien sind geschützt, da wiederum niemand die Dateien anderer Personen löschen kann.

Erstellen wir ein Verzeichnis namens „shared“. Wir verwenden den symbolischen o+t-Modus mit chmod, um das Sticky-Bit in diesem Verzeichnis zu setzen. Wir werden uns dann die Berechtigungen für dieses Verzeichnis sowie die Verzeichnisse /tmp und /var/tmp ansehen.

Wir geben die folgenden Befehle ein:

mkdir shared
sudo chmod o+t shared
ls -lh -d shared
ls -lh -d /tmp
ls -lh -d /var/tmp

Der

Wenn das Sticky-Bit gesetzt ist, wird das ausführbare Bit des „anderen“ Satzes von Dateiberechtigungen auf „t“ gesetzt. Der Dateiname wird ebenfalls blau hervorgehoben.

Die Ordner /tmp und /var/tmp sind zwei Beispiele für Verzeichnisse, in denen alle Dateiberechtigungen für Besitzer, Gruppe und andere festgelegt sind (deshalb sind sie grün hervorgehoben). Sie werden als freigegebene Speicherorte für temporäre Dateien verwendet.

Mit diesen Berechtigungen sollte jeder theoretisch in der Lage sein, alles zu tun. Das Sticky-Bit überschreibt sie jedoch, und niemand kann eine Datei löschen, die ihm nicht gehört.

Erinnerungen

Im Folgenden finden Sie eine kurze Checkliste für das, was wir oben behandelt haben, um später darauf zurückgreifen zu können:

SUID funktioniert nur bei Dateien.
Sie können SGID auf Verzeichnisse und Dateien anwenden.
Sie können das Sticky-Bit nur auf Verzeichnisse anwenden.
Wenn die Zeichen „s“, „g“ oder „t“ in Großbuchstaben erscheinen, wurde das ausführbare Bit (x) nicht gesetzt.