Upstart: Ermöglichen, dass ein normaler Benutzer meinen benutzerdefinierten Dienst beendet und startet

16

Ich habe meine Webserver-Anwendung beim Booten mit upstart gestartet. Dies ist das Upstart-Skript:

# web app node upstart file at /etc/init/webapp.conf

description "web application"

start on started mongodb
stop on runlevel [06]

respawn
respawn limit 10 100

env NODE_ENV=production

pre-start script
    ulimit -n 2048
end script

exec start-stop-daemon --start -c mainuser --exec /usr/bin/make -- -C /home/mainuser/app start-prod

Dies funktioniert einwandfrei auf Ubuntu Server 10.04 LTS und ich bin sehr glücklich darüber.

Ich habe jedoch ein Deployment-Shell-Skript, das sich mit SSH als anmeldet mainuser(dies ist kein Sudoer) und dann das Arbeitsverzeichnis auf die neueste Deployment-Version aktualisiert.

Das Problem hierbei ist, dass der Dienst neu gestartet werden muss, damit die Anwendungen die neuen Quelldateien laden. Allerdings mainuserbekommt ein ...

mainuser@Saturn101:~$ stop webapp
-bash: stop: command not found

... beim Versuch, es zu stoppen. Ich muss ausführen sudo stop webapp, aber dieser Benutzer kann dies nicht, da er kein Sudoer ist. Aus Sicherheitsgründen möchte ich, dass er auch kein Sudoer ist, und ich möchte das Sudo-Passwort nicht einfügen.

Also, wie erlaube ich mainuserzu rennen stop webappund start webapp?

Tom
quelle
1
Über welche Sicherheitsprobleme sorgen Sie sich, wenn Sie den Benutzer zu sudoers hinzufügen? Sie können eine Regel schreiben, die dem Benutzer nur einen bestimmten Befehl und nicht mehr erlaubt. Sie können auch die Option nopasswd einschließen, um die Kennworteingabeaufforderung fernzuhalten. Was den spezifischen Fehler anbelangt, den Sie erhalten, liegt dies daran, dass sich Start / Stopp in / sbin befinden, was normalerweise nicht zum normalen Benutzerpfad gehört. Sie können also "/ sbin / stop" ausführen oder sbin zum Pfad hinzufügen. Dies funktioniert möglicherweise, solange das Start / Stopp-Skript keine anderen Elemente enthält, für die root erforderlich ist.
Derek Pressnall
@DerekPressnall, danke, aber wenn ich renne /sbin/stop webappbekomme ich stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. Wie würde ich erlauben mainuser, nur diesen Befehl auszuführen?
Tom
Der Fehler ist darauf zurückzuführen, dass dieser Benutzer keine Administratorrechte besitzt.
Tom

Antworten:

31

sudo ist sehr konfigurierbar. Sie können diesem Benutzer erlauben, einen begrenzten Satz von Befehlen auszuführen, ohne nach einem Passwort zu fragen. Die folgende Zeile in /etc/sudoerssollte tun, was Sie wollen:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp
mgorven
quelle
1
Sehr gut, vielen Dank. Hast du das alles wirklich gelernt man sudoers? Ich fand es ziemlich schwierig zu analysieren.
Tom
1
Nein, das habe ich schon mal gemacht. Es ist nicht die am einfachsten zu entschlüsselnde Manpage :-)
mgorven
Scheitert mit Unable to connect to system bus. Mehr: Zulassen, dass Nicht-Sudo-Gruppen den Upstart-Job kontrollieren
ciastek