国別フィルタを探してたらこんなの発見
MaxMind – GeoIP Apache API
GeoIPってホスト名 or IPアドレスの割り当てられている国を調べるツールを提供してるらしい。で、それを参照できるようなApache用のmoduleがあると。
まずはmoduleインスコ。公開されてるソースがapache-2.0用と書いてあるので、2.2用に書き換えなと想ったけど、ソース覗いたらその必要はなさそうだったのでがっつんとportsからインスコ。httpd.confに書くのはmod_geoipのWeb参照して
LoadModule geoip_module modules/mod_geoip.so
<IfModule geoip_module>
GeoIPEnable On
GeoIPDBFile /path/to/GeoIP.dat
SetEnvIf GEOIP_COUNTRY_CODE US BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE KR BlockCountry
Deny from env=BlockCountry
</IfModule>
SetEnvIfとかは別にVirtualHost下とか塞ぎたいところでええんでない。
IPアドレス割り当てのDBは自前で持たなくちゃいけなくて、お金払うと市とかまで入った詳細や更新ツールが使えるようになったりするようだけど、そんな制度高くなくていいので(あくまでいらないところを通さなくするだけなので)、月1更新の公開DBをもってくることに。GeoLite Countryにある国別DBをwgetするようcronに仕込むだけ。
想ったよりあっさり動いたので、さっそくUS/CN/KRはdenyしますたw って想ったけど、USを閉じると色々他のサービスで弊害が出るので仕方なくallow。で、一番ひどいコメント(ついでにトラックバック)へのアクセスをJP以外開けないように変更。
見えなくて困る人(そもそもそういう人はこのエントリーが見えてないと想うけど)は言ってくれれば、気分によっては何とかするかもしれないししないかもしれない。
portsにも早々に入ったけど、とりあえず手元で試してみようかということで突っ込んでみる。以下ぶちあたった問題点。
1. mod_encoding
まぁこれは予想通りだったんだけど。API変更の影響。regex.hがといわれてコンパイル通らなかったり、GETでとる文字列にかかる問題の修正パッチを当てていたところでも関数が古くて引っかかった。
最終的には、mod_encoding.c.apache2.20040616にパッチ(FreeBSD 6.0-STABLE環境。ヘッダファイルの場所とか適当に直して)を作ってコンパイルしてようやく動作。
2. AcceptFilter
[warn] (2)No such file or directory: Failed to enable the 'httpready' Accept Filter.
とかうっちぇーwarningが出る。どうも、2.1で追加された機能を動かしているらしく、わざわざそれ用のkernel moduleまで立ち上げろと言う(’A`)
accf_data(SSL用),accf_httpのkernel moduleあげたら起動時は言われなくなったけど、gracefulやったら相変わらずうっさいので、この際noneに…
3. Directory設定
付属のオリジナルサンプルのconfigでは
<Directory />
Order deny,allow
Deny from all
</Directory>
となっていてこのまま流用していて、上記だと勿論デフォルトdenyになっちゃうので、明示してあげない限り設定した全ディレクトリが見えなくなる罠。
マニュアルでもデフォルトdenyを推奨していてconfigも準拠したんだろうということで、使うディレクトリで明示的にallow指定してあげることに。
言われて気づいたわけですが、UserDirが全部のVirtualHostにまでかかってる!害はあんまないけど気持ち悪い…
テンプレのhttpd.confに適当に設定追加すると、大概その前に書いてあるUserDirの設定がそのまま使われることが多い感じ。とりあえず、使わないVirtualHostに
UserDir disabled
書いて解決。
keitaircのエントリではかなりはしょって書いてるけど、設定段階でかなり問題になったのがありまして。
mod_proxyを通したら何故かURIエンコードされたチャンネル名の先のURIを叩いても何も出てこないのですよ。例えばrecentみたいなエンコードされてないところは普通に見える。ProxyPass通さないで直接叩くと見える。なんでだ…
まずはURIエンコードする部分を疑ってエンコードされてる文字列をみるも、間違った様子はない。Jcode.pmがへくってるのかとおもい、入出力のコードを明示指定してあげても変わらず。さらにはどっかにあった、Base64エンコードしてしまう方法も試すが一緒。 ど う し た ら い い ん だ
いろいろ探した挙句、原因は…mod_encodingでした、はずしたら動いたよ(’A`)。ちょっと前にパッチ当てしたのになんで効いてないんだとよくよくパッチ見ると、?以降のquery_stringに対してのみ処理してあって、?含まないkeitaircのURIには意味ねぇ。んじゃどうしようかってことで。
1. DAVステ(却下)
2. mod_encodingステ(却下)
3. DAV使うディレクトリだけ、EncodingEngine設定汁
LocationやDirectory内でEncodingEngineの設定が出来ないから上記のパッチが出来てるのに回避策はあるのか?と想いきや、VirtualHost内だったら設定有効だったり。ということでDAVで使うSSL部分のみでEncodingEngineをonしますた。こんなんでいいのか..
mod_encodingのことでぷらすと話していて私自身も調べていたら、こんなの発見。うちじゃ特に他のCGIなんかで不具合感じたことはないけどなぁ。と想いつつ、念のためパッチ当てて入れなおし。終了。
つい10日ほど前にお目にかかった2.0.51が無かったことにされてる…(´・ω・`)
portsからの以外全部2.0.52へ入れ替え。
Webサーバー「Apache 2.0.x」にセキュリティ・ホール,最新版2.0.51にアップデートを : IT Pro ニュース
ということでごっそりapache2祭り。特にたいした変更も無くコンパイルして突っ込むだけ。portsは2.0.50のまんまだけど、穴patchは適用っぽい。