web-dev-qa-db-ja.com

apacheからrootとしてスクリプトを実行する

hostsファイルを更新し、Webインターフェイス(php/Apache2)からdnsmasqを再起動したいと思います。 suidビット(デモンストレーション) で遊んでみました。 EC2インスタンスでApachednsmasqの両方を実行しています。

Linuxはテキストスクリプトのsetuidビットを無視しますが、バイナリファイルでは機能することを理解しています。 (何か問題がありましたか?)ウィキペディアのサンプルCプログラムにexec("whoami");を追加しました。 Cプログラムの有効なUIDは0ですが、whoamiはrootを返しません:-(

絶対に避けたい

エコーパスワード| Sudoサービスdnsmasq再起動

または、パスワードなしでApacheをsudoersに追加します。抜け道はありますか? webminはどのようにそのようなことをしますか?

1
Lord Loh.

別のアプローチを取り、rootとして実行される incron スクリプトを構成します。このスクリプトは、一部のファイルの変更を監視し、変更を/ etc/hostsファイルに適用することで応答します。

Incronアプローチでは、inotifyエントリを設定して、ファイルの変更を監視し、スクリプトを実行して応答します。

/var/www/hosts IN_CLOSE_WRITE /run/this/as/root

したがって、Apacheにはphpなどを使用して/ var/www/hostsに書き込む権限があり、/ run/this/as/rootスクリプトはrootとして実行され、変更を/ etc/hostsファイルに適用します。

4
Tom H

私は、サーバー(この場合はWebサーバー)を実行するプロセスが、パスワードなしのSudoを介して、関連するコマンドを実行し、そのコマンドのみを実行できるようにすることで、これに対処する傾向があります。

たとえば、NAGIOS(ローカル監視サーバーを実行している)というユーザーが、そのRAIDハードウェアをrootとしてチェックするプラグインを実行できるようにするsudoersエントリを次に示します。

nagios  ALL=(root) NOPASSWD: /usr/lib/nagios/plugins/check_md_raid

あなたはおそらく似たようなものを持っているでしょう:

Apache  ALL=(root) NOPASSWD: /sbin/service dnsmasq restart

上記の懸念に対処するために、これにより、Apacheプロセスを破壊できる人は誰でもSudo bashSudo shutdown -h now、さらにはSudo service dnsmasq stopを実行できなくなります。 sudoersファイルで指定されているものだけを正確に許可します。

確かに、serviceコマンドの記述が不適切で、誰かがservice dnsmasq stopをrootとして実行する方法を見つけた場合は、passwdファイルのモードを変更するか、開始しますポート22222でallow-allsshdを実行するか、実際に不正な処理を行うと、問題が発生します。 ただし、このような場合は問題が発生しますが、rootとしてserviceコマンドを実行します Sudo経由か、その他のメカニズムによるかは関係ありません。 Sudoは環境をサニタイズするために最善を尽くし、serviceコマンドはほとんどのGNU/Linuxのストック部分であるため(そしてしばらくの間使用されてきました)、おそらく明らかな穴はありません。

パスワードなしのserviceを介してSudoコマンドを実行することは、他のどの方法よりも安全であり、多くの自作または他の十分にテストされていない方法よりもおそらく安全です。

2
MadHatter