Upstart: zezwalanie zwykłemu użytkownikowi na zatrzymanie i uruchomienie mojej usługi niestandardowej

16

Mam aplikację webserver, która uruchamia się przy starcie przy użyciu upstart. To jest skrypt wstępny:

# 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

Działa to bezbłędnie na serwerze Ubuntu 10.04 LTS i jestem z tego bardzo zadowolony.

Mam jednak skrypt powłoki wdrażania, który loguje się przy użyciu SSH as mainuser(nie jest to sudoer), a następnie zaktualizuje katalog roboczy do najnowszej wersji wdrożenia.

Problem polega na tym, że usługa musi zostać zrestartowana, aby aplikacje ładowały nowe pliki źródłowe. Jednak mainuserdostaje ...

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

... kiedy próbujesz to zatrzymać. Muszę biec sudo stop webapp, ale ten użytkownik nie może tego zrobić, ponieważ nie jest sudoerem. Ze względów bezpieczeństwa nie chcę, aby był sudoer, a ponadto nie chcę wstawiać hasła sudo.

Jak mogę pozwolić i mainuseruruchomić ?stop webappstart webapp

Tomek
źródło
1
Jakie problemy związane z bezpieczeństwem martwisz, dodając użytkownika do sudoers? Możesz napisać regułę, która zezwala użytkownikowi tylko na określone polecenie i nie więcej, możesz także dołączyć opcję nopasswd, aby nie wyświetlać monitu o hasło. Jeśli chodzi o konkretny błąd, który się pojawia, to znaczy, że start / stop znajdują się w / sbin, co zwykle nie jest częścią ścieżki zwykłego użytkownika. Możesz więc zrobić „/ sbin / stop” lub dodać sbin do ścieżki. Może to działać, o ile w skrypcie start / stop nie ma innych elementów wymagających rootowania.
Derek Pressnall
@DerekPressnall, dzięki, ale kiedy biegnę /sbin/stop webapp, dostaję stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. Jak pozwoliłbym mainuserwykonać tylko to polecenie?
Tom
Błąd wynika z braku uprawnień administratora.
Tom

Odpowiedzi:

31

sudo jest bardzo konfigurowalny, możesz zezwolić temu użytkownikowi na wykonywanie ograniczonego zestawu poleceń bez pytania o hasło. Poniższy wiersz /etc/sudoerspowinien zrobić, co chcesz:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp
mgorven
źródło
1
Doskonale, wielkie dzięki. Czy naprawdę nauczyłeś się tego wszystkiego man sudoers? Trudno mi było przeanalizować.
Tom
1
Nie, zrobiłem to wcześniej. Nie jest to najłatwiejsza strona do rozszyfrowania :-)
mgorven
Nie działa z Unable to connect to system bus. Więcej: Zezwól grupie spoza sudo na kontrolowanie zadania Upstart
ciastek