允许非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")

据我所知,这是关于如何使我的用户帐户无法在Upstart的D-Bus配置文件中发送“开始”消息的投诉。我实际上无法找到有关如何编辑该文件以授予组访问特定服务的权限的任何信息-是否存在这样的选项?有没有一种方法可以编辑Sudoers文件,这样我就可以运行作业而无需编辑配置文件?我最好还是坚持以前的版本吗?

Answers:


7

您可以从查找特定于Upstart的D-Bus配置的位置开始。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用户开始该作业。

请注意,原始错误消息中列出了“允许”策略属性的值。


1
哦,别忘了在此之后重启D-Bus!:)
Iuliu Pascaru 2012年

我觉得这有点令人困惑,但这对您有所帮助:blog.arkency.com/2014/07/…–
Mike Campbell


2

这样的选项在sudo中不存在。

Sysv脚本和Upstart配置文件之间的区别仅在于:Sysv脚本本身就是脚本,可执行文件,您可以告诉sudo允许某些团体执行它们。另一方面,Upstart配置文件仅是配置文件,不是可执行文件,因此sudo允许执行start()的符号链接initctl。您在这里的问题是,允许人们运行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 startjobname.sh stop控制此特定工作。您可能需要添加一些检查以仅允许startstop参数等。


换句话说,我的问题不是系统拒绝组成员运行的能力initctl,而是Upstart拒绝用户/组发送的任何信号(未在Upstart.conf中明确指定允许策略条目)?除了配置文件中的all-jobs-or-none设置,没有其他方法可以提供更多的粒度吗?
Angle O'Saxon

即使您不更改sudoers,Initctl仍可以正常运行,如果您不特别允许非root用户使用,则Upstart只是拒绝来自它的消息。请参阅其他两个答案。您可以com.ubuntu.Upstart0_6.<JOB>在Upstart.conf中按工作定义dbus策略(请参阅该部分)。根据您的需要,为其编写这种脚本比编写dbus策略并重新启动dbus等更为简单。Dbus策略显然是“正确”的事情,但是根据情况,简单的脚本可能会长途旅行,麻烦少。
Tuminoid

编辑DBus策略以com.ubuntu.Upstart0_6.jobname用作send_interface产生与以前相同的错误消息。如果我猜对了错误输出中包含信号信息的信息,那么它看起来接口或目标位置都无法反映该信号所指的Upstart服务。我认为服务信息只是D-Bus方法调用消息中的参数,并且我不确定是否可以编辑Upstart的D-Bus策略以基于参数值做出决策。
Angle O'Saxon

您建议的那种脚本对我来说效果很好,但有一个警告:我一直需要以身份运行它sudo jobname.sh start,以便Upstart认为请求来自用户。root我正在努力尝试做这是“正确”的方式(因此首先远离了Sys-V脚本),所以我想通过D-Bus策略或其他一些Upstart配置选项来解决这个问题,但是如果我做不到得到工作,我会接受这个答案。
Angle O'Saxon

1
我也要引用"$1"。通过您的[ "$1" = "start" -o "$1" = "stop" ]测试,我相信$1在以root身份运行的脚本中进行安全扩展,但未加引号只是一种不健康的习惯(除非刻意地希望分词)...
Beni Cherniavsky-Paskin 2016年

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在尝试启动该服务时获得了该策略。
Angle O'Saxon

好。这意味着该策略已成功应用。看来yourjob.conf在/ etc / init中。用户作业应位于〜/ .init中。在您的用例中,将yourjob.conf放在〜/ .init中是否合理?
Goran Miskovic

关于第一个问题:策略定义了可以访问的接口和成员。它确实定义了可以发送/传递的内容/参数。当前的限制性政策已在上游放宽。看到无法启动用户来运行用户作业
Goran Miskovic 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.