SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場

Apacheホスティング環境(Webサーバー+PHP実行環境)をコマンド一発で構築する一撃シェルスクリプト

ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場 第1回


2. Apache(httpd)とPHPのインストール

 OSインストール直後の各種設定の次には、httpdとphpの各種パッケージをyumの標準リポジトリ(baseまたはupdate)からインストールし(①)、設定ファイルの編集(②③④)とログローテーションの設定を行い、httpdを再起動します(⑤)。

①httpdとphpの各種パッケージのインストール

 最初に次のコマンドで、httpdとphpの各種パッケージをyumの標準リポジトリ(baseまたはupdate)からインストールします。

httpdとphpの各種パッケージをインストール
# 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の設定
## 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)に次の設定変更を加えます。

  1. ServerTokensを「OS」から「Prod」へ変更し、ブラウザへ表示するエラー画面にサーバー情報を表示することを抑止する
  2. ServerSignatureを「On」から「Off」へ変更し、ブラウザへ表示するエラー画面フッタ部分に署名を表示させない
  3. httpd.confの末尾に「TraceEnable off」を追記し、Traceメソッドのリクエストを無効化する(理由はコラムを参照)
  4. /var/www/htmlディレクトリでOptionsディレクティブを許可しない
httpd.confの設定
## 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メソッドを無効化する理由

 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のようなエラー画面を出します。

画面1:/etc/httpd/conf.d/welcome.confにより表示されるエラー画面
画面1:/etc/httpd/conf.d/welcome.confにより表示されるエラー画面

 

 この画面ではCentOSであることや、ドキュメントルートのPATHを堂々と明かしてしまっています。すでにServerSignatureをOffにしましたので、ここは/etc/httpd/conf.d/welcome.confを無効化し、デフォルトのエラー画面を出すほうが賢明です。

 無効化の方法は簡単で、/etc/httpd/conf.d/BACKUPディレクトリを作成し、/etc/httpd/conf.d/welcome.confをここへ移動するだけです。

次のページ
3. サーバー運用ツール「VHMAINTE」の生成

この記事は参考になりましたか?

ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場連載記事一覧

もっと読む

この記事の著者

濱田 康貴(ハマダ ヤスタカ)

サーバーエンジニアとして主にLinuxのWEBサーバーを設計、構築、運用を行っています。運用ツールの相棒としてシェルスクリプトやワンライナーは心強いパートナーと信じて疑わず、ブログでTIPSを公開しています。2009年5月のUSP友の会活動開始より参画し、現副会長。最近では、USP友の会で「一撃サーバー構築シェルスクリプト勉強会」を開催しているほか、日本で唯一のシェルスクリプト総合誌『シェルスクリプトマガジン』(毎月25日発売)で、隔月(偶数月号)連載「教えて先輩 サーバー運用お助けTips」を執筆しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8434 2015/04/02 19:58

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー