PHPアプリケーションには、平均よりも高いセキュリティ問題があるという評判があります。アプリケーションを可能な限り安全にするために、どのような構成手法を使用していますか?
私は次のようなアイデアを探しています:
私は通常Linuxを使用していますが、Windowsソリューションもお気軽に提案してください。
Open_basedirディレクティブを使用して、PHPスクリプトをホームディレクトリと最終的には追加のアプリケーションディレクトリに制限します。これは、それ自体で非常に効率的です。
強化されたphpを使用してください。コストはかかりません。
suPHP を使用して、PHPスクリプトをファイルの所有者(Webサイトごとに1人のユーザー)として実行し、777などの不正なアクセス許可を持つファイルの使用を回避します... suPHP can 1つのサイトの愚かな要件がすべてを破壊しないように、Webサイトごとにphp.iniを使用することもできます。
Mod_securityは大きなプラスですが、適切に使用および構成する必要があります。
私の経験では、PHPベースのWebサイトのほとんどの脆弱性は、PHP自体の欠陥ではなく、不十分な(サイト)設計の結果です。
いくつかの簡単なヒント:
*私が書いた「phpinfo()の保護、一種の」という短い投稿を覗いて、コメントを必ず読んでください http://egovsergo.com/2009/04/03/protecting- your-phpinfo / どうしてもphpinfo()をプロダクションサイトから削除するのを忘れた場合、phpinfo()を(ある程度)保護しなければならなかったのは簡単なことでした。
より一般的な方法では、一部の開発者は、「本番サイト」フラグが設定されているかどうかをチェックし、本番環境で機密関数を無効にする機密関数のラッパーを作成します。
PHPを強化するために変更する必要があるその他のパラメーター:
safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,Shell_exec,show_source,phpinfo"
すべてのPHPエラーをファイルに保存/ var/log/phperror.log:
touch /var/log/phperror.log
chmod 666 /var/log/phperror.log
dotdebリポジトリを/etc/apt/sources.lstに追加しました
deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all
Php/Apache/mysqlにパッチを適用するのは、Debianよりもはるかに頻繁です。
「サイトごと」にopen_basedir
を設定することを検討してください。 open_basedir
はphp.ini設定であり、スクリプトが定義されたホワイトリスト外のファイルにアクセスできないようにします。サーバーが複数のサイトをホストしている場合、1つのサイトが別のサイトからデータベース設定を読み取ることができなくなります。また、phpスクリプトがコアシステムファイルにアクセス/変更するのを防ぎます。オープンベースの設定は簡単です。各Apache仮想ホストに「php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list
」という行を追加するだけです。
PHPスクリプト(たとえば、アップロードされた画像フォルダ)を含めることのできないすべてのサイト/フォルダのPHPスクリプトエンジンをオフにすることも検討してください。簡単に言うと、phpを必要としないApacheVirtualHostsに「php_admin_valueengineoff」を追加します。ディレクトリでPHPを無効にするには、同じことをDirectoryタグに入れます。
ファイルのパーミッションを可能な限り厳しく実行し、ApacheユーザーのPHPスクリプトへの書き込みアクセスを避けます。これにより、実行中のスクリプトが同じサイト/サーバー上の他のスクリプトを変更するのを防ぎます。可能な限り、アプリケーションを実行し、それらを使用するために必要な最小限の権限を把握してください。
それぞれが独自のデータベースを持つ複数のサイトをホストしている場合は、それぞれに個別のMySQL/Postgresユーザーを使用し、関連するデータベースにのみアクセスできるように各ユーザーに権限を設定します。繰り返しますが、これにより、不正なスクリプトが別のアプリケーションのデータベースを改ざんするのを防ぐことができます。
Suosin、HardenedPHP、mod_securityなどもすべて価値がありますが、代わりにではなく、厳密にロックされた構成に加えてそれらを使用してください。
Suhosin/mod_security/SuPHPを使用すると、確かにPHPサーバーが安全になります。exec、passthru、system、escapeshellcmdなどの特定の機能を無効にすることも大いに役立ちます。
Suhosinにはかなりのパフォーマンスコストがあるため、「コストがかからない」というコメントは少しずれています。
基本的なファイアウォール/トポロジーの提案をお探しですか? poundのようなものを使用して、洗浄されていないインターネットからPHP Webサーバーに直接アクセスできないようにする)というアイデアが好きです。こうすることで、Webサーバーを他の部分から分離することもできます。ネットワークも同様です。