Upstart: разрешение обычному пользователю остановиться и запустить мой пользовательский сервис

16

У меня есть приложение веб-сервера, запускающееся при загрузке с использованием 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

Это работает безупречно на сервере Ubuntu 10.04 LTS, и я очень рад этому.

Однако у меня есть сценарий оболочки развертывания, который входит в систему с использованием SSH как mainuser(это не sudoer), а затем обновляет рабочий каталог до последней версии развертывания.

Проблема здесь заключается в том, что служба должна быть перезапущена, чтобы приложения загружали новые исходные файлы. Тем не менее, mainuserполучает ...

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

... при попытке остановить это. Я должен бежать sudo stop webapp, но этот пользователь не может сделать это, поскольку он не sudoer. Из соображений безопасности я не хочу, чтобы он тоже был sudoer, плюс я не хочу вставлять пароль sudo.

Итак, как я могу mainuserзапустить stop webappи start webapp?

Том
источник
1
Какие проблемы безопасности вас беспокоят, добавляя пользователя в sudoers? Вы можете написать правило, которое позволяет пользователю только определенную команду и не более, также вы можете включить опцию nopasswd, чтобы скрыть запрос пароля. Что касается конкретной ошибки, которую вы получаете, то это потому, что start / stop находятся в / sbin, что обычно не является частью пути обычного пользователя. Таким образом, вы можете сделать "/ sbin / stop" или добавить sbin к пути. Это может работать до тех пор, пока в скрипте start / stop нет других элементов, для которых требуется root.
Дерек Прессналл
@DerekPressnall, спасибо, но когда я бегу, /sbin/stop webappя получаю stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. Как бы я позволил mainuserвыполнить только эту команду?
Том
Ошибка является результатом того, что этот пользователь не имеет прав администратора.
Том

Ответы:

31

sudo очень настраиваемый, вы можете позволить этому пользователю выполнять ограниченный набор команд без запроса пароля. Следующая строка /etc/sudoersдолжна делать то, что вы хотите:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp
mgorven
источник
1
Отлично, спасибо большое. Вы действительно узнали все это от man sudoers? Мне было довольно сложно разобрать.
Том
1
Нет, я делал это раньше. Это не самая простая man-страница для расшифровки :-)
mgorven
Сбой с Unable to connect to system bus. Дополнительная информация: Разрешить группе, не относящейся к sudo, управлять заданием Upstart
ciastek