Dateiberechtigungen in Linux

Hallo zusammen. Wir arbeiten aktiv an neuen Projekten und bereiten viele spannende Neugestaltungen für Januar vor. Unter anderem haben wir einen neuen Kurs, der bei allen sehr beliebt ist, angekündigt. „Linux-Administrator“Vor dem Start teilen wir traditionell eine Übersetzung von nützlichem Material.

Dateiberechtigungen in Linux

Dateiberechtigungen bieten eine sichere Alternative zu SUID-exe-Dateien, können jedoch auf den ersten Blick etwas verwirrend erscheinen.


Wir alle wissen, dass Binärdateien SUID folgende eine schlechte Sicherheitsentscheidung sind.Glücklicherweise gibt es einen effizienteren Weg, wenn Ihre Anwendung einige eingeschränkte Berechtigungen benötigt, genannt Dateiberechtigungen..

Ich werde Ihnen Zeit sparen, wenn Sie detailliertes Lesen des vorherigen Artikels vermeiden möchten: Im Wesentlichen ermöglichen Dateiberechtigungen Prozessen, die im Namen des Root-Benutzers ausgeführt werden und daher berechtigt sind, etwas zu tun, bestimmte Möglichkeiten beizubehalten, die durch diese Liste begrenzt sind., wenn sie Berechtigungen zurücksetzen und als nicht privilegierter Benutzer ausgeführt werden. Das bedeutet, dass ein Angreifer, selbst wenn er es schafft, einen Prozess durch einen Buffer Overflow oder einen anderen Exploit zu kompromittieren, nichts weiter nutzen kann als die spezifischen minimalen Berechtigungen, die wirklich für den Prozess erforderlich sind.

Berechtigungen eignen sich hervorragend für Dienste, die in der Regel immer als root-Benutzer ausgeführt werden, aber wie sieht es mit Befehlszeilen-Utilities aus? Glücklicherweise wird das ebenfalls unterstützt, solange Sie die richtigen Tools installiert haben. Wenn Sie Ubuntu verwenden, benötigen Sie zum Beispiel das Paket libcap2-bin. Sie müssen außerdem ein nicht veraltetes Kernel verwenden (ab Version 2.6.24).

). Diese Funktionen ermöglichen es, Berechtigungen an ausführbare Dateien zu binden, ähnlich wie beim Setzen des SUID-Bits, jedoch für eine bestimmte Berechtigungssatz. Das Tool setcap wird verwendet, um Berechtigungen zu einer Datei hinzuzufügen und zu entfernen.

Der erste Schritt besteht darin, die gewünschten Berechtigungen auszuwählen. Für diesen Artikel nehme ich an, dass es ein Netzwerkdiagnosetool namens tracewalkgibt, das in der Lage sein sollte, verwendet zu werden. unverarbeitete Sockets. Normalerweise ist es erforderlich, dass die Anwendung als root-Benutzer ausgeführt wird, aber beim Überprüfen der Liste stellt sich heraus, dass nur die Berechtigung erforderlich ist CAP_NET_RAW.

Vorausgesetzt, Sie befinden sich im Verzeichnis, in dem sich die ausführbare Datei befindet tracewalk, können Sie diese Berechtigung wie folgt hinzufügen:

sudo setcap cap_net_raw=eip tracewalk

Ignorieren Sie vorerst das Suffix =eip für die Berechtigung, dazu erzähle ich Ihnen in ein paar Sekunden mehr. Bitte beachten Sie, dass der Name der Berechtigung in Kleinbuchstaben ist. Nun können Sie überprüfen, ob Sie die Berechtigungen korrekt eingerichtet haben, mit:

setcap -v cap_new_raw=eip tracewalk

Oder Sie können eine Liste aller Berechtigungen, die für die betreffende ausführbare Datei festgelegt wurden, ausgeben:

getcap tracewalk

Zur Information: Sie können auch alle Berechtigungen von der ausführbaren Datei mit folgendem Befehl entfernen:

setcap -r tracewalk

An diesem Punkt sollten Sie in der Lage sein, die ausführbare Datei als nicht privilegierter Benutzer auszuführen, und sie sollte in der Lage sein, mit unverarbeiteten Sockets zu arbeiten, ohne über andere Privilegien zu verfügen, die der root-Benutzer hat.

Also, was bedeutet dieses seltsame Suffix? =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — effektive, vererbbare und erlaubte (effective, inheritable und permitted):

  • Effektive (Effective) Erlaubnisse — das sind die, die definieren, was ein Prozess tatsächlich tun kann. Zum Beispiel kann er nicht mit unverarbeiteten Sockets umgehen, wenn CAP_NET_RAW es nicht im effektiven Satz ist.
  • Erlaubte (Permitted) Erlaubnisse — das sind die, die einem Prozess gestattet sind, wenn er sie durch den entsprechenden Aufruf anfordert. Sie ermöglichen es einem Prozess nicht, tatsächlich irgendetwas zu tun, es sei denn, er wurde speziell so programmiert, dass er die angegebene Erlaubnis anfordert. Dies erlaubt es, Prozesse zu schreiben, um besonders wichtige Erlaubnisse nur für den Zeitraum in den effektiven Satz aufzunehmen, in dem sie tatsächlich benötigt werden.
  • Vererbbare (Inheritable) Erlaubnisse — das sind die, die im verfügbaren Satz des gezeugten untergeordneten Prozesses vererbt werden können. Während der Operation fork() oder clone() erhält der untergeordnete Prozess immer eine Kopie der Erlaubnisse des übergeordneten Prozesses, da er zu diesem Zeitpunkt immer noch dieselbe ausführbare Datei ausführt. Der vererbbare Satz wird verwendet, wenn exec() (oder das Äquivalent) wird aufgerufen, um eine ausführbare Datei durch eine andere zu ersetzen. In diesem Stadium wird die verfügbare Prozessgruppe durch die ererbte Gruppe maskiert, um die verfügbare Gruppe zu erhalten, die für den neuen Prozess verwendet wird.

