web-dev-qa-db-ja.com

特殊権のないユーザーとしての起動ジョブの実行

起動ジョブがそのユーザーIDを変更し、そのスクリプトを非特権ユーザーとして実行するための標準的な方法は何ですか?

明らかにsuまたはSudoを使うことができますが、これは厄介なようです(そして不要なログ行を生成する可能性があります)。

142
aaronsw

Upstart v1.4では、 setuidsetgid がconfigでネイティブにサポートされていますファイル。

108
qsun

Freenodeの#upstartチャンネルで尋ねた、この問題に関する公式の見解は次のとおりです。

Upstartの将来のリリースではそれをネイティブでサポートする予定ですが、今のところ、次のようなものを使用できます。

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
86
Roman Gaufman

Start-stop-daemonはどうですか?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

Upstart Cookbookから

DebianおよびUbuntuシステムに推奨される方法は、ヘルパーユーティリティstart-stop-daemonを使用することです。 […] start-stop-daemonは、開始するプロセスにPAM( "Pluggable Authentication Module")制限を課しません。

注:start-stop-daemonはRHELではサポートされていません。

17
Jason R. Coombs

それにはいくつかの方法がありますが、すべて意味が少し異なります。特にグループメンバーシップに関しては、

  • setuidgidはあなたを指定したグループに入れます。

    • オリジナルのdaemontoolsのsetuidgidはそのグループに only を入れるので、あなたがメンバーである他のグループに属するファイルにアクセスすることはできません。
    • daemontools-encoreのsetuidgidnoshツールセットの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と同様に、ユーザー名のすべてのグループメンバーシップを取得するため、おそらく最も驚かせることのできない方法です。

13
Jason Holt

パッケージsetuidgidからdaemontoolsを使用してください。

ここにドキュメント: http://cr.yp.to/daemontools/setuidgid.html

8
aaronsw

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スタンザは機能しないようであるため、私はすべてを絶対パスで実行する必要がありました。

4
Jesse Smith

私はCentOS 6を使用していましたが、(Upstart 0.6.5用の)推奨されるハックを手に入れることができず、関連するフォークの数(4と思う)が 'expect fork'によって追跡されなかったため'or' expect daemon 'です。

私は結局やった

chown user:group executable
chmod +s executable

(つまり、setuidビットを設定して所有権を変更します)。

これは最も安全な方法ではないかもしれませんが、社内の研究開発プロジェクトにとっては、私たちの場合は関係ありませんでした。

3
Mark Lakata

あなたが達成しようとしていることに応じて3番目の可能性があります。あなたは問題のファイル/デバイスのアクセス制御を緩めることができるかもしれません。これにより、特権のないユーザーは、通常許可されていないアイテムをマウントまたはアクセスすることができます。その過程で王国に鍵を配っていないことを確認してください。

あなたはSudoパスワードキャッシュのタイムアウトを変更することもできます。しかし、私はあなたのマシンが物理的に安全でない限りそれをお勧めしません(すなわち、通行人がSudoアクセスを得ようとすることはまずないとあなたは信じています)。

特権的なアクションを実行する方法がほとんどなく、それらが実行する理由があります。 いらない 必要なロギング。制限を緩めるとシステムのセキュリティが危険になります。ログ記録がないと、セキュリティが侵害されたときに何が起こったのかを知る方法がありません。

ログファイルのサイズが問題になる場合は、おそらく何か問題があります。 Sudoは通常の条件下では1回の使用につき1行しか生成しません。

0
Chris Nava