ホームページ >バックエンド開発 >PHPチュートリアル >共有ホスティング構成 php open_basedir によりセキュリティが向上し、サイト間でのファイルへのアクセスが防止されます
nginx/php-fpm/apache mod_php のセキュリティ構成については、以前の別の記事を参照してください:
「nginx/ を正しく設定する」 php -fpm/apache は Web サイトのセキュリティを向上させ、トロイの木馬を防止します。"
http://zhangxugg-163-com.iteye.com/blog/1171572
1. 基本的な知識の準備
構成を開始する前に、これらの概念を理解する必要があります。これらの概念が完全に理解されていない場合、経験豊富なシステム管理者はこれを省略できます。 。
1. サイト ファイルの所有者アカウントとファイルのアクセス許可は何ですか?
2. nginx、php-fpm、Apache はどのアカウントを使用して実行しますか?
3. Web サイト上のどのディレクトリとファイルが書き込み可能ですか?ここでの書き込み可能とは php-fpm のことですか?
4. Linux の基本的な権限ファイルの所有者は、そのファイルが属するすべてのファイルに対する任意の権限を持っています (root 権限は制限されていません)。読み取りおよび書き込みの実行権限は、それぞれ 4 2 1
として識別されます。 、一部のシステム管理者は、トラブルを避けるために、php-fpm/apache を Web サイト ファイルの所有者にします。これにより、PHP プログラムが任意の場所にファイルを生成しやすくなりますが、この構成は重大なセキュリティ上の問題を引き起こす可能性があります。
上記の質問に対する答え:
1. Linux ディレクトリで、ls -l コマンドを使用して、現在のディレクトリの所有者を表示します。図に示すように、4 つの列はそれぞれファイルが属するユーザー/グループを表します。これは yii フレームワークの保護されたディレクトリ内のファイルリストです
2. サイトでは、多くの場合、実行時にファイルを生成するために書き込み可能なディレクトリが必要です (キャッシュ、静的)。ファイル、添付ファイルのアップロードなど)、この Writable は PHP プログラム自体用です。nginx+php-fpm モードでは、nginx はリクエストを php-fpm プロセスに転送することのみを担当するため、最終的に生成されるファイルは によって生成されます。 php-fpm。ただし、Apache mod_php は異なります。Apache のモジュールであるため、mod_php の権限は Apache から継承されており、Apache の書き込み可能なディレクトリであると言っても間違いではありません。
コマンド ps egrep 'nginx|php-fpm|apache' を使用して、nginx/php-fpm/apache の実行アカウントを表示できます
3. 書き込み可能なディレクトリとその重要性を理解するために開発者と連絡を取ります
4. PHP コードの実行が禁止されている場合はどうなりますか?おそらく、プログラム コードの脆弱性が原因で、トロイの木馬ファイルが添付ディレクトリにアップロードされました。Linux では、このディレクトリの実行権限を削除すれば十分だと思うかもしれません。
chmod a-x -R Uploadfile
php を実行する一般的な方法は次のとおりです。
A. nginx+php-fpm として実行します
C. コマンドラインから php
D. php スクリプトの最初の行に #!/usr/local/php を追加します。 /bin/php に追加し、このファイルに実行権限を追加すると、シェル スクリプトとして実行できます。このタイプのファイルは一般的ではありません。
これらのメソッドのうち、最後のメソッドのみが実行権限を必要とします。他のメソッドでは、php スクリプトへの読み取り権限があり、実行可能です。 php スクリプトの実行を無効にする方法については、上記の著者の記事を参照してください。
2. safa_mode
PHP のセーフ モードはシステム構成に関係しており、Windows の構成概念を使用しているため、非常に物議を醸しています。環境。簡単に言えば、safe_mode がオンになった後は、php プロセス自体は独自のスクリプト ファイルを開くことのみが許可されます。つまり、マルチサイト環境では、サイトごとにユーザーを作成し、対応するアカウント権限で php プロセスを実行する必要があります。これにより、そのサイトのファイルに対しては最高の権限を与えることができますが、他のユーザーに対しては最高の権限を与えることができます。 ' ファイルの場合、権限はありません。それは良いことのように聞こえますが、実際には、この構成は非常に面倒でエラーが発生しやすくなります:
2.php-fpm は多数のプロセス プールを確立し、異なるアカウント ID を指定する必要があるため、リソースが大量に無駄になります
3.apachce は複数の実行アカウントを設定できません。 1 つを指定できます。
4. 共有ディレクトリ (/tmp、/dev/shm などを個別に指定する必要がある) は簡単な作業ではありません。
safe_mode の設定が非常に面倒なため、php の新しいバージョンでは、safe_mode のサポートが中止されることがわかります。
5.他のマシンに移行するには、ユーザー アカウントも別のマシンに移動する必要がありますが、これも非常に面倒な作業です。
セーフ モードは PHP 5.3.0 で非推奨となり、PHP 5.4.0 では削除される予定です。
したがって、著者がこの記事を書いた時点では、PHP 7.0.2 はリリースされていましたが、セーフ モードへの依存はサポートされません。
3. open_basedir を使用する理由
open_basedir は、一般的に、php プロセスが読み取る必要があるディレクトリのプレフィックスを制限するために使用されます。サイト ファイルに加えて、/tmp /dev/shm ディレクトリもよく使用されます。
サイトが /data/wwwroot/site.cn にあり、操作中に /tmp、/dev/shm、/proc ディレクトリが使用されると仮定すると、これを php.ini で設定できます
open_basedir = /data/wwwroot/site.cn:/tmp:/dev/shm:/proc
PHP で include、require、fopen、gzopen などの関数を使用して他の関数をロードする場合
require_once(): open_basedir 制限が有効です。ファイル (file.php) が許可されたパス内にありません: (PATH)
警告: require_once(file.php): ストリームを開けませんでした:
で操作は許可されていません: 致命的なエラー: require_once(): 必要なオープンに失敗しました ...
このパラメータはphp 5.2.3にあります。php.iniでのみ設定でき、実行時に設定することはできません。 PHP 5.2.3 以降では、どこにでも設定できます。
明らかに、多数のサイトを持つホストに対して複数の php.ini を使用して設定するのは非常に困難です。 2 つの方法があります:
1. php-fpm.conf 構成ファイルで、プロセス プールごとに異なる制限されたディレクトリを指定します
[www]
php_admin_value[open_basedir] = /var/www/www.example.com:/usr/share/php5:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin
php_admin_value は、この値が一度設定されると、その後は設定できないことを意味します実行時に変更されます。ただし、この方法は推奨されません。サイトが 100 個ある場合、各サイトでプロセス プールを確立する必要があり、これらの PHP プロセスは相互に使用できず、サイトごとに独立してのみ使用できるためです。共有すると、リソースが膨大に浪費されます。
2. nginx が fastcgi プロトコルを通じて php-fpm と通信する場合、リクエストが開始される前にいくつかのパラメーターを指定して php の構成パラメーターを変更できます。便利 効果的な方法、必須の推奨事項
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/:/dev/shm";
これは php-fpm の独自の機能であり、一部のパラメーターの仕様を fastcgi クライアントから受け取ることができることを意味します
$document_root 変数の導入により、バッチを直接設定できるようになりました。
このようにして、すべてのサイトが同じプロセス プールを共有できると同時に、ディレクトリへのアクセスを個別に制限する問題を解決できます。この命令を nginx の fastcgi_params 設定ファイルに追加すると、すべてのサイトがすぐに有効になり、問題が解決されます
次の php コードを使用してテストできます
php
echo ini_get('open_basedir');
ini_set('open_basedir', '/etc/');
echo ini_get('open_basedir ');
必要な制限に設定されており、実行時に変更できないことがわかります。 1 つの例から推測すると、必要に応じて nginx で php のさまざまな構成を指定できます