HostnameLookups Off でも逆引きしてしまう

ある日Apacheのログを見ていたら、HostnameLookupsをOffにしているはずなのに、いつの間にか接続元IPアドレスを逆引きするようになっていることに気がついた。

123.224.247.XXX - - [23/Jul/2013:23:31:18 +0900] "GET / HTTP/1.1" 403 5039 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:22.0) Gecko/20100101 Firefox/22.0"
...
...
p2XXX-ipbf4207marunouchi.tokyo.ocn.ne.jp - - [23/Jul/2013:23:37:32 +0900] "GET / HTTP/1.1" 403 5039 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:22.0) Gecko/20100101 Firefox/22.0"

リクエストごとに逆引きをしているとパフォーマンスも劣化するし、そもそも余計なことをして欲しくないからデフォルトのOffにしていたのに……何故だ?

結論:コメントを入れたせいでした

勝手に逆引きされていた原因は、「そんな馬鹿な」と自分でも思ったけど、httpd.conf内に書いたコメントだった。Apacheでは、httpd.confでAllow/Denyを指定する際に、間違った形式でコメントを入れてしまうとHostnameLookupsがOff(デフォルト)であっても強制的に接続元IPアドレスを逆引きするようになってしまう。

というわけで、この辺の動きを以下に少し細かく説明する。まぁ正確には、「コメントだと思って入れた記述が実はコメントになっていなかった」事案なのだが……。

mod_authz_host

まず、予備知識。

Apacheのホストベースアクセス制御をおこなうAllowディレクティブとDenyディレクティブは、mod_authz_hostモジュールにより実現されている。今まで当たり前のように使っていたので、このモジュール名もよく知らなかった。

Allow, Denyを書く際、以下のようなコメントを入れてしまったことは無いだろうか。実はこれは、誤りである。

# [myPC]というコメントを入れたつもりだが、これは誤り!
Order Deny,Allow
Deny from all
Allow from 192.168.10.125  #myPC

Allowディレクティブは、fromの後に複数のホストを並べて書くことができる。つまり上記のようにすると、「#myPC」の部分はコメントにならず、「"192.168.10.125" と "#myPC"」という2つのホストを許可したことになってしまう。

そしてmod_authz_hostは対象ホストとして文字列が出てくると、HostnameLookupsの設定がOffになっていようと、強制的にクライアントのIPアドレスに対してDNSの逆引きを行なう。そのためログ上も逆引きされた接続元で出力されていた……というわけだ。

というわけで、コメントは以下のように行を独立させ、正しく書かないといけない。

Order Deny,Allow
Deny from all

#myPC
Allow from 192.168.10.125

というお話でした。