2017-04-04 1 views
0

Ich muss ein kleines Capability-System für Linux ähnlich Plan 9 cap Gerät implementieren. Host-Besitzer (root in Linux) ermöglicht user1 zu imitieren user2 Schreiben [email protected]@random-string zu /dev/caphash. Jeder user1 Prozess, der random-string kennt, kann seinen uid zu user2 schreiben [email protected]@random-string zu /dev/capuse ändern.Changin UID/GID eines laufenden nicht-provilegierten Prozesses

Unter Linux kann jeder privilegierte Prozess einen beliebigen unprivilegierten Benutzer mit dem Systemaufruf setuid(2) imitieren, aber ich kenne keinen Mechanismus, der horizontale Identitätswechsel zulässt. Wie macht Linux das?

Antwort

1

Serge E. Hallyn vorgelegt p9auth auf die Linux-Kernel-Mailingliste im April 2010, die ziemlich viel diese Funktionalität zur Verfügung gestellt hätte (wenn auch in der letzten eingereichten Form, mit einer etwas anderen Schnittstelle). Leider war es nicht im Linux-Kernel enthalten.

Das zugrunde liegende Sicherheitsparadigma in Linux ist vertikal und nicht horizontal.

Privilegien sind in capabilities unterteilt und können zur Laufzeit nur erworben werden. Zusätzliche Berechtigungen können jederzeit gelöscht werden. In der Praxis verwenden Sie Dateisystemfunktionen und das Dienstprogramm setcap, um einer nicht privilegierten Binärdatei bei ihrer Ausführung bestimmte Funktionen zu geben, unabhängig von der Identität des Benutzers, der sie ausführt. (Mit Linux-Kernel 2.6.33 und höher ist es nicht mehr möglich, dass ein Prozess die Fähigkeiten eines anderen laufenden Prozesses ändert.)

Der entscheidende Punkt ist, dass in Linux nur ein privilegierter Prozess (ein Prozess mit Die CAP_SETUID) kann zur Laufzeit ihre Identität ändern.

Mit anderen Worten, dem Punkt exec wird in Linux zur Erhöhung von Berechtigungen verwendet, mit dem nun privilegierten binären Wechsel in dem angegebenen Benutzer (und/oder eine Gruppe und vielleicht ergänzende Gruppen), fällt zusätzliche Privilegien. Mir ist kein Mechanismus bekannt, der es einem unprivilegierten Prozess erlauben würde, seine credentials ohne exec zu ändern.

Für das OP bedeutet dies, dass die Schnittstelle Plan 9 (/dev/caphash, /dev/capuse) nicht funktioniert. Eine vergleichbare Linux-Schnittstelle, die im Benutzerbereich implementiert ist, erfordert die Ausführung einer Binärdatei als Teil der Änderung der Anmeldeinformationen. Ansonsten weiß ich nicht genug über die Anwendungsfälle von OP, um Vorschläge zu machen.

Im Kernel ist eine solche Schnittstelle offensichtlich möglich (wie der erste Link in dieser Antwort zeigt), die in den Vanilla-Kernel nicht verfügbar ist.

0

In Linux (und in Unix im Allgemeinen) gibt es ein ähnliches Feature, das mit einer der Bit-Berechtigungen einer ausführbaren Datei zu tun hat. Wenn Sie eine ausführbare Binärdatei haben, die als setuid Bit markiert ist, führt der Kernel beim Ausführen dieser Datei diese ausführbare Datei aus, indem er die effektive Benutzer-ID des Prozesses auf den Besitzer dieser Datei setzt. Der Mechanismus funktioniert also, wenn Sie Ausführungsberechtigungen zum Ausführen dieser Datei haben. Angenommen, Sie möchten, dass Benutzer a, b und c Benutzer d bei der Ausführung eines Programms imitieren. Sie erstellen zuerst eine Gruppe von Benutzern (Gruppe setuid_d) im System und setzen sie auf alle Benutzer a, b und c. dann erstellen Sie die ausführbare Datei, damit sie zum Benutzer d und zur Gruppe setuid_d gehört. Sobald dies wurde von der Gruppe der Datei ausführbar gemacht, wie Benutzer d oder als root macht nur setuid_d und aktiviert die eingestellte uid Bit in den Berechtigungen

$ chgrp setuid_d program 
$ chown d program 
$ chmod ug+x,o-x,u+s program 
$ program # you'll be effectively user d when executing program 
+0

Frage ist mehr API als CLI orientiert, aber ich werde diese Option auch überprüfen. – user3368561

Verwandte Themen