shell_exec
PHP機能を使用してシステムサービスを制御しようとしています。
shell_exec('sudo /usr/sbin/service icecast2 stop');
ただし、これを機能させる唯一の方法は、すべてのユーザーに次のサービスへのルートアクセスを許可することです/etc/sudoers
。
ALL ALL=(root) NOPASSWD: /usr/sbin/service
これは明らかに非常に悪い考えですが、別のものに設定しようとすると、サービスにroot権限が必要なため、実行が拒否されます。たとえば、次のようになります。
%www-data ALL=(root) NOPASSWD: /usr/sbin/service
%www-data ALL=NOPASSWD: /usr/sbin/service
また、echoはposix_getpwuid(posix_geteuid())['name'];
実行中のプロセスにwww-data以外の名前を提供します。ただし、次のいずれも機能しません。
%myphpuser ALL=(root) NOPASSWD: /usr/sbin/service
%myphpuser ALL=NOPASSWD: /usr/sbin/service
また、サービスを制御し、shell_execから呼び出すためにbashスクリプトを書いてみましたが、うまくいきませんでした。
このようにサービスを開かないように他のソリューションを考えることができる人はいますか?
たとえば、この特定のサービスと機能へのアクセスのみを許可しますか?
編集する
ある程度進展がありました。これはうまくいきますが、十分に安全ですか?
myphpuser ALL=(ALL:ALL) ALL
myphpuser ALL=NOPASSWD: /usr/sbin/service
また、これを呼び出すPHPスクリプトは、とにかく公開されていないcronジョブによって実行されることにも注意する必要があります。