web-dev-qa-db-ja.com

非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ファイルを編集する方法はありますか?以前のバージョンにこだわる方がいいですか?

11
Angle O'Saxon

私は個人的に/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

7
Szymon Jeż

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ユーザーがそのジョブを開始できるようになります。

「許可」ポリシー属性の値は、元のエラーメッセージにリストされていることに注意してください。

7
Iuliu Pascaru

このようなオプションは、Sudoには存在しません。

SysvスクリプトとUpstart構成ファイルの違いは次のとおりです。Sysvスクリプトはそれ自体がスクリプトであり、実行可能ファイルであり、Sudoに特定のグループにそれらの実行を許可することができます。一方、Upstart構成ファイルは単なる構成ファイルであり、実行可能ファイルではないため、startinitctlへのシンボリックリンク)の実行は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パラメーターなどのみを許可するチェックを追加することができます。

2
Tuminoid

上記のように、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

0
Goran Miskovic