[6] PHPの設定

アプリケーション構築時における指摘は多数ありますが、ここではPHPを例に最低限サーバサイドで行っておくべき設定のサンプルを記載いたします。なお、サーバやアプリケーション要件により異なるため、要件に合わせて設定を調整してください。

  • 設定ファイル : /etc/php.ini

まずは、PHPのバージョンを非公開にするため、ファイルを修正します。

expose_php = Off

PHPは、初期設定のままではそのバージョン番号をHTTPのヘッダ情報に入れるようになっています。攻撃者から見ると、PHPのバージョンが攻撃の手掛かりになることもあります。従って、バージョン番号は非公開とすべきです。

続いて、クリックジャッキング対策です。

Header set X-FRAME-OPTIONS "DENY"

クリックジャッキング対策として、サーバーの.htaccessに上記のように記述すると他のサイトのIframe内に表示されなくなります。

ディレクティブもoffにしましょう。

allow_url_fopen = off

ディレクティブがonの場合、リモートファイルをローカルファイルのようにインクルードできるようになります。必要でない限り off にするべきでしょう。

エラー内容の出力を止めることもおすすめします。

display_errors = off
error_reporting  =  E_ALL | E_STRICT
log_errors = on
error_log = /特定ディレクトリ/phperrorlog.txt

システムの本番稼働環境において、利用者にphpエラー内容が出力されると攻撃の手掛かりとなる場合があると思います。したがって、本番環境はエラー内容の出力をoffとすべきでしょう。上記のように設定することで開発者はエラーを随時確認することができます。

[7] MySQLの設定

MySQLに関しては、最初に不要なアカウントを削除します。MySQLのインストール後、以下を実行すればインタラクティブに実行できます。

mysql_secure_installation

詳細な設定方法を確認したい方には、こちらのWikiが参考になるでしょう。

また、複数サービスのDBが1サーバで動いている場合、DBに外部から不正に侵入された時に被害が拡大します。それを最小限にするためには、サービスごとにDBユーザを作ります。以下、順に説明しましょう

まず、DBユーザを作る時は、権限を与える対象DBを明確にします。ユーザ名をuser1、DBをuser1dbで設定するのであれば、以下のように入力します。

GRANT ALL PRIVILEGES ON user1db.* TO user1@'%' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

接続元も決まっているのであれば、接続元も限定します。例えば、localhostからのみ接続できるようにするならば以下のようなかたちです。ちなみに、上記に含まれていた「%」はすべて許可です。

GRANT ALL PRIVILEGES ON user1db.* TO user1@localhost IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

また、FWも接続元IPやネットワークからのみ接続できるようにします。例えば、10.0.0.0/24 からのみ接続を許可するのであれば、以下のように設定します。

-A INPUT -s 10.0.0.0/24 -p tcp -m tcp --dport 3306 -j ACCEPT

DBユーザでの認証があるからと、「-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT」とフルオープンにすると、どこからでもサーバプロセスと通信自体は可能となります。仮にMySQL自体に脆弱性が存在した場合、認証機構をスキップされたりする可能性があるのでおすすめしません。通信が可能ということは、認証に対してブルートフォースアタックも可能になってしまいます。

なお、WebサーバとDBサーバが同一サーバで、localhostからしか接続しないなら、デフォルトで設定されている「-A INPUT -i lo -j ACCEPT」で、localhostからの接続は許可されているため、設定を変える必要はありません。

*  *  *

最低限必要な項目は以上です。

安全な環境を作るために少し手間はかかりますが、サーバを管理するのであれば必須の項目と言っていいと思います。

なお、本記事は2014年7月14日の執筆現在、最も利用・普及されていると推測されるCentOS6系をターゲットとし設定内容を記載しております。したがって、2014年7月11日に リリースされたCentOS 7 を用いている場合、本記事の記載内容と設定方法が異なる箇所が存在します。もし、CentOS 7でお困りの場合、あるいは他の対策をご希望の場合は、レオンテクノロジーまでご連絡ください。

著者プロフィール

守井 浩司(Morii Kouji) - 株式会社レオンテクノロジー 代表取締役社長


ネットワーク/アプリケーションエンジニアとして多くのプロジェクトで活躍した後、平成17年3月にレオンテクノロジーを設立。

自らネットワークセキュリティエンジニアとして、数々のセキュリティ診断・検知・対策ソリューションを開発。平成26年7月にWordPress専門セキュリティ診断サービス「KYUBI」をリリースする。顧客へ「安全」「安心」「安定」を提供すべく、サービスを日々アップデートしつづけている。