Upstart: consentire a un utente normale di interrompere e avviare il mio servizio personalizzato


16

Ho la mia applicazione web server a partire all'avvio usando upstart. Questo è lo script upstart:

# 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

Funziona perfettamente sul server Ubuntu 10.04 LTS e ne sono molto contento.

Tuttavia, ho uno script di shell di distribuzione che accede utilizzando SSH come mainuser(questo non è un sudoer) e aggiornerà quindi la directory di lavoro all'ultima versione di distribuzione.

Il problema qui è che il servizio deve essere riavviato in modo che le applicazioni carichi i nuovi file di origine. Tuttavia, mainuserottiene un ...

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

... quando si cerca di fermarlo. Devo correre sudo stop webapp, ma questo utente non può farlo poiché non è un sudoer. Per motivi di sicurezza, non voglio nemmeno che sia un sudoer, inoltre non voglio inserire la password di sudo.

Quindi, come posso consentire mainuserl'esecuzione stop webappe start webapp?


1
Quali problemi di sicurezza ti preoccupano aggiungendo l'utente ai sudoer? Puoi scrivere una regola che consenta all'utente solo un comando specifico e non di più, inoltre puoi includere un'opzione nopasswd per tenere lontana la richiesta della password. Per quanto riguarda l'errore specifico che stai ricevendo, è perché start / stop sono in / sbin, che di solito non fa parte del percorso degli utenti normali. Quindi puoi fare "/ sbin / stop" o aggiungere sbin al percorso. Questo può funzionare fino a quando non ci sono altri elementi nello script start / stop che richiedono root.
Derek Pressnall,

@DerekPressnall, grazie, ma quando corro /sbin/stop webappottengo stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. Come consentirei mainuserdi eseguire solo questo comando?
Tom,

L'errore è dovuto al fatto che l'utente non dispone dei diritti di amministratore.
Tom,

Risposte:


31

sudo è molto configurabile, è possibile consentire a questo utente di eseguire un set limitato di comandi senza richiedere una password. La seguente riga in /etc/sudoersdovrebbe fare quello che vuoi:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp

1
Eccellente, grazie mille. Hai davvero imparato tutto questo da man sudoers? L'ho trovato abbastanza difficile da analizzare.
Tom,

1
No, l'ho già fatto prima. Non è la manpage più semplice da decifrare :-)
mgorven

Non riesce con Unable to connect to system bus. Altro: Consenti al gruppo non sudo di controllare il processo di
avvio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.