Ist es möglich, ein sudo-Frontend (wie gksudo) zu verwenden, um die Privilegien des aktuellen Prozesses zu erhöhen? Ich weiß, dass ich Folgendes tun kann:
%Vor%Aber ich bin daran interessiert:
%Vor%Ich schreibe in Python. Mein Anwendungsfall ist, dass ich ein Programm habe, das als Benutzer ausgeführt wird, aber möglicherweise Dateien im Lese- / Schreibmodus findet, die Root-Eigentümer 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ß, dass ich Admin-Logik und Nicht-Admin-Logik in separate Prozesse unterteilen kann, und dann den Admin-Prozess einfach als Root ausführen (mit etwas Kommunikation - Policy-Kit / dbus wäre hier gut geeignet). Aber ich hatte auf eine viel einfachere (wenn auch zugegebenermaßen risikoreichere) Lösung gehofft.
Ich denke so etwas wie die Ausführung von Solaris ppriv durch Sudo, um dann die Rechte des aktuellen Prozesses zu ändern. Was wie ein hacky-but-machbare Roundtrip aussieht. Aber soweit ich weiß, bietet Linux keinen ppriv.
(Ich bin überrascht, dass das nicht schon offensichtlich ist; es scheint eine nicht ungewöhnliche Sache zu sein und scheint nicht ein Sicherheitsloch zu sein, um eine Eskalation während der Eskalation zuzulassen eines neuen Prozesses.)
Leider bin ich mir nicht bewusst, 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 Aufrufe setuid (2) / settreuid (2) / setregid (2) / setgroups (2), die jedoch alle fest verdrahtet sind, damit Sie keine Privilegien während des Aufrufs erhalten. Sie können sie nur benutzen, um Privilegien zu "verschenken", soweit ich weiß.
Wenn Sie innerhalb eines Programms mit administrativen Rechten sauber umgehen möchten, sollten Sie PolicyKit anstelle von sudo verwenden. abhängig von dem Betriebssystem, auf dem Sie Ihr Programm ausführen möchten.
Informationen zu PolicyKit für Python finden Sie unter python-slip .
Ansonsten gibt es zwei Möglichkeiten, sudo als root zu bezeichnen:
%Vor% macht Sie root und behält Ihre aktuelle Umgebung bei (entspricht sudo su
)
macht dich root und gibt dir auch die Umgebung von root (entspricht sudo su -
)
Eine andere Möglichkeit, mit dem Problem umzugehen, ist, zu berücksichtigen, dass Sie die Rechte haben, die Sie brauchen, und den Benutzer des Programms wählen zu lassen, wie Sie Ihrem Programm die Rechte geben (mit sudo / setuid / unix groups / was auch immer).
Siehe auch diese Frage zu ServerFault zum selben Thema.
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 einfällt, eine setuid restricted shell , die nur die Befehle ausführen kann, an denen Sie interessiert sind. Sie können dann die Funktionen subprocess.Popen
verwenden, um Ihren Befehl mit dieser eingeschränkten Shell auszuführen, die ihn mit erhöhten Rechten ausführen wird.
Ich frage mich, ob das funktionieren würde:
Fügen Sie Ihrem System eine weitere Gruppe hinzu, installieren Sie das Skript als Root-Programm und lassen Sie die sudoers-Datei eine Zeile enthalten, die die Ausführung des Skripts durch diese Gruppe ermöglicht. 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 Account ausgeführt werden, der die spezielle Gruppe in der Gruppe hat, nachdem das Account-Passwort am Anfang angegeben wurde.
Siehe Sudo-Handbuch für andere Optionen.
Sie möchten sich mit PAM authentifizieren. Es gibt ein Beispiel hier .