web-dev-qa-db-ja.com

Linux:ユーザー定義のデーモン/サービス

通常のユーザーが独自のサーバープロセスを設定できるように、フレームワーク/ライブラリ/環境を探しています。これらのプロセスは、他のユーザープロセスと同様に彼のuidで実行する必要があります。

ただし、どのプロセスを開始するか、それらが取得する引数などの定義は、追加の特権を持たない通常のユーザーが指定する必要があります。これは、ユーザーが実際にログインしなくても発生することが重要です。理想的には、SYSV initで機能するはずですが、systemdベースのものでも問題ありません。

例/ユースケース:

  • nginx uwsgi/fastcgiプロセス
  • mongodbインスタンス
  • 継続的インテグレーションサーバー用のさまざまなビルダー

これらはすべて共通しており、同じバイナリの複数のインスタンスを(異なるパラメータで)開始したい場合や、これらのパラメータを定期的に変更する必要がある場合があります。ただし、ユーザーはroot権限を必要とせずにそれらすべてを微調整できるはずです。

Linuxでこれをどのように実装できるかについての提案/ポインタはありますか?

編集:最小要件はユーザープロセスを開始することだけですが、明らかにより高度な制御メカニズムが必要になります。たとえば、サービスが実行されているかどうかをクエリし、インスタンスを停止し、再起動し、リロードする簡単な方法があるはずです...

2
Felix Schwarz

cronはこれに@rebootプレフィックスを付けます(Vixie、およびおそらく他のフレーバー、man 5 crontabを確認してください)。ユーザーはcrontabを使用して独自のcrontabファイルを作成/編集し、

@reboot /some/path/command -flags --moreflags

そのユーザーとして、起動時にそのコマンドを実行します。

4
DerfK

これは約10行のシェルスクリプトになりますが、なぜフレームワーク/ライブラリ/環境が必要なのですか?

簡単な例として、sysV init ...を使用します。

#!/bin/bash

. /etc/rc.d/init.d/functions

. /etc/sysconfig/network

DAEMON_USERS=`cat /etc/daemon_users`

CMD="$1"

for DUSER in $DAEMON_USERS ; do
   DSCRIPTS=`ls /home/${DUSER}/init/`
   for DFILE in DSCRIPTS ; do
      if [ -x "/home/${DUSER}/init/${DFILE}" -a ! -d "/home/${DUSER}/init/${DFILE}" ]
      then
         su -c $DUSER /home/${DUSER}/init/${DFILE} $CMD
      fi
   done
done

本当にルートとしての実行を許可したい場合は、「su -c $ DUSER」を削除してsudoerに追加し、再起動せずに再起動/追加できるようにします。

3
symcbean

だから...ちょうどstartあなたがそれを実行したいユーザーとしてアプリケーションをおよびrootを必要とするものにアクセスしようとしないでください(特権ポート、rootのみが読み取ることができるファイルなど)?

これらのデーモンを自動的に起動し、SysV initプロセスを介して制御する場合は、パラメーターを指定する(または、非特権ユーザーが書き込みアクセス権を持つファイルからデーモンを読み取る)各デーモンのinitスクリプトを作成する必要があります。 su -cなどを使用してデーモンを起動しますが、[〜#〜]注意[〜#〜] :これを行うと、[〜#〜]深刻な[〜#〜]セキュリティへの影響(慎重に作成された「パラメータ」 fileを使用すると、ユーザーはinitシーケンス(通常はroot)を実行しているユーザーとして任意のコードを実行できます。
DerfKはcron@rebootオプションについて言及しましたが、これは(セキュリティリスクが少ない)より良い選択かもしれませんが、管理者はこれらのプログラムがcronによって開始されることに注意する必要があります...

2
voretaq7