非sudoグループがUpstartジョブを制御できるようにする


11

システムの起動時に実行するようにUpstartジョブを設定しようとしていますが、これは以外のグループのメンバーによって開始/停止することもできsudoます。以前のバージョンでは、sudoersファイルに追加してこれを機能させるためにupdate-rc.dスクリプトを使用して保存し/etc/init.d/%Group ALL = NOPASSWD: /etc/init.d/scriptnameいましたが、Upstartで同等の機能を動作させることはできません。

私は、追加しようとした%Group ALL = NOPASSWD: /sbin/initctl start jobnamesudoersファイルにはなく、コマンドを実行しようとすると、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ファイルを編集する方法はありますか?以前のバージョンにこだわる方がいいですか?

回答:


7

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ユーザーはそのジョブを開始できます。

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


1
ああ、この後D-Busを再起動することを忘れないでください!:)
Iuliu Pascaru

私は、これは少し途方に暮れる見つけましたが、この助け:blog.arkency.com/2014/07/...
マイク・キャンベル

7

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


2

このようなオプションは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 startたりjobname.sh stop、制御したりできます。パラメータstartstopパラメータのみを許可するチェックを追加することができます。


言い換えれば、私の問題は、システムがグループメンバーの実行をinitctl拒否することではなく、UpstartがUpstart.confで許可ポリシーエントリを明示的に指定していないユーザー/グループによって送信された信号を拒否することですか?そして、設定ファイルでall-jobs-or-none設定よりも細かくする方法はありませんか?
アングルオサクソン

あなたの場合のInitctlは、sudoersの変更がなくても正常に実行されています。Upstartは、root以外のユーザーに対して特に許可しない場合、単にそこからのメッセージを拒否します。他の2つの回答を参照してください。com.ubuntu.Upstart0_6.<JOB>Upstart.confで、ジョブごとにdbusポリシーを定義できます(一部を参照)。必要に応じて、dbusポリシーを作成してdbusなどを再起動する代わりに、この種のスクリプトを作成する方が簡単な場合があります。Dbusポリシーは明らかに「正しい」ことですが、場合によっては、単純なスクリプトがトラブルの少ない長い道のり。
ツミノイド

DBusポリシーを編集して、以前と同じエラーメッセージを生成したものcom.ubuntu.Upstart0_6.jobnameとして使用しsend_interfaceます。エラー出力に信号情報が含まれていると推測すると、インターフェイスまたは宛先は、信号が参照するUpstartサービスを反映していないように見えます。サービス情報はD-Busメソッド呼び出しメッセージの単なる引数であり、UpstartのD-Busポリシーを編集して引数値に基づいて決定を下せるかどうかはわかりません。
アングルオサクソン

あなたが提案する種類のスクリプトは私にとって非常にうまく機能していますが、1つの警告があります:sudo jobname.sh startUpstartがrootユーザーからの要求をUpstartが見るように実行する必要があるので、私はそれをしようと努力していますこれは「正しい」方法です(つまり、最初はSys-Vスクリプトから遠ざかります)。そのため、D-Busポリシーまたはその他のUpstart構成オプションを使用してこれを機能させたいのですが、できない場合はその答えを受け入れます。
アングルオサクソン

1
私も引用したいと思います"$1"。あなたと[ "$1" = "start" -o "$1" = "stop" ]テスト私はそれの安全が、引用符で囲まれていないと信じて$1rootとして、スクリプトの実行の拡大だけで不健康な習慣(単語の分割が意図的に希望されない限り)...である
紅Cherniavsky-Paskin

0

上記のように、dbusデーモンには、特定のアプリケーション専用の構成ファイルがあります。

ls /etc/dbus-1/system.d/
avahi-dbus.conf
bluetooth.conf
...
Upstart.conf
wpa_supplicant.con

構成ファイルは、リソース制限、セキュリティパラメータなども確立します。

詳細については、dbus-daemon-1(1)-Linux manページを参照してください

グループが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はメッセージの内容に注意を払っていないため、それは不可能ですか?
アングルオサクソン

そのポリシーをUpstart.confに追加して(グループ名を実際のグループ名に置き換えて)D-Busを再start: You do not have permission to modify job: jobname起動し、サービスを開始しようとしたときに取得しました。
アングルオサクソン

OK。つまり、ポリシーは正常に適用されます。yourjob.confは/ etc / initにあるようです。ユーザージョブは〜/ .initにある必要があります。yourjob.confを〜/ .initに配置することはユースケースでもっともらしいですか?
ゴランMiskovic

最初の質問に関して:ポリシーは、アクセス可能なインターフェースとメンバーを定義します。どのコンテンツ/引数を送信/渡すことができるかを定義します。現在の制限ポリシーはアップストリームで緩和されました。ユーザーのジョブを実行するために新興企業を取得できないことを
Goran Miskovic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.