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


11

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

Ответы:


7

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


1
О, и не забудьте перезапустить D-Bus после этого! :)
Iuliu Pascaru

Я нашел это немного сбивающим с толку, но это помогло: blog.arkency.com/2014/07/…
Майк Кэмпбелл

7

Я лично использую следующую строку в файле /etc/sudoers.d/jobname_myuser:

myuser ALL = (root) NOPASSWD: /sbin/start jobname, /sbin/stop jobname, /sbin/restart jobname, /sbin/status jobname

как описано здесь: /server//a/390723/68608


2

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


Другими словами, моя проблема не в том, что система запрещает членам группы запускаться initctl, а в том, что Upstart отклоняет любые сигналы, отправленные пользователями / группами, явно не предоставившими запись политики Allow в Upstart.conf? И нет никакого способа обеспечить более высокую степень детализации, чем параметр «все задания или нет» в файле конфигурации?
Угол О'Саксон

Initctl в вашем случае работает нормально даже без изменения sudoers, Upstart просто отклоняет сообщения от него, если вы специально не разрешаете его для пользователей без полномочий root. Смотрите два других ответа. Вы можете определить политику dbus для каждой работы (см. com.ubuntu.Upstart0_6.<JOB>Часть) в Upstart.conf. В зависимости от ваших потребностей может быть проще создать такой сценарий для него, вместо того, чтобы писать политики dbus, перезапускать dbus и т. Д. Политика Dbus, очевидно, является «правильной» вещью, но в зависимости от случая простой сценарий может пойти долгий путь с меньшими проблемами.
Туминоид

Редактирование политики DBus для использования в com.ubuntu.Upstart0_6.jobnameкачестве выданного send_interfaceтого же сообщения об ошибке, что и раньше. Если я прав в предположении, что вывод ошибки содержит информацию о сигнале, то выглядит, что интерфейс или назначение не отражают службу Upstart, к которой относится сигнал. Я думаю, что служебная информация - это просто аргументы в сообщении вызова метода D-Bus, и я не уверен, что могу отредактировать политику D-Bus для Upstart, чтобы принимать решения на основе значений аргументов.
Угол О'Саксон

Сценарий того типа, который вы предлагаете, работает для меня довольно хорошо, с одной оговоркой: мне нужно было запустить его как sudo jobname.sh start, так что Upstart видит запрос как поступающий от пользователя. rootЯ прилагаю усилия, чтобы попытаться сделать это «правильный» путь (таким образом, в первую очередь, отход от сценариев Sys-V), поэтому я бы хотел, чтобы это работало через политику D-Bus или какой-либо другой вариант конфигурации Upstart, но если я не могу заставить это работать, я приму этот ответ.
Угол О'Саксон

1
Я бы тоже процитировал "$1". [ "$1" = "start" -o "$1" = "stop" ]Я полагаю, что с вашим тестом это безопасно, но $1расширение без кавычек в скрипте, запускаемом с правами root, является просто нездоровой привычкой (если разделение слов не является преднамеренным желанием) ...
Бени Чернявский-Паскин

0

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


Но есть ли способ ограничить работу, которую они могут контролировать? Или это невозможно, потому что D-Bus не обращает внимания на содержание сообщений?
Angle O'Saxon

Я попытался добавить эту политику в Upstart.conf (заменив имя группы на фактическое имя группы), перезапустил D-Bus и получил, start: You do not have permission to modify job: jobnameкогда попытался запустить службу.
Угол О'Саксон

OK. Это означает, что политика успешно применяется. Похоже, что yourjob.conf находится в / etc / init. Пользовательские задания должны быть в ~ / .init. В вашем случае возможно ли поместить yourjob.conf в ~ / .init?
Горан Мискович,

Что касается вашего первого вопроса: Политика определяет, к каким интерфейсам и членам можно получить доступ. Он определяет, какой контент / аргументы могут быть отправлены / переданы. Текущая ограничительная политика была ослаблена вверх по течению. Увидеть не могу выскочить, чтобы запустить работу пользователя
Горан Мискович
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.