私はLEMPスタックを実行しており、それに対する簡単なコントロールパネルを作成したいと思います。
php-fpm
だからPHPスクリプトから再起動できるようにしたいです。これを達成するために私がしたことは次のとおりです。
c
このようなバイナリラッパーを作成しました。php-shell.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CMN_LEN 100
int main(int argc, char *argv[])
{
char cmd[MAX_CMN_LEN] = "", **p;
if (argc < 2)
{
fprintf(stderr, "Usage: ./php_shell terminal_command ...");
exit(EXIT_FAILURE);
}
else
{
strcat(cmd, argv[1]);
for (p = &argv[2]; *p; p++)
{
strcat(cmd, " ");
strcat(cmd, *p);
}
system(cmd);
}
return 0;
}
このプログラムは次のようにコンパイルされます。
gcc php_shell.c -o php_shell
次に、次のようにnginxユーザーを追加しましたsudo visudo
。
Defaults:nginx !requiretty
nginx ALL=(ALL) NOPASSWD:/path/to/php_shell
次に、PHPスクリプトで次のようにコマンドを実行します。
var_dump(shell_exec('sudo /path/to/php_shell "service nginx restart" 2>&1'));
このスクリプトphpスクリプトを実行すると、502 Gateway Error
すべてのphp-fpm
プロセスが終了し、バックアップが開始されないことがわかります。
どんなアイデアがありますか?私が間違っているのでしょうか? phpでスクリプトを実行してnginxサーバーを再起動したいと思いますservice nginx restart
。この目標をどのように達成できますか?
ベストアンサー1
おめでとうございます! nginxサーバーでランダムなコードを実行できるようにするすべての人に無制限のrootアクセス権を与えています。すべてのCGIスクリプトとPHPページだけでなく、任意のコードを実行するために使用できるすべてが安全であることを確認することをお勧めします。
Cラッパーは、nginxがrootですべてのコマンドを実行できるようにsudoを設定するのと同じです。
いいえただそれをやってください。
特定のコマンドに対して別々のシェルスクリプト(または他の)ラッパーを作成し、そのラッパースクリプトにのみsudoアクセスを許可します。例えば、/usr/local/sbin/restart-nginx.sh
これは実際に何もないただし、service nginx restart
nginx sudoにスクリプトへのアクセスを許可します。
dmidecode -s system-uuid
次に、たとえば、前の質問に示されているように、実行する完全に独立した別のスクリプトを作成します。 nginx sudoにスクリプトへのアクセスを許可します。
各個々のスクリプトは、シンプルでシンプルなほど良いです。最も安全な方法は、コマンドラインまたは環境変数からユーザー入力をまったく受け入れないことです。
一部のラッパースクリプトがユーザー入力を許可する必要がある場合は、使用する前に完全性チェックを実行し、すべてのユーザー入力を削除します。そして変数を引用してください。たとえば、常に引用符"$variable"
なしで使用してください$variable
。
ラッパースクリプトが長すぎて複雑になったら、rootとして実行する必要がある最小限のコマンドまたはコマンドセットのみを識別し、それをsudo
デフォルトスクリプトから呼び出す別のスクリプト(または複数のスクリプト)で作成します。つまり、できるだけ root として実行しないでください。