Somit ermöglicht uns das Tool setcap die Berechtigungen dieser drei Gruppen unabhängig für die gegebene ausführbare Datei hinzuzufügen. Beachten Sie, dass der Wert der Gruppen für den Zugriff auf Dateien etwas anders interpretiert wird:

  • Verfügbare Dateiberechtigungen sind die, die immer für die ausführbare Datei verfügbar sind, selbst wenn der übergeordnete Prozess, der sie aufgerufen hat, diese nicht hatte. Früher wurden sie als "zwanghafte" Berechtigungen bezeichnet.
  • Erblich bestimmt die Dateiberechtigungen eine zusätzliche Maske, die ebenfalls verwendet werden kann, um Berechtigungen aus der Gruppe des aufrufenden Prozesses zu entfernen. Sie werden zusätzlich zur ererbten Gruppe des aufrufenden Prozesses angewendet, sodass die Berechtigung nur dann vererbt wird, wenn sie in beiden Gruppen vorhanden ist.
  • Effektive Dateiberechtigungen bestehen tatsächlich nur aus einem einzelnen Bit anstatt aus einer Menge. Wenn dieses Bit gesetzt ist, bedeutet das, dass das gesamte verfügbare Set auch in das effektive Set des neuen Prozesses kopiert wird. Dies kann genutzt werden, um Berechtigungen zu Prozessen hinzuzufügen, die nicht speziell dafür programmiert wurden, sie anzufordern. Da es sich um ein einzelnes Bit handelt, muss es für alle Berechtigungen gesetzt werden, wenn Sie es für eine Berechtigung aktivieren. Man kann es als ein Legacy-Bit betrachten, da es genutzt wird, um Berechtigungen für Anwendungen zu ermöglichen, die sie nicht unterstützen.

Beim Festlegen von Berechtigungen über setcap drei Buchstaben e, i und p beziehen sich auf effektiv, vererbt und verfügbar Mengen entsprechend. Die frühere Spezifikation:

sudo setcap cap_net_raw=eip tracewalk

… gibt an, dass die Berechtigung CAP_NET_RAW zu den verfügbaren und vererbten Mengen hinzugefügt werden muss und dass das effektive Bit ebenfalls gesetzt sein muss. Dies wird alle zuvor festgelegten Berechtigungen in der Datei ersetzen. Um mehrere Berechtigungen gleichzeitig festzulegen, verwenden Sie eine durch Kommas getrennte Liste:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Leitfaden zu Berechtigungen diskutiert all dies ausführlicher, aber ich hoffe, dieser Beitrag hat das Geschehen ein wenig entmystifiziert. Es bleibt nur noch, einige Warnungen und Tricks zu erwähnen.

Erstens, die Dateiberechtigungen funktionieren nicht mit symbolischen Links – Sie müssen sie auf die eigentliche Binärdatei anwenden (das heißt, auf das Ziel des symbolischen Links).

Zweitens funktionieren sie nicht mit interpretierbaren Skripten. Wenn Sie beispielsweise ein Python-Skript haben, dem Sie Berechtigungen zuweisen möchten, müssen Sie diese dem Python-Interpreter selbst zuweisen. Offensichtlich ist dies ein potenzielles Sicherheitsproblem, da dann alle mit diesem Interpreter ausgeführten Skripte die angegebene Berechtigung haben, obwohl das immer noch deutlich besser ist, als SUID zu verwenden. Der häufigste Workaround besteht anscheinend darin, eine separate ausführbare Datei in C oder einem ähnlichen Format zu schreiben, die die benötigten Operationen ausführen kann und aus dem Skript aufgerufen wird. Dies ähnelt dem Ansatz, der von Wireshark verwendet wird und der eine Binärdatei nutzt, /usr/bin/dumpcap um privilegierte Operationen auszuführen:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Drittens werden die Datei-Berechtigungen deaktiviert, wenn Sie die Umgebungsvariable verwenden LD_LIBRARY_PATH aus offensichtlichen Sicherheitsgründen(1). Dasselbe gilt für LD_PRELOAD, soweit ich weiß.

1. Da ein Angreifer offensichtlich eine der Standardbibliotheken ersetzen und LD_LIBRARY_PATH, um seine Bibliothek vorzuziehen, und damit seinen eigenen beliebigen Code mit den gleichen Rechten wie die aufrufende Anwendung ausführen kann.

Das ist alles. Detaillierte Informationen über das Kursprogramm erhalten Sie während der Webinar, das am 24. Januar stattfindet.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster