Разрешить группе non-sudo управлять заданием Upstart

Я пытаюсь настроить задание 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, чтобы я мог выполнить задание без редактирования файла конфигурации? Мне лучше просто придерживаться предыдущей версии?

11
задан 17 December 2012 в 08:02

4 ответа

Вы можете начать с выяснения, где хранится конфигурация 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» перечислены в исходном сообщении об ошибке.

0
ответ дан 17 December 2012 в 08:02

Как указывалось выше, у демона 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.

0
ответ дан 17 December 2012 в 08:02

Такая опция не существует в 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 и т. Д.

0
ответ дан 17 December 2012 в 08:02

Я лично использую следующую строку в файле /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

0
ответ дан 17 December 2012 в 08:02

Другие вопросы по тегам:

Похожие вопросы: