web-dev-qa-db-ja.com

PHP-FPMを使用してbashスクリプトを実行する最も安全な方法

私は現在、Nginx + PHP-Fpmと各サイトを独自のユーザー名/ GIDでWebサーバーを実行しています。次に、他の必要なものと一緒に新しいユーザーを作成するために使用するbashスクリプトがあります。 Shell_exec/suexecを使用してスクリプトを呼び出すことができることは知っていますが、サーバーのセキュリティを危険にさらすことなくbashスクリプトを呼び出す最も安全な方法は何でしょうか。

最初は、スクリプトを実行するためにcronジョブを設定することを考えていましたが、アカウントをすぐに立ち上げる必要があります。したがって、cronは機能しません。

また、いくつかの検索を行い、phpデーモンを使用してキューを監視し、ジョブがあるときにスクリプトを実行することを提案する人もいます。これ(デーモン)については、経験がないのでよくわかりません。

スクリプトを安全に実行するにはどうすればよいですか?

更新:
Beanstalkd + pheanstalkの組み合わせを使用することにしたことを更新するだけです。

PHPスクリプトはジョブをキューに送信し、必要な特権を持つ別のユーザーが実行するデーモン化されたphpスクリプトによって実行されます。

1
Sam W.

Phpでexecを使用するという特定のトピックと安全を確保する方法について、注意する必要があるのは引数をエスケープすることだけです。

つまり、しないでくださいこれを行います:

exec('myscript ' . $_POST['arg']);

明らかでない場合は、$_POST['arg']; rm xyzが含まれている場合、またはさらに悪いことに、そのコマンドの出力を画面に送信していて、; more /etc/passwd; more db-config.phpなどが含まれている場合はどうなるかを考えてください。

したがって--- 引数をエスケープ

$foo = escapeshellarg($whatever);
exec("myscript $foo");

ただし、bashスクリプトが通常nginxユーザーに許可するよりも多くの特権を必要とする場合は、bashスクリプトを実行しているユーザーとnginxユーザーの関連付けを解除するというアドバイスに注意することをお勧めします。

質問でのphpデーモンの提案と同様に、phpアプリはbashスクリプトを同期または非同期で実行するためのrequestを送信します ジョブキュー システム。ジョブキューはリクエストをbashスクリプトに送信するだけで、オプションで結果を返します。このようにして、nginxユーザーに追加の権限を与えたり、phpアプリケーションコードの場合にこれらの権限が他の場所で悪用されるリスクを冒したりすることなく、適切な権限を持つユーザーとして「新規ユーザーの作成」bashスクリプトを開始できます。特にギアマンはセットアップがとても簡単です。

2
AD7six