Я пытаюсь настроить задание Upstart для запуска при запуске системы, и это также может запускаться / останавливаться членами группы, отличной от sudo
. В предыдущей версии я использовал update-rc.d
и скрипты, хранящиеся в /etc/init.d/
, чтобы заставить это работать, добавив %Group ALL = NOPASSWD: /etc/init.d/scriptname
в мой файл sudoers, но, похоже, я не могу получить эквивалентную работу для Upstart.
Я попытался добавить %Group ALL = NOPASSWD: /sbin/initctl start jobname
в файл sudoers, но попытка запустить команду start jobname
приводит к этой ошибке:
start: Rejected send message, 1 matched rules; type="method_call", sender=":1.21" (uid=1000 pid=5148 comm="start jobname " interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")
Насколько я могу судить, это жалоба на то, как мой пользователь учетная запись не имеет права отправлять сообщения «Пуск» в файле конфигурации D-Bus для Upstart. Мне не удалось найти какую-либо информацию о том, как отредактировать этот файл, чтобы дать группе разрешение на доступ к определенной службе - существует ли такая опция? Есть ли способ отредактировать файл Sudoers, чтобы я мог выполнить задание без редактирования файла конфигурации? Мне лучше просто придерживаться предыдущей версии?
Вы можете начать с выяснения, где хранится конфигурация D-Bus, специфичная для Upstart. Видите этот фрагмент destination="com.ubuntu.Upstart"
из сообщения об ошибке? Теперь попробуйте выполнить поиск в папке с файлами конфигурации D-Bus:
vhost07:~ $ grep -r "com.ubuntu.Upstart" /etc/dbus-1
/etc/dbus-1/system.d/Upstart.conf: <allow own="com.ubuntu.Upstart" />
[...skipped...]
Этот файл Upstart.conf
содержит несколько примеров политик. Я думаю, вы могли бы попытаться выяснить формат политики из них. Затем попробуйте разрешить вашему конкретному пользователю только те действия, которые ему необходимы. Например, как в:
<policy user="pope_benedict">
<allow send_destination="com.ubuntu.Upstart"
send_interface="com.ubuntu.Upstart0_6.Job"
send_member="Start"/>
</policy>
Это должно позволить пользователю pope_benedict
начать эту работу.
Обратите внимание, что значения атрибутов политики «allow» перечислены в исходном сообщении об ошибке.
Как указывалось выше, у демона dbus есть файл конфигурации, который специализирует его для конкретного приложения.
ls /etc/dbus-1/system.d/
avahi-dbus.conf
bluetooth.conf
...
Upstart.conf
wpa_supplicant.con
Файл конфигурации также устанавливает ограничения ресурсов, параметры безопасности и т. Д.
Подробнее см. dbus-daemon-1 (1) - страница руководства Linux
. Чтобы позволить группе запускать / останавливать задания Upstart, добавьте следующую политику в /etc/dbus-1/system.d/Upstart.conf
<policy group="YourGroupName">
<allow send_destination="com.ubuntu.Upstart"
send_interface="com.ubuntu.Upstart0_6.Job"
send_type="method_call" send_member="Start" />
<allow send_destination="com.ubuntu.Upstart"
send_interface="com.ubuntu.Upstart0_6.Job"
send_type="method_call" send_member="Stop" />
</policy>
Следует рассмотреть последствия такой политики для безопасности перед изменением политики по умолчанию. Члены YourGroupName смогут запускать / останавливать все задания Upstart.
Такая опция не существует в sudo.
Разница между сценариями Sysv и файлами конфигурации Upstart заключается лишь в том, что сценарии Sysv являются сценариями, исполняемыми файлами сами по себе, и вы можете указать sudo, чтобы какая-то группа могла их выполнять. С другой стороны, файлы конфигурации Upstart - это просто файлы конфигурации, а не исполняемые файлы, поэтому выполнение start
(символическая ссылка на initctl
) - это то, что позволяет sudo. Ваша проблема здесь в том, что, позволяя людям запускать initctl
, вы позволяете им initctl
все.
Решение, хотя и простое, если вы заботитесь только об одной работе. Создайте сценарий, скажите /usr/bin/jobname.sh
с
#!/bin/sh
initctl $1 jobname
, затем chmod 755 /usr/bin/jobname.sh
и, наконец, добавьте этот исполняемый файл в файл sudoers:
%Group ALL = NOPASSWD: /usr/bin/jobname.sh
Таким образом, каждый может позвонить jobname.sh start
или jobname.sh stop
, чтобы контролировать эту конкретную работу. Возможно, вы захотите добавить некоторые проверки, чтобы разрешить только параметры start
и stop
и т. Д.
Я лично использую следующую строку в файле /etc/sudoers.d/jobname_myuser:
myuser ALL = (root) NOPASSWD: /sbin/start jobname, /sbin/stop jobname, /sbin/restart jobname, /sbin/status jobname
, как описано здесь: https://serverfault.com/a/390723/ 68608