Apache CVE-2011-3192 対応

先月末に世間を賑わせたRange headerを悪用したDoS攻撃を食らうApacheの脆弱性。
Ubuntuでも対応パッケージがリリースされていたのでインストール。
ウチはUbuntu 10.04LTSを使ってるけど、Apache 2.2.14にパッチを当てたパッケージになっているので細かい動作検証は不要っぽい。
Debianの対応チームに感謝!!

以下、更新パッケージ詳細

apticron report [Sat, 03 Sep 2011 04:40:11 +0900]
========================================================================

apticron has detected that some packages need upgrading on:

kuniharumaki.com

The following packages are currently pending an upgrade:

apache2 2.2.14-5ubuntu8.6
apache2-mpm-prefork 2.2.14-5ubuntu8.6
apache2-prefork-dev 2.2.14-5ubuntu8.6
apache2-utils 2.2.14-5ubuntu8.6
apache2.2-bin 2.2.14-5ubuntu8.6
apache2.2-common 2.2.14-5ubuntu8.6

========================================================================

Package Details:

Reading changelogs…
— Changes for apache2 (apache2 apache2-mpm-prefork apache2-prefork-dev apache2-utils apache2.2-bin apache2.2-common) —
apache2 (2.2.14-5ubuntu8.6) lucid-security; urgency=low

* SECURITY UPDATE: Range header DoS vulnerability
– debian/patches/207_CVE-2011-3192.dpatch: filter out large
byte ranges and improve memory efficiency in handling buckets.
(thanks to Debian and upstream)
– CVE-2011-3192
* Include fix for regressions introduced by above patch:
– debian/patches/208_CVE-2011-3192_regression.dpatch: return 206
and 416 response codes where appropriate (see deban bug 639825)

— Steve BeattieThu, 01 Sep 2011 01:52:17 -0700

========================================================================

You can perform the upgrade by issuing the command:

aptitude full-upgrade

Apacheのログ出力はcronolog経由が便利

Ubuntuでもそうだけど、Apacheインストール直後はlogrotateで4時くらいにログをローテートさせるのが一般的。

  • 何か追加でインストールする必要が無い
  • 指定した期間でローテートできる
  • 指定した期間で削除できる
  • 自動的に圧縮できる

みたいなメリットがある。
でも逆に、

  • 出力ファイル名を変更できない(出来るけど面倒)
  • さらに月別にディレクトリを掘るとかが大変

ってことで、出力ファイル名を変えたい人は普通Apacheに付属のrotatelogsを使っているみたい。
でも、どうにもrotatelogsのオプションがしっくりこなくて使ってなかったんだけど、似たようなものでcronologというのがあって、そっちがしっくりきたので、簡単にメモ。

インストールはaptitudeで簡単に入るので省略。

使い方も簡単で、ログ出力指定のところにパイプで書くだけ。

CustomLog “|/usr/bin/cronolog -S /var/www/logs/latest -P /var/www/logs/latest.prev /var/www/logs/%Y/%m/default-%Y%m%d-access.log” combined

こんな感じ。ErrorLogやRewiteLogなどパイプで渡せる部分にならどこでも使える。(別にApacheじゃなくても良い)
年/月 とディレクトリを作成して、その下に default-20100601-access.log みたいなファイル名でログを出力する設定になっている。

詳しいオプションは本家ページのUsageを確認して貰うとして、便利なのは S オプションと P オプション。
それぞれ、Sが最新(現在出力中)のファイルへのシンボリックリンク作成、Pが一個前(上記の例だと1日前)のファイルへのシンボリックリンクが作成される。
いちいち今出力されているログファイルのパスとかファイル名を考えなくてもシンボリックリンクを参照すれば良いので管理が楽になる。

結構ボケーッとログファイルを眺めていることが好きなので、そういうときには、

tail -q –follow=name –retry /var/www/logs/latest

とかやっておけば、ログを流して見ておけるし、日付が変わってリンク先が切り替わっても追従してくれる。
pオプションで作ったリンクは、前日のログファイルをvisitorsなどで解析するときの指定に便利。

rotatelogsは付属してくるので割と使われているのを見るけど、cronologの方が高機能だからオススメ。

ちなみに当たり前だけど、ログは出力されっぱなしで圧縮も削除もされないので、その辺りはfindコマンドなどで別途実装する必要がある。

Ubuntu(Gutsy)のApache2でSSLを使う場合

Debian(etch)からの移行時に軽くはまったのでメモ。

基本的には、Debian etchでSSL – よしだメモで紹介されている方法と全く一緒。まあ、UbuntuもDebianベースだし。
ポイントは、ちょっと前まで存在していたapache2-ssl-certificateが無くなったから自前でやるってこと。(なんで無くなったんだ…

上記サイトを参考に /etc/apache2/ssl/ にでも証明書と鍵ファイルを置く。
# zcat /usr/share/doc/apache2.2-common/examples/apache2/extra/httpd-ssl.conf.gz > /etc/apache2/sites-available/
して、/etc/apache2/sites-available/httpd-ssl.conf を環境に合わせて適当に書き換えてから、
# a2ensite httpd-ssl.conf
でapache側の設定は完了。

鼻息を荒くして、
# /etc/init.d/apache2 start
したら、、
Address already in use: make_sock: could not bind to address [::]:443
とか出た。netstat -an とかしてみても別に443使ってる奴は居ないけど。。。

んで色々と見てみたら、さっきの httpd-ssl.conf の中に Listen 443 が記述されているんだが、/etc/apache2/ports.conf にも同様の記述が。。。
どっちを消しても良いのだが、httpd-ssl.conf を使わないときには 443 listenする必要も無いので、ports.conf側の 含めてバッサリ。これで起動。

etchのときに全く同じことをしたはずなのに、記憶無しってのが終わってるな。。。