Der Prozess selbst muss setuid (2) aufrufen. Sie sollten auch untersuchen, wie Sie es in chroot (8) ausführen, wenn Sie es noch nicht sind. Soweit ich weiß, gibt es für root keine Möglichkeit, die UID eines anderen Prozesses zu ändern.
Wenn der Grund, warum Sie es als Root ausführen, darin besteht, Ports zu binden, würde ich empfehlen, es als normaler Benutzer auf einem höheren Port auszuführen und ipfw (8) unter OS X zu verwenden, um Port 80/443 / etc an den höheren Port weiterzuleiten:
http://support.crashplanpro.com/doku.php/recipe/forward_port_443_to_pro_server_on_mac_osx
setuid()
Allein zu telefonieren ist absolut nicht genug.sudo tcpdump -Z
verwendet initgroups (3), setgid (2) und setuid (2), um die Root-Berechtigungen seines eigenen Prozesses zu löschen.quelle
initgroups
,setgid
,setuid
(Endlich!) Ist genau das richtige Paradigma auf Unix, und immer befolgt werden sollte. Darüber hinaus überprüft eine verantwortliche "Droproot" -Funktion, ob ihre UID und GID tatsächlich festgelegt wurden, selbst wenn alle drei Hauptfunktionen erfolgreich waren.Sie können Befehle wie andere Benutzer ausführen, indem Sie
su
:Läuft
COMMAND
mit BerechtigungenUSER
.Beachten Sie, dass standardmäßig
su
der Shell-Interpreter des Zielbenutzers zum Ausführen des Befehls verwendet wird. Im Gegensatz dazu wird standardmäßigsudo
dasCOMMAND
als eigenständiges Programm behandelt, das in der aktuellen Umgebung ausgeführt wird. Natürlich können diese Standardverhalten mit verschiedenen Schaltern und Umgebungsvariablen geändert werden.quelle
su
es nicht funktionieren, wenn in USERNAME keine Shell definiert ist (oder/bin/false
), während sudo funktioniert.su
-s
su
sudo
Zum Löschen von Berechtigungen benötigen Sie einen Benutzer ohne Rootberechtigung. Dann müssen Sie nur noch zu diesem Benutzer wechseln:
Beachten Sie, dass dies im Programm selbst und nicht in einem Wrapper-Skript erfolgt. Viele Programme benötigen Root-Rechte für einen bestimmten Zweck (z. B. zum Binden an einen Port mit niedriger Nummer), benötigen danach jedoch kein Root mehr. Diese Programme starten also als root, löschen jedoch Berechtigungen, sobald sie nicht mehr benötigt werden.
Wenn Sie überhaupt keine Root-Rechte benötigen, führen Sie sie einfach nicht als Root aus. Z.B:
quelle
setuid
Funktion legt nur die effektive UID fest, nicht die tatsächliche UID. Sie sollten verwenden,setreuid
wenn Sie nicht möchten, dass der Prozess die Berechtigungen zurückerhält. (Und der obige Code behandelt auch keine zusätzlichen Gruppenrechte. Er ist nur zum Starten von meist vertrauenswürdigem Code geeignet.)setuid()
echte und gespeicherte Benutzer-IDs. Sie können daran denkenseteuid()
. Nicht alle Systeme habensetreuid()
, daher kann es nicht überall verwendet werden. Die genaue Semantik vonsetuid()
ist kompliziert, aber wenn Sie euid 0 haben, können Sie alle herkömmlichen Benutzer-ID-Berechtigungen mit löschensetuid()
. Die größte Lücke in dieser Antwort ist, dassinitgroups
odersetgroups
muss sowiesetgid
und aufgerufen werdensetuid
, und dass am Ende gründlichere Aussagen gemacht werden sollten.Wenn Sie eine andere ausführbare sind ausgeführt wird , dh Sie anrufen
execve
oder eine andere derexec
Familie der Funktion, vielleicht indirekt durch eine Funktion wiesystem
oderpopen
, und das Kind Prozess sollte ohne Privilegien von Anfang an laufen, dann ist der einfachste Weg ist , eine bekommen Shell beteiligt, und anrufensu
. Hier ist eine Übersicht darüber, wie der Code in Perl aussehen könnte, mit den Anführungszeichen für:Wenn der untergeordnete Prozess als Root gestartet werden muss, aber später Berechtigungen löschen muss, lesen Sie den Code in dieser Antwort , der veranschaulicht, wie Berechtigungen in einem Prozess herabgestuft werden.
quelle