CentOS 5.7 Linux サーバーを所有しており、php5.3.x を使用しています。
pfSense システムでは、php Web ページを使用して、ルート権限を必要とするサービスを再起動できます。
私も同じようなことをやろうとしています。シェル コマンドを実行するための PHP コードをいくつか書きました。たとえば、sshd サービスを再起動するには、次のようにします。
<?php
exec('/sbin/service sshd restart');
?>
そして、exec 関数を介してそのコマンドを実行しようとしましたが、ルート権限が必要ですが、Apache ユーザー権限があります。
私はいくつかの解決策を見つけました:
- 「root ユーザーで apache を実行する」というのは本当に危険です。私はそれをしたくありません。
- 「apache ALL=NOPASSWD:/sbin/service to /etc/sudoers」を試してみましたが、まだ問題があります。
他に解決策はありますか? 回答ありがとうございます。
さて、興味深いです。@refp の投稿を試したところ、ローカルの Ubuntu サーバーではうまくいきました。しかし、cenOS VPS サーバーで同じことを試したところ、うまくいきませんでした。Apache のエラー ログには「rm: `/var/lock/subsys/vsftpd' を削除できません: 権限が拒否されました」と表示されています。
ベストアンサー1
試してみる前にこの投稿全体を読んでください。選択肢があります。
バイナリラッパー(suidビット付き)を使用したソリューション
1).sh
root として実行する内容を含むスクリプト (できれば ) を作成します。
# cat > php_shell.sh <<CONTENT
#!/bin/sh
/sbin/service sshd restart
CONTENT
2)このファイルは root が所有する必要があります。また、後で root 権限で実行されるため、ファイルへの書き込み権限が root のみにあることを確認してください。
# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh
3)どのユーザーが実行してもスクリプトを root として実行するには、バイナリ ラッパーが必要です。 を実行するものを作成しますphp_shell.sh
。
# cat > wrapper.c <<CONTENT
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main (int argc, char *argv[])
{
setuid (0);
/* WARNING: Only use an absolute path to the script to execute,
* a malicious user might fool the binary and execute
* arbitary commands if not.
* */
system ("/bin/sh /path/to/php_shell.sh");
return 0;
}
CONTENT
4)suid ビット (ルート権限で実行する必要があることを示す) を含む適切な権限をコンパイルして設定します。
# gcc wrapper.c -o php_root
# chown root php_root
# chmod u=rwx,go=xr,+s php_root
php_root
はルート権限で実行され、 で指定されたコマンドを実行しますphp_shell.sh
。
実行されるコマンドを簡単に変更するオプションが必要ない場合は、wrapper.c
ステップの下にコマンドを直接記述することをお勧めします。4そうすれば、問題のコマンドを実行する外部スクリプトを実行するバイナリを用意する必要がなくなります。
ではwrapper.c
、を使用してsystem ("your shell command here");
実行するコマンドを指定します。