Führen Sie einen Befehl als anderer Benutzer innerhalb von Apache aus

Führen Sie einen Befehl als anderer Benutzer innerhalb von Apache aus

Ich habe eine Webanwendung, die ein Programm ausführt, das X benötigt. Ich verwende xvfb, um es zu starten; ich möchte es als anderer Benutzer ausführen.

Das könnte ich wahrscheinlich tun sudo -u username -p password my command. Allerdings bin ich nicht so begeistert davon, das Benutzerkennwort im Klartext zu speichern.

Gibt es eine „intelligentere“ Möglichkeit, dies zu tun?

Antwort1

VerwendensuEXECDadurch kann ein Skript als Eigentümer der Datei und nicht als Webserver-Benutzer ausgeführt werden.

Antwort2

Ich habe es so gesehen, dass dem Apache-Benutzer das Sudo-Privileg nur für diesen einen, ganz bestimmten Befehl erteilt wird (in unserem Fall „apache2ctrl restart“). Sie müssen keine Passwörter verwenden. Wenn Sie es im Klartext irgendwo speichern, wo es der Apache-Benutzer lesen kann, brauchen Sie auch keins zu haben.

Es sei denn, Sie müssen als Apache-Benutzer mehrere verschiedene Befehle über Sudo ausführen. Das könnte umständlich werden, wenn Sie für jeden Befehl Sudo-Berechtigungen hinzufügen müssen.

Antwort3

Wenn Sie dies irgendwann außerhalb von Apache tun müssen, finden Sie hier eine allgemeinere Lösung.

Um einem Benutzer zu erlauben, einen bestimmten Befehl wiederholt als ein anderer Benutzer auszuführen, können Sie ein Shell-Skript erstellen, das diesem Benutzer gehört, mit demsetuidBit aktiviert, das einfach den benötigten Befehl ausführt. Stellen Sie sicher, dass das Skript nur von vertrauenswürdigen Benutzern ausführbar ist, indem Sie den Gruppenbesitz auf die Apache-Gruppe setzen (stellen Sie sicher, dass sich keine anderen Benutzer in dieser Gruppe befinden) und die Ausführungsberechtigung für alle anderen außer der Apache-Gruppe und Ihrem Benutzer deaktivieren.

Ein Beispiel:

# Replace $MYCOMMAND, $USERNAME, $GROUPNAME, and $MYSCRIPTNAME below
# In this case $GROUPNAME should probably be apache
su
touch $MYSCRIPTNAME
chown $USERNAME:$GROUPNAME $MYSCRIPTNAME
chmod 4750 $MYSCRIPTNAME # setuid, read/execute for group, none for others
echo '#!/bin/sh' >> $MYSCRIPTNAME
echo "sudo -u $USERNAME $MYCOMMAND" >> $MYSCRIPTNAME

Antwort4

Vielleicht ist es jetzt ein bisschen spät für eine Antwort, aber ich bin der Meinung, dass diese NOPASSWDFunktion sudoerwähnt werden muss.

Beispielsweise in /etc/sudoers(vorausgesetzt, Apache ist der Benutzer, der den Webserver betreibt):

User_Alias WWW = apache

WWW ALL =(username) NOPASSWD: my_command

Und rufen Sie auf sudo -u username my_command. Sie müssen das Passwort nicht speichern und erlauben dem Webserver nur die Ausführung my_commandals Benutzername.

Der Benutzer usernamekann sein Passwort weiterhin behalten.

verwandte Informationen