_ あたまいたい。
_ 休んでるヒマなんかないほど仕事は詰まってるんだが明日までになおるだろうか。
_ 3ゾロ。
_ 出遅れたが たった2行でできるWebサーバ防御の「心理戦」という記事。親切にも はてブから 前にも書いたことにリンクしてくれた人がいたようだけど、そういうわけなのでそっちも参照してくだされ。というか、以下は去年書いたことに対する長い長い蛇足。
_ なぜ多くのサーバソフトウェアはデフォルトで外からバージョン番号が見えるようになっているんだろうか。バージョン番号が見えることにセキュリティ的な問題があるいうのが広く認識された事実なのであれば、デフォルトでバージョンを外にさらすよういなことはしないはずだ。いちおう RFC2616 にはその可能性は言及されていて「設定で変更できるようにするべき」とあるけど、バージョンを出すべきでないとなっているわけではないし、実際の実装がそうなっているわけでもない。そんなのは晒してもセキュリティ的な問題はない、と認識されてるのがほんとのところだと思う。
_ つーか、隠すのは Server ヘッダやエラーページに表示されるバージョンだけでいいの?
ちなみに Apache ではなく BIND でも、chaos txt version.bind. を問い合わせずにだいたいのバージョンを判別することはできる。バージョンによる挙動の違いに触れた文書はむしろ Apache より BIND の方が豊富(JPNIC のサイトにいっぱい転がってる)。
- ServerTokens や ServerSignature でバージョンを出さないように設定したって、いくつかの挙動を注意深く観察すれば 1.3 か 2.x かどちらでもないものかぐらいは判別できる。さすがに 1.3.x のどれかまではわからんけど(わしにはわからんけど人によってはわかるかも)。
- そもそもサーバが Apache であることは隠さなくていいの?
- TCP のフィンガープリントを見れば使っている OS とだいたいのバージョンぐらいはわかるけど、そっちは放置でいいの?(隠そうと思って簡単に隠せるものじゃないけど)
_ そもそも隠すのはサーバだけでいいの? 攻撃ってのはサーバに対するものだけでなく、クライアントに対するもの(受動的攻撃)だってある。この記事の理屈にしたがうならクライアントのバージョンによって受動的攻撃を受けたり受けなかったりする可能性もあるんだけど、じゃあ、そのバージョンは隠さなくてもいいの? ブラウザの User-Agent を変更するネタもたまに見るけど、UA によるアクセス制限を回避するのが目的なのがほとんど、残りは自分の使っているブラウザを知られたくないというプライバシー的なもので、攻撃を受けないために変更するという観点で書かれたものはただの一度も見たことがない。いつだったか、どっかの ML でサーバのバージョンを隠した方がいいですよ、なんてアドバイスをしている人のメールヘッダを見たら、Emacs な人にありがちなヘッダに elisp のバージョンがこと細かに載ってるものだったことがあって失笑した。MUA だって受動的攻撃を受ける可能性はあるわけだけど、バージョンによってターゲットを選別するような攻撃を受けることがあると信じるのらばこっちも隠さなきゃ矛盾だよ。
_ っていうか、もしもわしが攻撃コードを書くとしても 前に書いたようにバージョン番号を変えずにパッチをバックポートしている場合や、設定によって穴がふさげる場合もあるから、そんなものはアテにしないでいきなり穴を叩くように作るけど、仮にチェックするとしても、
ではなく、if (穴ありバージョン) { 攻撃 }にすると思うね。バージョンが不明というのは古い可能性もある、ということだから叩いてみる価値はあるでしょ。実際に穴をつつくコードを書く人の精神構造は知らないけどさ、わしと同じ考え方をしているのならば、穴なしバージョンでもバージョンを隠すと逆によけいなちょっかいを出されるということ(穴なしならばそれで侵入を許すわけじゃないけど)。バージョンによって対象を選別するような攻撃者の目を逸らすのが目的ならば、バージョンを隠すのではなく、「最新版を使ってます」と嘘をつく方が効果あるはず。あるいは apache 1.3.99 とかの存在しないバージョンとかね。if (穴ありバージョン || バージョン不明) { 攻撃 }_ バージョンを隠すこと自体は否定しない。効果があるかどうかは疑問にしても、それをおこなうことによる害もないから。でも、そういう取るに足らないつまらないことを気にするぐらいならば、それにかける時間を使ってもっと別の対策をした方がずっと有意義だと思う。バージョン隠しは気休めにしかならない(あるいは気休めにもならない)ことは認識しておかなきゃ。バージョンを隠しても、バージョンが見えると文句を言う人とクソつまらない議論をしなくていいこと以上のメリットはない、とわしは冗談ではなく思ってる。
_ で、バージョンは隠しましょう、という記事を置いている www.atmarkit.co.jp のサーバが
とバージョンを垂れ流しているわけなのだが。もちろん記事を書いた人と、その記事を置いているサイトのポリシーが一致するなんて思っていないけどね。っていうか、PHP/4.4.4 はヤバいぞ:-)Server: Apache/1.3.37 (Unix) PHP/4.4.4 mod_ssl/2.8.28 OpenSSL/0.9.8e
_ えー、 CPU を食い尽くすバグは直ってない。開発版はまだ試せてないんだけどどうなんだろう。svn co がなんかコケるんだよね。
_ root 権限で動くってどうよ?の件は、デフォルトで nobody:nogroup で動くように変更された。管理インターフェイスに ACL を設定できない件はそのまま。
_ 動作に必要なファイルのいくつかの置き場所が /tmp にハードコードされていてキモかったんだけど、これは起動時の引数で変更できるようになったみたい。ただし、configure で --prefix を指定せずにビルドしてデフォルトのまま起動しようとすると、configure 中に書かれている prefix=NONE がそのまま使われて NONE/var/varnish というとんでもないところにファイルを作成しようとして起動に失敗する。そのぐらいリリースする前にチェックしようよ……。起動時の引数で、あるいは configure の引数でちゃんと明示しておけば問題なし。
_ 起動したり止めたり暴走させたりしただけで、実際にプロクシとしてアクセスさせるような確認はまったくしていないので、それ以上のこまかいところがどうなったのかはわかんね。そんなにいじってる時間なんか取れないよ。
_ it がないのは気にしない。
_ svn co がうまくいかない件。まだ遊びでいじってる varnish だけではなく、仕事で使うものもコケる。なんでだろー、と試しに FreeBSD の ports からインストールした subversion を使ったらあっさりちぇけら!できた。うまくいかなかったのは debian etch な colinux の環境だけど、こんなあたりまえの使い方でコケるならとっくに大騒ぎされてるはずだからたぶんわしのところだけの問題。でもどこがおかしいのか調べてるヒマなんかない。とーぜん、ちぇけら!したソースからコンパイルして試すヒマもない。
_ えーと、生成された例として挙げられている .htaccess をよく見てみる。んで、次に こっちを読んでみる。
_ もうわかったよね。
_ クソだから使うな。つーか、こんなクソを紹介するな。
_ pf で
(8080番ポートへのアクセスを 127.0.0.1:80 にリダイレクトする)という設定を入れると、CGI に渡される環境変数はrdr pass proto tcp from any to any port 8080 -> 127.0.0.1 port 80になる。リダイレクト先の IP アドレスが SERVER_ADDR に設定されるなら、ポート番号もリダイレクト先の 80 になるはずじゃね? apache は80番を listen してるだけなのに、なんで関知してない8080番が SERVER_PORT に出てくるんだろ?SERVER_ADDR=127.0.0.1 SERVER_PORT=8080_ パケットキャプチャしてみたところ、たしかに 127.0.0.1:8080 とお話していて 127.0.0.1:80 との通信は発生していない。んじゃなんで httpd とつながってるんだろ。IP アドレスは L3 でポート番号は L4 だから、ということなのかなぁ。納得できてないけど。
_ だれか教えてエラい人!