いよいよ大晦日ですね。
何もしないうちにあっという間に大晦日。
今年も一年お世話になりました。

さて、今年の年末年始はエンジニアとしての「カン」を取り戻すべく、
サーバーと格闘することになりそうです。

レンタルサーバーでVPSを借りて
Apache2.4.3のインストールを無事終わらせました。


これまでの記事


前回、インストールしてとりあえずIt works!の表示がされるようになりました。
ただ、このまま運用するのはセキュリティー上危険です。

いくつか必要な設定をしちゃいましょう。

そういえば、SEO対策をする人と同様にセキュリティー対策をする人多いですね。
@ITでもセキュリティー対策している方がいました。

第1回 Apache 2.0の必須設定と基本セキュリティ対策
http://www.atmarkit.co.jp/flinux/rensai/apache2_01/apache01a.html

大辞泉

セキュリティー【security】
1 安全。また、保安。防犯。防犯装置。「―システム」2 担保。3 有価証券。債券。

セキュリティー対策をするのは悪意のあるハッカーさんやクラッカーさんだと
思います。いつもすごく気になる一言です。

さて、話を戻して、さくっと設定していきましょう。


1.Apacheのバージョン情報の隠ぺい


まず、Apacheなのですが、このまま運用すると、HTTPレスポンスヘッダの中に
Apacheのバージョンが表示されます。
PHPを入れるとPHPのバージョン情報まで表示してくれます。

実際、インストールしたてのサーバーにアクセスしてみると、


GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 14:21:48 GMT
Server: Apache/2.4.3 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Connection: close
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>


しっかり、出ています。
この後、PHPを入れるとこうなります。

GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 30 Dec 2012 09:04:56 GMT
Server: Apache/2.4.3 (Unix) PHP/5.4.10
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Connection: close
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>


え?何が問題なの?という方。
今は最新の安定バージョンを入れているのであまり問題になりません。

この後、常にセキュリティ情報に目を配り、セキュリティホールが発見されたのを
いち早く察知して、バージョンアップ等の対策を取っていけば
あまり大きな問題にはならないでしょう。

でも、24時間365日セキュリティ情報に目を配り、
万全な管理体制ができているのでなければ、放置されるのはよくあること。
ましてや個人で借りたレンタルサーバーなら尚更です。

今使っているバージョンのミドルウェアでセキュリティホールが見つかり、
対策されずにそのままになっている。
そんな中、セキュリティホールがあるバージョンのApache使ってますよ。
と宣言するのは、この家鍵かかってませんよ!と家に看板を付けるのと同じです。

なのでバージョンを隠す必要があるんですね。

設定は、httpd.confでServerTokens ProductOnlyを追加します。

# cd /usr/local/apache2/conf
# vi httpd.conf


はじめ、の中に記載したらそこじゃないと怒られたので、
ServerNameの下に下記の記載を追加しました。

186 ServerName (IPアドレス)
187


ここに、

188 ServerTokens ProductOnly


を追加します。
初期設定では記載されていないようです。設定が無い場合にはすべての情報を表示する
Fullが設定されているのと同じふるまいをします。

ここに、1つバグが潜んでました。
この値、configtestをしても、設定値が正しいかどうかチェックしてくれません。
間違えて、ProdctOnlyとか書くと、Fullと同じふるまいをしてくれます。

http://comments.gmane.org/gmane.comp.apache.httpd.bugs/6272

記載内容は間違えないように気をつけましょう。

設定が終わったら、保存してApacheを再起動します。

# /usr/local/apache2/bin/apachectl configtest
# /usr/local/apache2/bin/apachectl restart


再起動したら、ちゃんと消えているかどうか確認します。

GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 30 Dec 2012 09:03:17 GMT
Server: Apache
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Connection: close
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>

$もと東大生もと社長の自由奔放ブログ Just do it now!-Forbiddenのページ
▲サーバー情報の消えた403 Forbiddenのページ

$もと東大生もと社長の自由奔放ブログ Just do it now!-Forbiddenの情報付ページ
▲サーバー情報付の403 Forbiddenのページ

表示されなくなりました。

ちなみに、2.2系より前のapacheを使っているようでしたら、
ServerSignature off
の設定の追加もお忘れなく。
ServerTokens ProductOnlyの下に記載すると動作します。

2.2以降であれば、明示的に
ServerSignature on
と設定しない限り表示されませんが、2.2より前のApacheでは
エラー画面にApacheのバージョン情報が表示されます。

ちなみにここに出力される情報にもServerTokens の設定内容が反映されます。



2.TRACEメソッドの無効化


続いて、TRACEメソッドを無効にしておきます。
TRACEメソッドはHTTP/1.1から追加されたメソッドで
受け取ったリクエストをそのまま返す、テスト等に使われるメソッドです。
詳しくはRFC2068で説明されています。
http://lab.moyo.biz/translations/rfc/rfc2068-ja.xsp#9.8

TRACEメソッドが有効になっていると、XST(Cross-Site Tracing)という手法で、
HTTPヘッダー情報が漏えいしてしまう危険性があります。
とは言え、レポートによると現状問題になりうるブラウザーはIE6.0のみとのこと。
不要なメソッドは無効にするに限ります。

TRACEメソッドの現状
www.gsx.co.jp/tts/activity/110413.pdf

TRACEメソッドを無効にするにはhttpd.confに
TraceEnable off
の記載を追加します。

先ほどのServerTokens ProductOnlyの下に記載すると動きます。

# cd /usr/local/apache2/conf
# vi httpd.conf


186 ServerName (IPアドレス)
187
188 ServerTokens ProductOnly


この下に
189 TraceEnable off


を追加します。

終わったら例によってApacheの再起動

# /usr/local/apache2/bin/apachectl configtest
# /usr/local/apache2/bin/apachectl restart


試してみると、405 Method Not Allowedが返ってきます。

HTTP/1.1 405 Method Not Allowed
Date: Mon, 31 Dec 2012 09:49:07 GMT
Server: Apache
Allow:
Content-Length: 223
Content-Type: text/html; charset=iso-8859-1


これでOK。


取り急ぎ、やっておくべきApacheのセキュリティ関係の設定は終わりです。

最期に自動起動の設定をしておきます。

自動起動設定


Apacheには自動起動のためのひな形が用意されているので、コピーします。

# cp /usr/local/src/httpd-2.4.3/build/rpm/httpd.init /etc/rc.d/init.d/httpd


そしてファイルのパスを実態に合わせて変更します。

26 # config: /etc/sysconfig/httpd

を以下の内容に変更
26 # config: /usr/local/apache2/conf/httpd.conf


60 httpd=${HTTPD-/usr/sbin/httpd}

を以下の内容に変更
60 httpd=${HTTPD-/usr/local/apache2/bin/apachectl}


61 pidfile=${PIDFILE-/var/run/${prog}.pid}

を以下の内容に変更
61 pidfile=${PIDFILE-/usr/local/apache2/logs/httpd.pid}


67 CONFFILE=/etc/httpd/conf/httpd.conf

を以下の内容に変更
67 CONFFILE=/usr/local/apache2/conf/httpd.conf


終わったら、実行権限を付与して、サービス一覧に追加します。

# chmod +x /etc/rc.d/init.d/httpd
# chkconfig --add httpd
# chkconfig httpd on


これでOK。

そして、Apache2.4系から変わったバーチャルホストの設定で
更にはまってしまいました。

再び続く。
引っ張っているわけではないのですが、記事が長くなりすぎました。

次の記事