Dateiberechtigungen unter Linux

Hallo zusammen. Wir machen uns aktiv an die Arbeit und bereiten bereits viele leistungsstarke Starts im Januar vor. Unter anderem wurde die Anmeldung für einen neuen Stream des Lieblingskurses aller bekannt gegeben. „Linux-Administrator“. Im Vorfeld der Markteinführung teilen wir traditionell Übersetzungen von nützlichem Material.

Dateiberechtigungen unter Linux

Dateiberechtigungen bieten eine sichere Alternative zu SUID-Ausführungsdateien, können jedoch zunächst etwas verwirrend wirken.


Wir alle kennen diese Binärdateien SUID sind Aus Sicherheitsgründen eine schlechte Entscheidung. Glücklicherweise gibt es einen effizienteren Weg, wenn Ihre Anwendung eingeschränkte Berechtigungen erfordert Dateiberechtigungen.

Ich erspare Ihnen etwas Zeit, wenn Sie den obigen Artikel nicht im Detail lesen möchten: Dateiberechtigungen erlauben im Wesentlichen Prozesse, die als Root ausgeführt werden und daher etwas tun dürfen, um bestimmte Fähigkeiten zu behalten, begrenzt diese Listewenn sie Berechtigungen verlieren und von einem nicht privilegierten Benutzer ausgeführt werden. Das heißt, wenn es einem Angreifer gelingt, einen Prozess durch einen Pufferüberlauf oder einen anderen Exploit zu kompromittieren, kann er nur bestimmte minimale Privilegien ausnutzen, die der Prozess tatsächlich benötigt.

Berechtigungen eignen sich hervorragend für Dienste, die normalerweise immer als Root ausgeführt werden, aber was ist mit Befehlszeilendienstprogrammen? Glücklicherweise wird dies auch unterstützt, sofern Sie die richtigen Dienstprogramme installiert haben. Wenn Sie Ubuntu verwenden, benötigen Sie beispielsweise das Paket libcap2-bin. Sie müssen außerdem einen nicht-archaischen Kernel ausführen (ab Version 2.6.24).

Diese Funktionen ermöglichen die Zuordnung von Berechtigungen zu ausführbaren Dateien, ähnlich wie das Setzen des SUID-Bits, jedoch nur für einen bestimmten Satz von Berechtigungen. Dienstprogramm setcap Wird zum Hinzufügen und Entfernen von Berechtigungen zu einer Datei verwendet.

Der erste Schritt besteht darin, die benötigten Berechtigungen auszuwählen. Für diesen Artikel gehe ich davon aus, dass es ein Netzwerkdiagnosetool namens gibt tracewalk, die man nutzen sollte rohe Steckdosen. Dies erfordert normalerweise, dass die Anwendung als Root ausgeführt wird, jedoch beim Anzeigen die Liste Es stellt sich heraus, dass nur eine Genehmigung erforderlich ist CAP_NET_RAW.

Angenommen, Sie befinden sich in dem Verzeichnis, in dem sich die Binärdatei befindet tracewalk, können Sie diese Berechtigung wie folgt hinzufügen:

sudo setcap cap_net_raw=eip tracewalk

Ignorieren Sie das Suffix vorerst =eip Zur Lösung werde ich in ein paar Sekunden darüber sprechen. Beachten Sie, dass der Berechtigungsname in Kleinbuchstaben geschrieben ist. Sie können nun überprüfen, ob Sie die Berechtigungen korrekt konfiguriert haben:

setcap -v cap_new_raw=eip tracewalk

Oder Sie können alle für eine bestimmte ausführbare Datei festgelegten Berechtigungen auflisten:

getcap tracewalk

Als Referenz können Sie auch alle Berechtigungen aus der ausführbaren Datei entfernen, indem Sie Folgendes tun:

setcap -r tracewalk

Zu diesem Zeitpunkt sollten Sie in der Lage sein, die ausführbare Datei als nicht privilegierter Benutzer auszuführen und sie sollte mit Raw-Sockets arbeiten können, aber nicht über die anderen Berechtigungen verfügen, die der Root-Benutzer hat.

Was bedeutet dieses seltsame Suffix? =eip? Dies erfordert ein gewisses Verständnis der Art von Berechtigungen. Jeder Prozess verfügt über drei Berechtigungssätze: wirksam, vererbbar und zulässig:

  • Wirksam Berechtigungen sind solche, die definieren, was ein Prozess tatsächlich tun kann. Beispielsweise kann es nicht mit Raw-Sockets umgehen, wenn CAP_NET_RAW ist nicht im effektiven Satz.
  • Verfügbar Berechtigungen sind solche, die ein Prozess haben darf, wenn er sie über den entsprechenden Aufruf anfordert. Sie verhindern, dass ein Prozess tatsächlich etwas tut, es sei denn, er wurde ausdrücklich geschrieben, um diese Erlaubnis anzufordern. Dadurch können Prozesse geschrieben werden, um kritische Berechtigungen nur für den Zeitraum zum effektiven Satz hinzuzufügen, in dem sie tatsächlich benötigt werden.
  • Vererbbar Berechtigungen sind solche, die im zugänglichen Satz des erzeugten untergeordneten Prozesses vererbt werden können. Während der Operation fork() oder clone() Der untergeordnete Prozess erhält immer eine Kopie der Berechtigungen des übergeordneten Prozesses, da er zu diesem Zeitpunkt immer noch dieselbe ausführbare Datei ausführt. Eine vererbbare Menge wird verwendet, wenn exec() (oder ein Äquivalent) wird aufgerufen, um die ausführbare Datei durch eine andere zu ersetzen. Zu diesem Zeitpunkt wird die verfügbare Menge des Prozesses durch die vererbbare Menge maskiert, um die zugängliche Menge zu erhalten, die für den neuen Prozess verwendet wird.

