2. Apache(httpd)とPHPのインストール
OSインストール直後の各種設定の次には、httpdとphpの各種パッケージをyumの標準リポジトリ(baseまたはupdate)からインストールし(①)、設定ファイルの編集(②③④)とログローテーションの設定を行い、httpdを再起動します(⑤)。
①httpdとphpの各種パッケージのインストール
最初に次のコマンドで、httpdとphpの各種パッケージをyumの標準リポジトリ(baseまたはupdate)からインストールします。
# Apache+PHP Install yum -y install httpd php php-bcmath php-cli php-common php-dba \ php-embedded php-enchant php-fpm php-gd php-intl php-mbstring \ php-pdo php-pear php-pecl-apc php-pecl-memcache php-process \ php-pspell php-recode php-soap php-tidy php-xml php-xmlrpc php-zts
②php.iniの設定
/etc/php.iniに1箇所だけ設定変更を加えます。今回設置するサーバーのタイムゾーンが東京なので、php.iniのタイムゾーン設定を明示的に「Asia/Tokyo」にします。設定しなくても実害はありませんが、Apacheのエラーログ(/var/log/httpd/error_log)にタイムゾーン不整合のエラーが出続けるのを防ぐことができます。
## php.ini Configuration
cp -p /etc/php.ini{,.orig}
sed -i "s/;date.timezone =/;##--@--##date.timezone =\ndate.timezone = Asia\/Tokyo/" /etc/php.ini
③httpd.confの設定
今回の一撃シェルスクリプトにおいて、Apacheの設定ファイル(/etc/httpd/conf/httpd.conf)に次の設定変更を加えます。
- ServerTokensを「OS」から「Prod」へ変更し、ブラウザへ表示するエラー画面にサーバー情報を表示することを抑止する
- ServerSignatureを「On」から「Off」へ変更し、ブラウザへ表示するエラー画面フッタ部分に署名を表示させない
- httpd.confの末尾に「TraceEnable off」を追記し、Traceメソッドのリクエストを無効化する(理由はコラムを参照)
- /var/www/htmlディレクトリでOptionsディレクティブを許可しない
## Apache Configuration
HTTPDCONF=/etc/httpd/conf/httpd.conf
cp -p ${HTTPDCONF} ${HTTPDCONF}.orig
sed -i 's/^ServerTokens[[:space:]]*OS/ServerTokens Prod/' ${HTTPDCONF}
sed -i 's/ServerSignature[[:space:]]*On/ServerSignature Off/' ${HTTPDCONF}
echo "TraceEnable off" >> ${HTTPDCONF}
HTTPDCONFLINE=$(wc -l ${HTTPDCONF} | awk '{print $1}')
HTTPDCONFNUM=$(cat -n ${HTTPDCONF} | egrep -A ${HTTPDCONFLINE} '(<Directory[[:space:]]*"/var/www/html">)' | \
egrep -m 1 -B ${HTTPDCONFLINE} '(</Directory>)' | egrep '(Options)' | egrep -v "#" | awk '{print $1}')
sed -i "${HTTPDCONFNUM}s/Options[[:space:][:alnum:]]*/Options None/" ${HTTPDCONF}
設定変更1〜3の処理はシンプルで、いずれも1行で完結しています(3行目~5行目)。一方、4の処理(/var/www/html ディレクトリでOptionsディレクティブを許可しない)には少し複雑なテクニックを使っています(7行目以降)。解説しましょう。
CentOS 6にyumでインストールされるhttpd-2.2では、/var/www/htmlディレクトリに対して「Options Indexes FollowSymLinks」の設定が施されており、ドキュメントルートにindex.htmlを置かないと、ディレクトリの一覧が丸見えになってしまいます。また、ここでシンボリックリンクを有効にしておく理由もないため、無効化します。
httpd.confには複数のディレクトリに対する設定が書かれており、「<Directory "/var/www/html">」から「</Directory>」の間に書かれているOptions設定のみを捕まえて、sedコマンドで置換することにします。まず、HTTPDCONFLINE変数にhttpd.confの行数を格納します。これは次のHTTPDCONFNUM変数に格納する値を検出するためにegrepコマンドの-Aオプションと-Bオプションでそれぞれ行数を指定するのですが、(仮に100行で指定しても1000行で指定してもよいのですが)httpd.confの行数を指定しておけば間違いがないだろうという根拠です。
次に、HTTPDCONFNUM変数で該当行が何行目にあるかを検出しているのですが、これはegrepコマンドで「<Directory "/var/www/html">」にマッチした行から複数行を表示し、「</Directory>」に最初にマッチする行までを抜き出し、さらにegrepコマンドで「Options」にマッチする行(コメントを除く)を抜き出し、awkコマンドで1フィールド目、すなわち該当行の行数を捕まえています。
最後にsedコマンドで、該当行のOptionsをNoneにしています。
Traceメソッドは、クライアントからのhttpリクエストをそのままレスポンスとして返すものです。これだけで即ち危険というわけではないですが、クロスサイトスクリプティング(XSS)とTRACEメソッドを組み合わせたクロスサイトトレーシング(XST)攻撃を行うことで、XSS単独では盗ることのできないHttpOnly属性の指定されたCookieや、Authorizationヘッダを盗み出すことができます。
とはいえ、最近のブラウザはXST対策が取られているので、Traceメソッドそのものを無効化するのは「やっておくに越したことはない対策」であり、そもそもXSTは元々XSS脆弱性が存在しないと危険性はなく、アプリケーション側でXSSを起こさないようにするのが正道であると考えます。
【参考資料】 実はそんなに怖くないTRACEメソッド | 徳丸浩の日記
XSSを防ぐには、アプリケーションの実装で注意を払うか、WAF(Web Application Firewall)を導入するのが有効です。IPA(独立行政法人 情報処理推進機構)がWAFの概要、機能の詳細、導入におけるポイントなどをまとめた手引書を公開しているので、一読をお勧めします。
indexファイルがない場合のエラードキュメントの返信を無効化
httpd.confの設定は以上ですが、もう1つだけ変更しておきたいことがあります。
/etc/httpd/conf.d/welcome.confファイルが存在すると、/var/www/htmlディレクトリにindexファイルがない場合、つまりステータスコード403が発生した場合には、画面1のようなエラー画面を出します。
この画面ではCentOSであることや、ドキュメントルートのPATHを堂々と明かしてしまっています。すでにServerSignatureをOffにしましたので、ここは/etc/httpd/conf.d/welcome.confを無効化し、デフォルトのエラー画面を出すほうが賢明です。
無効化の方法は簡単で、/etc/httpd/conf.d/BACKUPディレクトリを作成し、/etc/httpd/conf.d/welcome.confをここへ移動するだけです。

