ベストプラクティスを実行Linuxサービスとして、異なるユーザー
質問
サービスのデフォルトとしての出発 root
起動時に自RHELます。振り返ってみると、私が正しく同様にその他のLinux distrosを利用するには、initスクリプトに /etc/init.d
.
何だと思うのではなく、プロセスとして実行(静的)ユーザーの選択?
唯一の方法んに到着したものを使っておけば間違いないように:
su my_user -c 'daemon my_cmd &>/dev/null &'
このように見えるビット損なわ...
あのビットマジックひっそりと佇むとに自動的に開始サービスとして、非rootユーザー?
編集: いずれのプロセス思このインスタンスはPythonスクリプトまたはJavaプログラムもう少し書いていないネイティブラッパ買い替えることができるようにし残念なことに私はできないコ setuid() として 黒 と理解することが可能である。
解決
Debianを使用していまし start-stop-daemon
明るpidファイルの変更、ユーザーのデーモンへの背景です。
私は知らないRedHatが、 daemon
できるユーティリティまで(設定項目が用意され /etc/init.d/functions
,ちなみ.) はうものとして相当 start-stop-daemon
, いずれにも変更が可能でuidのプログラム、またはのいいをすることから始まったのだ。
みなさんの周りにある既製封のでご利用いただけます。一部ている可能性もありますが既にパッケージにRedHat.してい daemonize
, ります。
他のヒント
を眺めた後、すべてのご提案、または数え上げればきりがないが私の役に立つその他の私の位置:
ホップ はポートしていく必要があり 時
/etc/init.d/functions
:のdaemon
機能でできる ト別ユーザー:daemon --user=my_user my_cmd &>/dev/null &
このメソッドの実装では、すっぽり包むことにより、 工程の呼び出しと
runuser
- ります。ジョナサン-Leffler 左右がsetuid Python:
import os os.setuid(501) # UID of my_user is 501
まだまだないほうがいいと思いままでsetuidされ 内からのJVMしています。
も
su
もrunuser
優雅に対応いただく場合 お願い実行コマンドとしてのユーザー ています。E.g.:[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
感謝しております。
- あづ例apacheいることにより自身を呼び出し setuid()
- ご利用可能に setuid-ファイルのフラグ に処理を実行して別のユーザーです。
- もちろんのソリューションで動作します。
希望する場合はお書き独自のデーモン、お勧めしま呼び出しsetuid().このように、プロセスできる
- 利用のルート権限などopenログファイルを作成しpidファイル).
- 落とし、そのroot権限で、ある時点から起動します。
るだけで追加その他のもの注意:
- 須藤、init.dスクリプトは以降が必要でtty("須藤:申し訳とができますtty走sudo")
- まdaemonizing javaアプリケーションも考えておいた方がよいでしょうJavaのサービスのラッパー(る機構を提供するための設定のユーザid)
- 他の代替できる su--セッション-コマンド=[cmd][ユーザ]
にCENTOS(Red Hat)仮想マシンのためのsvnサーバー:編集 /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みのルートが書けます。
These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart
一部のものに注意:
- また、suパスワードを要求す場合は対象ユーザの
- 同様に、setuid(2)失敗した場合は、ターゲットユーザー(一部のOSs)
- setuid(2)は設置しないで権限や資源の制定義された/etc/です。conf(Linuxの場合)または/etc/user_attr(Solaris)
- 場のsetgid(2)/setuid(2)ルートを忘れてはならないコinitgroups(3)--り こちらの
私は一般的に使用/sbin/ス切り替えるには、適切なユーザーの前に、非常にシン.
してみません下記のinitスクリプト:
setuid $USER application_name
たところ、うまくいったのです。
を実行しています。jarとしてアプリケーションサービス、簡単な運営方法として特定のユーザー:
私の所有者やグループのjarファイルをユーザーたかったので実行します。その後symlinkedこのjarにinit.dを開始したサービスです。
い:
#chown myuser:myuser /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar
#ln -s /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar /etc/init.d/springApp
#service springApp start
#ps aux | grep java
myuser 9970 5.0 9.9 4071348 386132 ? Sl 09:38 0:21 /bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar