起動ジョブがそのユーザーIDを変更し、そのスクリプトを非特権ユーザーとして実行するための標準的な方法は何ですか?
明らかにsu
またはSudo
を使うことができますが、これは厄介なようです(そして不要なログ行を生成する可能性があります)。
Freenodeの#upstartチャンネルで尋ねた、この問題に関する公式の見解は次のとおりです。
Upstartの将来のリリースではそれをネイティブでサポートする予定ですが、今のところ、次のようなものを使用できます。
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
Start-stop-daemonはどうですか?
exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd
DebianおよびUbuntuシステムに推奨される方法は、ヘルパーユーティリティ
start-stop-daemon
を使用することです。 […]start-stop-daemon
は、開始するプロセスにPAM( "Pluggable Authentication Module")制限を課しません。
注:start-stop-daemon
はRHELではサポートされていません。
それにはいくつかの方法がありますが、すべて意味が少し異なります。特にグループメンバーシップに関しては、
setuidgid
はあなたを指定したグループに入れます。
setuidgid
はそのグループに only を入れるので、あなたがメンバーである他のグループに属するファイルにアクセスすることはできません。setuidgid
と noshツールセットのsetuidgid
はどちらも-s
(別名--supplementary
)オプションを持っています。 補助グループ 指定したユーザーの場合。あまり特権のないユーザになったらnewgrp
を使用すると、グループセットに単一のグループが追加されますが、新しいサブシェルも作成されるため、内部スクリプトを使用するのが面倒になります。
start-stop-daemon
はあなたのグループメンバーシップを維持し、単にsetuid/setgidよりもずっと多くのことをします。
chpst -u username:group1:group2:group3... commandname
を使用すると、どのグループメンバーシップを採用するかを正確に指定できますが、( Ubuntu )にはrunit
パッケージのみが付属しています。これはupstart
の代替となります。
su -c commandname username
は、Sudo -u username commandname
と同様に、ユーザー名のすべてのグループメンバーシップを取得するため、おそらく最も驚かせることのできない方法です。
パッケージsetuidgid
からdaemontools
を使用してください。
ここにドキュメント: http://cr.yp.to/daemontools/setuidgid.html
Amazon EC2上のUbuntu 10.10インスタンスでは、私はstart-stop-daemon
コマンドを使用した方がよかったです。
私は他のスタートアップスタンザにも苦労しました。私は特定のvirtualenv
と私の実行されたプログラムへのいくつかのパラメータでpythonアプリケーションを呼び出しています。
以下は私のために働いたものです。
script
export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
exec start-stop-daemon --start --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script
PYTHONPATH
は、このupstartジョブが実行されるときにいくつかのパッケージをソースからPYTHONモジュールパスに入れることです。 chdir
スタンザは機能しないようであるため、私はすべてを絶対パスで実行する必要がありました。
私はCentOS 6を使用していましたが、(Upstart 0.6.5用の)推奨されるハックを手に入れることができず、関連するフォークの数(4と思う)が 'expect fork'によって追跡されなかったため'or' expect daemon 'です。
私は結局やった
chown user:group executable
chmod +s executable
(つまり、setuidビットを設定して所有権を変更します)。
これは最も安全な方法ではないかもしれませんが、社内の研究開発プロジェクトにとっては、私たちの場合は関係ありませんでした。
あなたが達成しようとしていることに応じて3番目の可能性があります。あなたは問題のファイル/デバイスのアクセス制御を緩めることができるかもしれません。これにより、特権のないユーザーは、通常許可されていないアイテムをマウントまたはアクセスすることができます。その過程で王国に鍵を配っていないことを確認してください。
あなたはSudoパスワードキャッシュのタイムアウトを変更することもできます。しかし、私はあなたのマシンが物理的に安全でない限りそれをお勧めしません(すなわち、通行人がSudoアクセスを得ようとすることはまずないとあなたは信じています)。
特権的なアクションを実行する方法がほとんどなく、それらが実行する理由があります。 いらない 必要なロギング。制限を緩めるとシステムのセキュリティが危険になります。ログ記録がないと、セキュリティが侵害されたときに何が起こったのかを知る方法がありません。
ログファイルのサイズが問題になる場合は、おそらく何か問題があります。 Sudoは通常の条件下では1回の使用につき1行しか生成しません。