mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Apache2 - 脆弱性対策!

[ サーバ構築 ] [ Apache, CentOS ]

こんばんは。

最終的には Apache2 の脆弱性の対策を施していますが、経緯から記録します。 確認・対策した環境は CentOS 6.2 です。

経緯

1.サーバダウン

最初、自宅の CentOS サーバにアクセスできなくなっていて発覚しました。 異常に HDD アクセスをしていて、重くなっているようでした。

2.サーバ再起動

全くサーバへのアクセスが出来ないので、強制的にサーバマシンをリブートしました。

3.再度サーバダウン

サーバマシンリブート後しばらくは順調に稼動していましたが、数日後くらいにはまた、同じような現象に陥りました。

4.ログ調査

ここで初めて、ログ調査してみました。 “/var/log/messages” には以下のようなメッセージが出力されいました。

1
2
3
4
5
6
7
====< 途中省略 >====

Jan 17 10:12:53 hoge kernel: error invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
Jan 17 10:13:08 hoge kernel: error cpuset=/ mems_allowed=0
Jan 17 10:13:08 hoge kernel: Pid: 20308, comm: error Not tainted 2.6.32-220.2.1.el6.i686 #1

====< 途中省略 >====

どうやら、実メモリ+仮想メモリを使い切ったため、メモリを確保するためにプロセスを強制終了させる OOM Killer(Out of Memory Killer)が動いたようです。 OOM Killer については、以下等をご参照ください。

調査・対策

1.原因調査

OOM Killer が動いたことは分ったのですが、そのような現象に陥る原因を調べてみました。 おそらく、Apache2 に脆弱性があることが原因のようです。 この脆弱性を狙った DoS 攻撃が一番濃厚です。

この脆弱性対策が施された Apache2 のバージョンは 2.2.20 以上のようですが、当方のサーバの Apache2 のバージョンは 2.2.15 でした。

2.対策

一番の対策方法は、Apache2 を 2.2.20 以上にアップデートすることです。 しかし、CentOS の標準リポジトリでは yum でのアップデートは不可能です。 別のリポジトリを導入すれば可能のようですが、新たにリポジトリを導入するのも面倒だし、ソースからインストールする方法も考えましたが、サーバで使用している Apache2 が他に与える影響を考えると、conigure オプションを調べるのも面倒。 ましてや、他のパッケージの依存性も考えると心配な事だらけ。 また、別の方法として、公式で公開されているパッチを当てることも可能のようですが。。。 ※2.2.16 - 2.2.19 なら http://www.apache.org/dist/httpd/patches/apply_to_2.2.19/ 結果として、今回は一時的な対処として、httpd.conf に不正なヘッダーやリクエストそのものを拒否する記述を追加する方法を採りました。 以下を参照

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# vi /etc/httpd/conf/httpd.conf

====< 途中省略 >====

# Drop the Range header when more than 5 ranges.
# CVE-2011-3192
SetEnvIf Range (?:,.*?){5,5} bad-range=1
RequestHeader unset Range env=bad-range

# We always drop Request-Range; as this is a legacy
# dating back to MSIE3 and Netscape 2 and 3.
RequestHeader unset Request-Range

# optional logging.
CustomLog logs/range-CVE-2011-3192.log common env=bad-range
CustomLog logs/range-CVE-2011-3192.log common env=bad-req-range

====< 途中省略 >====

そして、もちろん Apache2 を再起動します。

3.その他

今のところ、順調に運用できています。 今回は、上記の方法で対策してみましたが、あくまでも一時的なものです。 しっかり対策するなら、Apache2 を 2.2.20 以上にアップデートした方がよいでしょう。


以上。

Comments