2014-07-02 17 views
5

ich ein Python-Skript, das ich wünsche der Lage sein, als Systembenutzer ausgeführt werden guybrush mit UID 200 und Gruppe guybrush mit GID 200setuid/setgid-Wrapper für Python-Skript

Im Moment mein Python-Skript (befindet sich in /path/to/script.py) sieht wie folgt aus:

#!/usr/bin/env python2 
import os 

print "uid: %s" % os.getuid() 
print "euid: %s" % os.getgid() 
print "gid: %s" % os.geteuid() 
print "egid: %s" % os.getegid() 

Mein Versuch C-Wrapper (scriptwrap.c) sieht wie folgt aus:

#include <unistd.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) { 
    setuid(geteuid()); 
    setgid(getegid()); 
    return execv("/path/to/script.py", argv); 
} 

Ith en kompilieren, chown und chmod den Wrapper wie folgt:

$ gcc scriptwrap.c -o scriptwrap 
$ chown guybrush:guybrush scriptwrap 
$ chmod 6755 scriptwrap 

Doch wenn ich scriptwrap laufen lasse, erhalte ich die folgende Ausgabe:

uid: 1000 
euid: 1000 
gid: 200 
egid: 200 

aus irgendeinem Grund also nur die GID gesetzt wird (meine normale UID ist 1000). Was kann ich tun, um das zu beheben?

Edit: Wenn ich das Skript root:root chown und führen Sie es, die UID, EUID, GID und Egid sind alle auf 0 gesetzt

Auch dieses ist auf Ubuntu 12.04.4 LTS.

Antwort

5

Nun, ich habe das herausgefunden (und dabei ein bisschen gelernt). Peinlicherweise wurde mein erstes Problem durch einen Tippfehler in meinem Python-Skript verursacht: Ich druckte die GID unter dem Label euid und die eUID unter dem Label gid aus. Hoppla.

Also die EUID und eGID sind tatsächlich richtig eingestellt - großartig. Aber die UID und GID sind immer noch nicht gesetzt, trotz meiner Verwendung von setuid und setgid im C-Wrapper.

Es stellt sich heraus, dass dies auf das Verhalten von setuid zurückzuführen ist und setgid unterschiedlichen basierend darauf, ob Sie sind root oder nicht: Wenn Sie als root angemeldet sind und Sie rufen setuid, setzt Ihre reale UID und Ihre effektive UID, was auch immer Sie passieren es in, wenn Sie nicht root sind, stellt es nur die effektive UID (source). Also meine Verwendung von setuid (und setgid) sind im Wesentlichen No-Ops.

Es ist jedoch möglich, die reale UID und GID zu setzen, indem sie die setreuid und setregid Anrufe mit:

#include <unistd.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) { 
    setreuid(geteuid(), geteuid()); 
    setregid(getegid(), getegid()); 
    return execv("/path/to/script.py", argv); 
} 

, die aus dem (korrigierten) Python-Skript in der folgenden Ausgabe ergibt, wenn auszuführen:

uid: 200 
euid: 200 
gid: 200 
egid: 200