Wie zu verwenden setuid() von root zu user, mit der Möglichkeit, immer wieder auf root später?
Ich versuche zu tun, die sichere Sache, und ein Programm haben, das muss als root läuft, um zu lassen Ihre Vorteile, wenn Sie es nicht benötigen. Dies funktioniert gut, wenn ich chmod
meine binary mit dem SUID-bit, und machen es gehören root, als jetzt habe ich UID = einige Benutzer, und EUID = root, so kann ich mit seteuid(0)
und seteuid(getuid())
entsprechend zu erhöhen und die drop-admin-Rechte.
Aber wenn ich sudo
statt setzen der SUID, dann UID= EUID == 0, und so ruft seteuid(getuid())
keine Wirkung haben. Und ich kann nicht einfach ändern UID
auf einen Wert von einigen zufälligen Benutzer, als der setuid()
Mann Seite klar, dass wenn er aufgerufen wird, ein Programm als root ausgeführt werden, verliert man die Rechte für das gute, ohne Hoffnung Sie wieder.
So, wie mache ich mein Programm verlieren vorübergehend Ihre Privilegien bei der Ausführung mit sudo
?
- Brauchen Sie, um zurückzukehren, um die UID des Benutzers, der lief
sudo
oder nur um eine zufällige, weniger privilegierten Benutzer? - Ich werde dich für
nobody
. aber wenn Sie wissen, ein einfacher Weg, um die sudo-Anrufer, ich bin interessiert. - meh, es ist einfach, müssen nur
getenv("SUDO_UID")
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
seteuid(some random uid)
ablegen von Privilegien,seteuid(0)
um Sie zurück zu bekommen, wenn die Ausführung alsroot
.sudo
- wenn die OP braucht, um wieder zu gehen, die Benutzer?Wie es scheint, seteuid(x) sollte fallen und re-raise den privs...
Nicht eine direkte Antwort, möchte nur verweisen Sie auf die Idee,privilege separation. Hier ist eine große Präsentation von OpenBSD-Gründer Theo de Raadt.
Fork() auf, bevor Sie Privilegien aufgeben. Warten in der übergeordneten Aufgabe, bis das Kind mit geringeren rechten gemacht wird, dann wieder die Eltern mit root.
seteuid ist nicht portabel auf alle UNIX-Derivate und andere Nachteile zu.