143

サービスはデフォルトrootで、RHEL ボックスの起動時に開始されます。私の記憶が正しければ、 の init スクリプトを使用する他の Linux ディストリビューションでも同じことが言えます/etc/init.d

代わりに、プロセスを選択した (静的) ユーザーとして実行する最良の方法は何だと思いますか?

私がたどり着いた唯一の方法は、次のようなものを使用することでした:

 su my_user -c 'daemon my_cmd &>/dev/null &'

しかし、これは少し面倒なようです...

root 以外の他のユーザーとしてサービスを自動的に開始するための簡単なメカニズムを提供する魔法のようなものは隠されていますか?

編集:このインスタンスで開始しているプロセスは、Python スクリプトまたは Java プログラムのいずれかであると言うべきでした。それらの周りにネイティブラッパーを書きたくないので、残念ながら、ブラックが示唆するようにsetuid()を呼び出すことができません。

4

8 に答える 8

68

Debianstart-stop-daemonでは、pid ファイルの処理、ユーザーの変更、デーモンのバックグラウンド化などを行うユーティリティを使用します。

私は RedHat に詳しくありませんが、daemonあなたが既に使用しているユーティリティ (これは で定義されてい/etc/init.d/functionsます) はどこでも と同等のものとして言及されているstart-stop-daemonため、プログラムの uid を変更することも、あなたが行う方法も変更することができます。それはすでに正しいものです。

ネットを見回すと、使用できる既製のラッパーがいくつかあります。すでに RedHat にパッケージ化されているものもあります。daemonizeたとえば、 を見てください。

于 2008-12-27T13:53:34.423 に答える
53

ここにあるすべての提案を見た後、私の立場にある他の人に役立つと思われるいくつかのことを発見しました。

  1. ホップは私を元に戻すのに適しています/etc/init.d/functions: この daemon機能では、すでに代替ユーザーを設定できます:

    daemon --user=my_user my_cmd &>/dev/null &
    

    これは、プロセス呼び出しをラップすることで実装されますrunuser。これについては後で詳しく説明します。

  2. Jonathan Lefflerは正しいです: Python には setuid があります:

    import os
    os.setuid(501) # UID of my_user is 501
    

    ただし、JVM 内から setuid できるとはまだ思えません。

  3. すでに使用しているユーザーとしてコマンドを実行するように要求する場合は、適切に処理することも、適切に処理することsuもできません。runuser例えば:

    [my_user@my_host]$ id
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    [my_user@my_host]$ su my_user -c "id"
    Password: # don't want to be prompted!
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    

suとの動作を回避するためにrunuser、init スクリプトを次のように変更しました。

if [[ "$USER" == "my_user" ]]
then
    daemon my_cmd &>/dev/null &
else
    daemon --user=my_user my_cmd &>/dev/null &
fi

助けてくれてありがとう!

于 2008-12-27T19:59:21.503 に答える
5

独自のデーモンを作成する場合は、setuid() を呼び出すことをお勧めします。このようにして、あなたのプロセスは

  1. そのルート権限を利用してください (例: ログ ファイルを開く、pid ファイルを作成する)。
  2. 起動中の特定の時点でルート権限を削除します。
于 2008-12-27T13:22:55.983 に答える
3

注意すべき他のいくつかのものを追加するだけです:

  • init.dスクリプトのSudoは、ttyが必要なため、適切ではありません( "sudo:申し訳ありませんが、sudoを実行するにはttyが必要です")
  • Javaアプリケーションをデーモン化する場合は、Java Service Wrapper(ユーザーIDを設定するためのメカニズムを提供する)を検討することをお勧めします。
  • 別の代替手段は、su --session-command = [cmd] [user]
于 2010-10-14T14:41:52.657 に答える
3

svnサーバー用のCENTOS(Red Hat)仮想マシン:/etc/init.d/svnserver pidをsvnが記述できるものに変更するように編集:

pidfile=${PIDFILE-/home/svn/run/svnserve.pid}

と追加オプション--user=svn

daemon --pidfile=${pidfile} --user=svn $exec $args

元のpidfileはでした/var/run/svnserve.pid。デーモンはbecaseuを起動しませんでしたが、rootだけがそこに書き込むことができました。

 These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart
于 2013-03-08T01:31:54.610 に答える
2

注意すべき点:

  • あなたが述べたように、あなたがすでにターゲットユーザーである場合、 su はパスワードの入力を求めます
  • 同様に、(一部の OS では) 既にターゲット ユーザーである場合、setuid(2) は失敗します。
  • setuid(2) は、/etc/limits.conf (Linux) または /etc/user_attr (Solaris) で定義された権限またはリソース制御をインストールしません。
  • setgid(2)/setuid(2) ルートに進む場合は、initgroups(3) を呼び出すことを忘れないでください -- 詳細は こちら

通常、デーモンを起動する前に /sbin/su を使用して適切なユーザーに切り替えます。

于 2009-08-05T18:00:47.370 に答える
2

init スクリプトで次のことを試してみませんか。

setuid $USER application_name

それは私のために働いた。

于 2012-02-17T10:05:39.180 に答える