我正在尝试设置一个 Upstart 作业以在系统启动时运行,并且也可以由 以外的组成员启动/停止sudo
。在以前的版本中,我使用update-rc.d
和存储在 中的脚本/etc/init.d/
通过添加到我的 sudoers 文件来使其工作%Group ALL = NOPASSWD: /etc/init.d/scriptname
,但我似乎无法为 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 文件,以便我可以在不编辑配置文件的情况下运行该作业?我最好还是坚持使用以前的版本吗?
答案1
你可以先找出 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: <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
用户开始这项工作。
请注意,“允许”策略属性的值列在原始错误消息中。
答案2
我个人在 /etc/sudoers.d/jobname_myuser 文件中使用以下行:
myuser ALL = (root) NOPASSWD: /sbin/start jobname, /sbin/stop jobname, /sbin/restart jobname, /sbin/status jobname
答案3
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
参数等。
答案4
如上所述,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>
在更改默认策略之前,您应该考虑此类策略的安全隐患。您的群组名称将能够启动/停止全部新兴职位。