システムの起動時に実行するように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ファイルを編集する方法はありますか?以前のバージョンにこだわる方がいいですか?
私は個人的に/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
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
ユーザーがそのジョブを開始できるようになります。
「許可」ポリシー属性の値は、元のエラーメッセージにリストされていることに注意してください。
このようなオプションは、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
パラメーターなどのみを許可するチェックを追加することができます。
上記のように、dbusデーモンには特定のアプリケーション専用の構成ファイルがあります。
ls /etc/dbus-1/system.d/
avahi-dbus.conf
bluetooth.conf
...
Upstart.conf
wpa_supplicant.con
構成ファイルは、リソース制限、セキュリティパラメータなども設定します。
詳細については、 dbus-daemon-1(1)-Linux man page を参照してください
groupが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ジョブを開始/停止できますall。