2009-12-28 10 views
9

Ist es möglich, ein Sudo-Frontend (wie Gksudo) zu verwenden, um die Privilegien des aktuellen Prozesses zu erhöhen? Ich weiß, ich kann folgendes tun:Wie sud ich den aktuellen Prozess?

sudo cat /etc/passwd- 

Aber ich bin interessiert dies tun:

sudo-become-root # magic function/command 
cat /etc/passwd- 

ich in Python zu schreiben. Mein Anwendungsfall ist, dass ich ein Programm habe, das als Benutzer ausgeführt wird, aber möglicherweise Dateien zum Lesen/Schreiben, die root-Besitz sind. Ich möchte zur Eingabe eines Kennworts auffordern, Root-Rechte erlangen, tun, was ich brauche, und dann optional die Zugriffsrechte wieder löschen.

Ich weiß, ich könnte Admin-Logik und Nicht-Admin-Logik in separate Prozesse trennen, und dann nur den Admin-Prozess als root (mit einigen Kommunikation - PolicyKit/dbus wäre eine gute Passform hier). Aber ich hatte auf eine viel einfachere (wenn auch zugegebenermaßen risikoreichere) Lösung gehofft.

Ich denke so etwas wie Ausführen von Solaris ppriv durch Sudo, um dann die Berechtigungen des aktuellen Prozesses zu ändern. Was wie ein hacky-but-machbare Roundtrip aussieht. Aber soweit ich weiß, bietet Linux keinen PPriv an.

(Ich bin überrascht, das ist nicht offensichtlich bereits; es scheint wie eine nicht-ungewöhnliche Sache zu wollen und nicht scheinen scheinen eine Sicherheitslücke zu Eskalation im Prozess über Eskalation eines neuen Prozesses zu ermöglichen . ist

)
+0

Wenn Sudo für Sie arbeitet, was ist mit su? – Dani

+0

AFAIK, su würde mir eine Subshell zum Arbeiten geben. Was für die interaktive Nutzung in Ordnung ist. Aber ich möchte die Privilegien des gerade laufenden Prozesses erhöhen, keinen Shell-Subprozess. –

+0

Das ist nicht wirklich eine Antwort, aber ich sehe den OpenSSH-Quellcode gerne als ein Modell für die Manipulation und Trennung von Privilegien. Im Gegensatz zu Ihrem cae denke ich, dass der ssh-Daemon mit erhöhten Rechten beginnt und dann weniger privilegierte Kinder selektiv abzweigt. –

Antwort

1

Leider weiß ich nicht, wie Sie sauber machen können. Ich denke, Ihre beste Wette ist, das Programm setuid (oder führen Sie es unter sudo) und dann entweder Ihre schmutzige Arbeit und Drop-Berechtigungen oder fork() und drop Berechtigungen von einem Prozess und halten Sie den anderen herum, um Ihre root-Arbeit zu tun .

Was Sie suchen, sind die setuid (2)/settreuid (2)/setregid (2)/setgroups (2) Anrufe, aber sie sind alle fest verdrahtet, damit Sie keine Privilegien Mitte Aufruf erhalten. Sie können sie nur benutzen, um Privilegien zu "verschenken", soweit ich weiß.

+0

Yar, das scheint der Fall zu sein. Ah, gut. Ich nehme an, es gibt gute Gründe, warum es irgendwie schlimmer ist, Privilegien während der Aufrufe zu erhalten, als wenn man etwas mit Privilegien wieder aufrufen könnte. Sucht nach einem anderen Weg, zu tun, was ich wollte. Danke allen! –

0

Ihre magische Funktion/Befehl

sudo su 
+0

oder vielleicht 'sudo $ SHELL' –

+0

Das wäre in Ordnung, wenn ich es interaktiv mache, aber ich muss das programmatisch tun. –

0
echo 'echo tee; echo hee'|sudo -s 

Der Ausgang könnte:

tee 
hee 
2

Wenn Sie innerhalb eines Programms mit administrativen Rechten sauber umgehen möchten, sollten Sie möglicherweise PolicyKit anstelle von sudo verwenden, abhängig davon, auf welchem ​​Betriebssystem Sie Ihr Programm ausführen möchten.

Für PolicyKit für Python, siehe python-slip.

Ansonsten gibt es zwei Möglichkeiten, sudo zu nennen root zu werden:

sudo -s 

werden Sie root machen und Ihre aktuelle Umgebung halten (entspricht sudo su)

sudo -i 

werden Sie root machen und Geben Sie auch die Umgebung von root an (entspricht sudo su -)

Eine andere Möglichkeit, sich mit dem Problem zu befassen, ist, dies zu berücksichtigen die Rechte, die Sie benötigen, und lassen Sie den Benutzer des Programms wählen, wie Sie die Rechte für Ihr Programm geben (mit sudo/setuid/Unix-Gruppen/was auch immer sonst).

Siehe auch this question on ServerFault zum selben Thema.

+0

Richtig, aber das würde die Trennung von Admin- und Nicht-Admin-Code erfordern, die ich vermeiden möchte. –

+4

Michael, diese Trennung ist sehr wichtig für sich. – u0b34a0f6ae

+1

Ich stimme zu, es ist schön zu haben. Aber ich versuche im Moment minimal invasiv zu sein und war neugierig, ob es ohne die Trennung möglich ist. –

2

Aptitude hat eine "wurzeln" Option. Vielleicht möchten Sie sehen, was der Autor dort getan hat.

+7

Interessant. Scheinbar wird sich aptitude einfach mit sudo neu starten. Die Tatsache, dass sie keine bessere Lösung haben, deutet darauf hin, dass es keine gibt. –

0

Ich mag die Idee nicht, beliebige Befehle als root von einem weniger privilegierten Prozess ausführen zu können. Aber da Sie es wollen, ist eine der Ideen, die Ihnen in den Sinn kommen, ein setuidrestricted shell zu behalten, der nur die Befehle ausführen kann, an denen Sie interessiert sind. Sie können dann die subprocess.Popen-Funktionen verwenden, um Ihren Befehl mit dieser eingeschränkten Shell auszuführen, die ihn mit erhöhten Rechten ausführen wird.

+0

Ich versuche zu vermeiden, einen anderen Prozess als root ausführen zu müssen. Ich wollte den aktuellen Prozess als root ausführen. –

0

Ich frage mich, ob das funktionieren würde:

ein andere Gruppe zu Ihrem System hinzufügen, das Skript als root-Programm installiert und hat die sudoers-Datei enthält eine Zeile, die das Skript von dieser Gruppe ausgeführt werden kann. Fügen Sie die Gruppe schließlich zur Liste der Konten hinzu, die das Skript ausführen müssen.

Dann kann das Skript nur von root oder einem anderen Konto ausgeführt werden, das die spezielle Gruppe in der Gruppe hat, nachdem das Kontopasswort beim Start eingegeben wurde.

Weitere Optionen finden Sie unter Sudo Manual.

+1

Aber dann sollte die Frage auf Superuser sein ;-) –

0

Sie möchten mit PAM authentifizieren. Es gibt eine example here.

+0

Sie können Ihre UID nur ändern, wenn Sie bereits root sind (oder CAP_SETUID haben, aber wenn Sie keine speziellen Verrenkungen durchmachen, wird dies in einer normalen App nicht möglich sein). – ephemient

+0

Oh, ich habe mal ein Beispiel gesehen, das mit PAM auths ist, um einige Privilegien zu bekommen.Ich denke, root ist keiner von ihnen. Ich werde diese Antwort für andere behalten. – LiraNuna