2009-09-30 21 views
9

Auf einer Linux-Box möchte ich ein Python-Skript als ein anderer Benutzer ausführen.Python-Skript als anderer Benutzer ausführen

Ich habe bereits ein Wrapper-Programm in C++ erstellt, das das Skript aufruft, da ich festgestellt habe, dass die Eigentümerschaft des Skripts durch den Besitz des Python-Interpreters entschieden wird. Danach ändere ich das C++ Programm zu einem anderen Benutzer und führe das C++ Programm aus.

Dieses Setup scheint nicht zu funktionieren. Irgendwelche Ideen?

+0

Haben Ihre anderen Benutzer nicht die Berechtigung, 'python' auszuführen? – Arkady

+2

Es geht nicht darum, Python auszuführen. Das Skript muss Dinge tun, die bestimmte Berechtigungen benötigen. Ich möchte nicht allen Benutzern diese Berechtigungen erteilen. Das Skript verhält sich gewissermaßen wie ein kontrollierter Berechtigungsgeber, aber zuerst benötigt das Skript selbst die Berechtigungen ... – johannix

+0

@johannix Ich bin auch auf das genaue Problem gestoßen. Haben Sie eine Problemumgehung gefunden? – Anubis

Antwort

4

Es klingt wie Sie das setuid Bit

+0

Beachten Sie, dass dadurch nicht alle Umgebungsvariablen geändert werden. dh '~ /' wird immer noch auf '/ home/old_user /' expandiert, was im weiteren Verlauf Probleme verursachen könnte. –

0

Verwenden Sie den Befehl sudo.

Um ein Programm als Benutzer auszuführen, muss das System diesen Benutzer "authentifizieren".

Offensichtlich kann root jedes Programm als jeder Benutzer ausführen, und jeder Benutzer kann su an einen anderen Benutzer mit einem Kennwort.

Das Programm sudo kann so konfiguriert werden, dass eine Gruppe von Benutzern einen bestimmten Befehl als bestimmten Benutzer an sudo senden kann. So können Sie beispielsweise eine Gruppe scriptUsers und einen Benutzer scriptRun erstellen. Konfigurieren Sie dann sudo so, dass jeder Benutzer in scriptUsers nur scriptRun wird, um Ihr Skript auszuführen.

+0

sudo kann nicht verwendet werden, da das Skript von anderen Personen verwendet werden muss. – johannix

1

Geben Sie diesen Benutzern die Möglichkeit, sudo su $dedicated_username und passen Sie die Berechtigungen auf Ihrem System, so dass $dedicated_user hat ausreichend, aber nicht übermäßig, Zugriff.

11

Sie verwenden möchten, den Benutzer mit os.setuid einstellen(), und Sie können die uid mit PWD erhalten. Wie so:

>>> import pwd, os 
>>> uid = pwd.getpwnam('root')[2] 
>>> os.setuid(uid) 

Offensichtlich funktioniert dies nur, wenn der Benutzer oder ausführbar ist berechtigt, dies zu tun. Wie genau ich das einrichten soll, weiß ich nicht. Offensichtlich funktioniert es, wenn Sie root sind. Ich denke, dass Sie möglicherweise das Setuid-Flag in der ausführbaren Python-Datei benötigen, und das würde eine WHOPPING-Sicherheitslücke hinterlassen. möglich, das ist zulässig, wenn der Benutzer, den Sie ebenfalls festlegen, ein dedizierter eingeschränkter Benutzer ist, der nichts tun kann, außer was immer Sie tun müssen.

Unix-Sicherheit, basierend auf Benutzern und Einstellungen und Sachen, ist nicht sehr gut oder praktisch, und es ist einfach, große Sicherheitslücken zu hinterlassen. Eine sicherere Möglichkeit ist es, diesen Client-Server typisch zu machen, also haben Sie einen Dämon, der alles macht, und der Kunde spricht mit ihm. Der Dämon kann dann mit einer höheren Sicherheit als die Benutzer laufen, aber die Benutzer müssten beim Ausführen des Skripts einen Namen und ein Passwort angeben oder sich mit einem öffentlichen/privaten Schlüssel oder dergleichen identifizieren.

+0

Ich habe diesen Code in einem Skript verwendet, das von einem Ubuntu-Init-Skript ausgeführt wurde, und es erforderte das Setuid-Bit für die ausführbare Python-Datei NICHT. – EarlCrapstone

+0

Es funktioniert ohne Setuid-Bit, wenn Sie root oder sudo das Skript sind. –

Verwandte Themen