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

就我所知,这是一个抱怨我的用户帐户如何没有权力在Upstart的D-Bus配置文件中发送’开始’消息。 我无法真正找到有关如何编辑该文件的任何信息,以授予组访问特定服务的权限 – 这样的选项是否存在? 有没有办法编辑Sudoers文件,以便我可以在不编辑配置文件的情况下运行作业? 我最好坚持以前的版本吗?

您可以从找出特定于Upstart的D-Bus配置的位置开始。 从错误消息中看到destination="com.ubuntu.Upstart"片段? 现在尝试使用D-Bus配置文件在文件夹中grep它:

 vhost07:~ $ grep -r "com.ubuntu.Upstart" /etc/dbus-1 /etc/dbus-1/system.d/Upstart.conf:  [...skipped...] 

Upstart.conf文件包含一些策略示例。 我猜你可以尝试从中找出政策的格式。 然后尝试让您的特定用户只需要它所需的操作。 例如,如:

    

这应该允许pope_benedict用户启动该工作。

请注意,’allow’策略属性的值列在原始错误消息中。

我个人在/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

sudo中不存在这样的选项。

Sysv脚本和Upstart配置文件之间的区别就在于:Sysv脚本本身就是脚本,可执行文件,您可以告诉sudo允许某些组执行它们。 另一方面,Upstart配置文件只是配置文件,而不是可执行文件,因此start (symlink到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 startjobname.sh stop来控制这个特定的工作。 您可能需要添加一些检查以仅允许startstop参数等。

如上所述,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

      

在更改默认策略之前,您应该考虑此类策略的安全隐患。 YourGroupName的成员将能够启动/停止所有 Upstart作业。