hosts
ファイルを更新し、Webインターフェイス(php/Apache2)からdnsmasq
を再起動したいと思います。 suidビット(デモンストレーション) で遊んでみました。 EC2インスタンスでApache
とdnsmasq
の両方を実行しています。
Linuxはテキストスクリプトのsetuidビットを無視しますが、バイナリファイルでは機能することを理解しています。 (何か問題がありましたか?)ウィキペディアのサンプルCプログラムにexec("whoami");
を追加しました。 Cプログラムの有効なUIDは0ですが、whoamiはroot
を返しません:-(
絶対に避けたい
エコーパスワード| Sudoサービスdnsmasq再起動
または、パスワードなしでApacheをsudoersに追加します。抜け道はありますか? webminはどのようにそのようなことをしますか?
別のアプローチを取り、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ファイルに適用します。
私は、サーバー(この場合は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 bash
、Sudo 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
コマンドを実行することは、他のどの方法よりも安全であり、多くの自作または他の十分にテストされていない方法よりもおそらく安全です。