Also der Nutzen setcap ermöglicht es uns, die Berechtigungen dieser drei Sätze unabhängig für eine bestimmte ausführbare Datei hinzuzufügen. Beachten Sie, dass die Bedeutung von Gruppen für Dateiberechtigungen etwas anders interpretiert wird:

  • Verfügbar Dateiberechtigungen sind solche, die einer ausführbaren Datei immer zur Verfügung stehen, auch wenn der übergeordnete Prozess, der sie aufgerufen hat, nicht über sie verfügt. Früher wurden sie „Zwangsgenehmigungen“ genannt.
  • Vererbt Dateiberechtigungen definieren eine zusätzliche Maske, die auch zum Entfernen von Berechtigungen aus dem Satz des aufrufenden Prozesses verwendet werden kann. Sie gelten zusätzlich zum geerbten Satz des aufrufenden Prozesses, sodass die Berechtigung nur dann vererbt wird, wenn sie in beiden Sätzen vorhanden ist.
  • Wirksam Dateiberechtigungen sind eigentlich nur ein einzelnes Bit und kein Satz. Wenn sie festgelegt sind, bedeutet dies, dass der gesamte verfügbare Satz auch in den effektiven Satz des neuen Prozesses kopiert wird. Dies kann verwendet werden, um Berechtigungen zu Prozessen hinzuzufügen, die nicht speziell für die Anforderung dieser Berechtigungen geschrieben wurden. Da es sich um ein Bit handelt, muss es für alle Berechtigungen festgelegt werden, wenn Sie es für eine beliebige Berechtigung festlegen. Man kann es sich als Legacy-Bit vorstellen, da es dazu verwendet wird, die Nutzung von Berechtigungen durch Anwendungen zu ermöglichen, die diese nicht unterstützen.

Bei der Angabe von Berechtigungen über setcap drei Buchstaben e, i и p gelten für wirksam, vererbbar und zugänglich Sätze bzw. Also die frühere Spezifikation:

sudo setcap cap_net_raw=eip tracewalk

...zeigt an, dass die Auflösung CAP_NET_RAW zu den verfügbaren und vererbbaren Mengen hinzugefügt werden müssen und dass auch das effektive Bit gesetzt werden muss. Dadurch werden alle zuvor festgelegten Berechtigungen für die Datei überschrieben. Um mehrere Berechtigungen gleichzeitig festzulegen, verwenden Sie eine durch Kommas getrennte Liste:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Berechtigungshandbuch bespricht das alles ausführlicher, aber hoffentlich hat dieser Beitrag ein wenig entmystifiziert, was vor sich geht. Es bleiben nur noch ein paar Vorbehalte und Tricks zu erwähnen.

Erstens funktionieren Dateifunktionen nicht mit Symlinks – Sie müssen sie auf die Binärdatei selbst (d. h. das Ziel des Symlinks) anwenden.

Zweitens funktionieren sie nicht mit interpretierten Skripten. Wenn Sie beispielsweise über ein Python-Skript verfügen, dem Sie Berechtigungen zuweisen möchten, müssen Sie diese dem Python-Interpreter selbst zuweisen. Offensichtlich stellt dies ein potenzielles Sicherheitsproblem dar, da dann alle mit diesem Interpreter ausgeführten Skripte über die angegebene Berechtigung verfügen, obwohl dies immer noch deutlich besser ist, als sie auf SUID zu setzen. Die häufigste Problemumgehung scheint darin zu bestehen, eine separate ausführbare Datei in C oder einer gleichwertigen Datei zu schreiben, die die erforderlichen Vorgänge ausführen und sie über ein Skript aufrufen kann. Dies ähnelt dem Ansatz von Wireshark, der eine Binärdatei verwendet /usr/bin/dumpcap um privilegierte Operationen auszuführen:

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

Drittens werden Dateiberechtigungen deaktiviert, wenn Sie eine Umgebungsvariable verwenden LD_LIBRARY_PATH aus offensichtlichen Sicherheitsgründen(1). Gleiches gilt für LD_PRELOAD, soweit ich weiß.

1. Da ein Angreifer offensichtlich eine der Standardbibliotheken austauschen und nutzen kann LD_LIBRARY_PATHum zu erzwingen, dass seine Bibliothek vorrangig gegenüber der Systembibliothek aufgerufen wird, und daher seinen eigenen beliebigen Code mit denselben Privilegien wie die aufrufende Anwendung ausführen lässt.

Das ist alles. Weitere Details zum Kursprogramm finden Sie unter Webinar, das am 24. Januar stattfinden wird.

Source: habr.com

Kommentar hinzufügen