2007-04-07 いや、Amazon の手軽さが悪いんだと思うよ
_ [Diary] 通販中毒
最近の若者は CD を買わんそうである。着うたとかなんとか、ケータイで手に入れる方が多いのだそうな。レンタルって廃れたの? まぁ、買いに行ったり借りに行ったりするのは面倒だよな。ケータイでぽちっとすれば手に入るんならそっちの方が遥かに簡単だし。サビしか知らんなら、サビしか興味がないんなら、サビだけで安く買える商売がうまくいくのもよくわかる。最近の音楽が面白くないからじゃないと思うな。便利な方に流れてるだけだ。
そんな昨今、CD を買っているのは中高年なんだと、どっかのニュースサイトにあったのを週中(しゅうなか)に読んだんだけど、今探したんだが見つかんない。でとっても不確かな話になってしまうが、確か、年数枚ペースで買うのは 40代以降。それより若い人らは殆ど買ってないらしい。ほうほう、ほうかの。んじゃ、ここにいる 40代はどうか。
iTunes 7.x が出たときに、うちにある音楽CDはすべて取り込んでしまった。その、去年の 9月の日記には、アルバム数が 619 と書いてある。で、今見ると、
16 ジャンル、234 アーティスト、678 アルバム、7565 曲
だそうな。半年で 60枚近くのアルバムを買うのは異常ですか、そうですか、本当にあ(以下略)
まぁ、CD(つうかレコード)を買う習慣が抜けてなくて、でも店まで行くのは面倒で、って手合いが通販に傾くのは不思議でもなんでもない。かつてはあちこちの店をひぃこらハシゴしないと集められなかったものが、ネット通販だと一網打尽だし、そら枚数も嵩むわな。中高年も便利な方に流れてるだけだ。
えっと、しかし、CD 買うのが中高年だなんてどうやって調べたんだろう。アンケートか? CDショップの POS? 見た目で年齢判断? ちょっと眉唾な統計だったか。ネット通販の数字とか入ってなさげだし。
_ [COMP] pf + spamd での spam ブロック
スラッシュドットのSMTPの応答を数秒送らせて…て記事のコメントから知った。この記事自体は、tarpitting のフリするってのは結局 greet pause と同じじゃんと、多くのコメンターと同じ意見なので、大して有用な情報じゃない。
そんなものより、参考コメントで出てた「どさにっき」にある「pf + spamd」と、この前後の話の方が遥かに興味深い。なにより、本家 OpenBSD での話ではなく、FreeBSD + pf での話ってのがうれしい。まだ本家にしかない機能だと悲しいからね。でもって、pf + spamd で greylisting するってのが、MTA 非依存でできるってことで、qmail に足を取られている身としては本当にありがたい。
いろいろ考えてみたけど、
- ブラックリストにある source address はリダイレクト
- ホワイトリストにない Windows もリダイレクト
- リダイレクト先で greylisting な spamd
このくらいで充分な感じだなぁ。明日は日曜出勤なので来週末(3連休なのだ)にでも遊んでみよう。
2007-04-14
_ [COMP] FreeBSD で pf + spamd 使って spam ブロック
先週の続き。
- ブラックリストにある source address はリダイレクト
- ホワイトリストにない Windows もリダイレクト
- リダイレクト先で greylisting な spamd
てなことを計画したわけだ。 で、見様見真似で
table <spamd> persist table <spamd-white> persist no rdr on { lo0, lo1 } from any to any rdr pass inet proto tcp from <spamd> to any port smtp -> 127.0.0.1 port 8025 rdr pass inet proto tcp from !<spamd-white> os {"Windows 2000", "Windows XP"} to any port smtp -> 127.0.0.1 port 8025 block in log inet proto tcp from any os {"Windows 95", "Windows 98", "Windows ME"} to any port smtp
というのから始めた。もちろん、localhost:8025 では spamd -g が動いている。os signature を使っているのは、どさにっきの影響。
始めてから8時間ほど。ガシガシ spamd にリダイレクトされてます。pflog0 を tcpdump で観察しているけど、こっちには掛からない。pf <spamd> は現在空なので、リダイレクトされてるのはすべからく Win2K, XP のハズなんだけど、本当にこんなものなのか?
block in log inet proto tcp from any os {"Windows 95", "Windows 98", "Windows ME"} to any port smtp
だけで実験してたときには数件掛かってたので、OS signature はあまりアテにならんのかも。
さて、FreeBSD で pf + spamd を使って greylisting するには、いくつか注意点がある。
spamd.conf.sample にはブラックリストが入ってる。
このブラックリストは greylisting するなら邪魔。spamd.conf.sample は、greylisting ではなく通常モードで使うためのものだ。あたりまえだけど。
spamd.conf.sample には、ブラックリストとして、Spamhaus Block List や特定アジアな CIDR があらかじめセットしてある。これを spamd.conf として spamd-setup を動かすと、このブラックリストが pf <spamd> テーブルとして登録される。ここまではいいんだけど、spamd.conf で「black」となっているアドレス群を spamd はブラックリストとして扱う。これがマズい。
spamd はオプション -g を使うと greylisting を行なうんだけど、この状態でもブラックリストにあるアドレスからの接続に対しては、greylisting ではなく通常モードで動くのだ。この通常モード、散々莫迦にしたレスポンスを非常にゆっくりとした間隔で返答するという tarpitting なモードだ。問題は、-g で起動しているのに接続元を spamdb に記録したりといったことは一切してくれないこと。
このことを理解するのに結構時間がかかってしまった。いやいや、man spamd の GREYLISTING の先頭にちゃんと書いてあるんよ? でも先入観ってのがね。pf <spamd> のことをブラックリストと頭の中で呼んでいて、ブラックリストってのは pf が spamd にリダイレクトするのに使うだけと思い込んでた。spamd のブラックリストは関係ないとね。spamd-setup の行う初期化についても理解不足だった。
てなこんなで spamd.conf.sample を丸ごとコピった spamd.conf で spamd を動かすと、spamd-setup も一緒に動いて pf <spamd> を初期化してくれる。でもこれ一度セットすると、明示的に消さない限り残っちゃうんだな*1。後から spamd.conf を all: オンリーにした状態で spamd-setup しても消えません。
$ sudo pfctl -t spamd -T replace -f /dev/null
で明示的に削除しとかないといけない。 ううむ。今考えるとこれおかしいな。明示的に消さないと消えないんじゃ、古い情報が消えないじゃん。もしかしたら勘違いかもしれないな…*2
pf <spamd-white> は spamdb の WHITE データで置き替えられる
なんのこっちゃ? いや、spamd はグレイリストの管理に /var/db/spamdb を使う。で、一定条件を満したものは種別を GREY から WHITE に変更し、そのタイミングで pf <spamd-white> にも記録する。いや、ちょっと違うな。spamdb に内にある WHILTE なアドレスで pf <spamd-white> 内の内容を置き換えるのだ。
いや、あたりまえじゃん。ホワイトリストも一定期間で消してかないとね。それなら spamdb の内容で置き替えるのが一番だ。
そうなんだけど、たとえば、自分とこのアドレスブロックとか予めホワイトリストに入れときたいじゃん。けど、そういうことをしてると spamd が pf <spamd-white> を更新するタイミングで消えてしまいます。いや、だから spamdb に入れておけば残る。こう:
$ sudo spamdb -a アドレス
CIDR フォーマットが使えないのがアレやね。でも、spamdb に入れておいても expiretime がセットされてしまうのでそのうち消えるはず。whitelist expire は 36日だ。さっき手動で入れたのは 5月20日とかになってるんで、来月末には消えちゃうんだろうなぁ。
2回弾かれないとホワイトリストに入れてもらえない
この仕組みを知ったどさにっきを始め、結構いろんなサイトを見て回ったんだけど、これを明示的に書いてるところは見当らなかった。
rdr pass inet proto tcp from !<spamd-white> to any port smtp -> 127.0.0.1 port 8025
としておけば、pf <spamd-white> にないところから接続があると、spamd にリダイレクトされる。spamd は接続元のアドレスを <spamd-white> に記録して 451 を返す。なので再接続してくれば、リダイレクトされずに MTA が答える。
んだと思ってた。そうではない。再接続を受け付けるのは passtime(default 25分)を過ぎてからだ。そういったコントロールは pf にはできない。2回目の接続が passtime を超えた後であることを /var/db/spamdb を使って spamd がチェックしないといけないわけだ。マニュアルを見返す。
A previously unseen tuple is added to the /var/db/spamd database, record- ing the time an initial connection attempt was seen. After passtime minutes if spamd sees a retried attempt to deliver mail for the same tuple, spamd will whitelist the connecting address by adding it as a whitelist entry to /var/db/spamd.
passtime 後に再接続があって始めて whitelist に追加されるとある。つまり
- spamd が接続元を spamdb と <spamd-white> に記録して 451 でエラーにする。
- <spamd-white>にあるところから再接続してきたら受け入れる。
ではないのだ。
- spamd が接続元を spamdb に記録して 451 でエラーにする。
- passtime を超えた頃に再接続してきたら <spamd-white> に入れて 451 でエラーにする。
- <spamd-white> にあれば受け入れる(ここの制御は spamd は関与せず)。
弾かれる回数は 1回じゃなく 2回。結構、厳しいんだけど、passtime のコントロールを考えると仕方ない。
FreeBSD で spamd を動かすには fdescfs が要るぞ
/etc/rc から spamd 起動しちゃうと気付かない。実は
pfctl: /dev/fd/7: No such file or direcotry.
てなエラーが数分おきに発生してる。
調べると、spamd は pfctl を動かして pf <spamd-white> を更新するのだ。grey.c に
static char *pargv[11]= { "pfctl", "-p", "/dev/pf", "-q", "-t", "spamd-white", "-T", "replace", "-f" "-", NULL };
なんてのがあって、
if (asprintf(&fdpath, "/dev/fd/%d", pfdev) == -1) return(-1); pargv[2] = fdpath;
てなことをしてる。pfdev は、/dev/pf をオープンしてる file descriptor やね。
$ ls -l /dev/fd total 0 crw-rw-rw- 1 root wheel 0, 18 Mar 4 23:14 0 crw-rw-rw- 1 root wheel 0, 20 Mar 4 23:14 1 crw-rw-rw- 1 root wheel 0, 22 Mar 4 23:14 2
ということで、FreeBSD 6.2 ではほぼ空なのだ。OpenBSD は、/dev/fd 下に 0 から 64 まで揃ってるからな。仕方ないので、
$ sudo mount_fdescfs fdescfs /dev/fd
して、descriptor デバイスが動的に作られるようにしてから spamd を再起動。エラーは収まった。つか、これができないと spamd-white は更新されん。/etc/fstab にも
fdescfs /dev/fd fdescfs rw 0 0
を入れておく。
追記
Windows 9x, ME からの接続は深夜に数回固めてあった。ちゃんと block されている。調べると、ボットネットは Windows XP SP1 と Windows 2000 が殆どらしい。ってことで、うちのフィルタリングは有効に効いてるってことだ。
2007-04-15 おいしいのか?
_ [MANGA] eso aparte 2Mアクセス達成。
めでたい。めでたいんでしょうけど、そこで目線を隠されてしまうアレぞうさんが不憫で仕方ありません。いや、そういうキャラなんでしょうけどね。これがノリコなら、こういう目には合わない気がするもの。つか、2M越えを睨んでアレぞうさんがトップ絵になってた気がしてならないんですが…
追記
憐れんだ意見が多数だったのか、ロールオーヴァーで文字よけが! 怒ってます怒ってます(笑)。眉はともかく、口元なんて若干開きが小さくなっただけなのに、むちゃ不機嫌に見えるし。なんてめんこいんだ。
_ [COMP] pf + spamd、OS 別アクセス
昨日の続き。 新しいおもちゃは予想以上に楽しかった。
/etc/periodic/security/520.pfdenied をマネして OS 別アクセスを見てみる。
$ sudo pfctl -v -sn 2> /dev/null Password: no rdr on lo0 all [ Evaluations: 64731 Packets: 0 Bytes: 0 States: 0 ] no rdr on lo1 all [ Evaluations: 42031 Packets: 0 Bytes: 0 States: 0 ] rdr pass inet proto tcp from <spamd> to any port = smtp -> 127.0.0.1 port 8025 [ Evaluations: 42031 Packets: 1417 Bytes: 82026 States: 0 ] rdr pass inet proto tcp from ! <spamd-white> os "Windows 2000" to any port = smtp -> 127.0.0.1 port 8025 [ Evaluations: 28972 Packets: 16624 Bytes: 1082850 States: 0 ] rdr pass inet proto tcp from ! <spamd-white> os "Windows XP" to any port = smtp -> 127.0.0.1 port 8025 [ Evaluations: 2090 Packets: 0 Bytes: 0 States: 0 ] $ sudo pfctl -v -sr 2> /dev/null block drop in log inet proto tcp from any os "Windows 95" to any port = smtp [ Evaluations: 112632 Packets: 0 Bytes: 0 States: 0 ] block drop in log inet proto tcp from any os "Windows 98" to any port = smtp [ Evaluations: 2107 Packets: 11 Bytes: 572 States: 0 ] block drop in log inet proto tcp from any os "Windows ME" to any port = smtp [ Evaluations: 2107 Packets: 0 Bytes: 0 States: 0 ]
リダイレクトされてるのは Windows 20000 ばかり。XP SP1 もそれなりあると思ってたんだけどな。ブロックされてるのも Windows 98 一種で、95, ME はない。今の spam 用ボットネットは Win 98 と 2000 ばかりで構成されてるんだろうか。まぁ半日程度で、あれこれいうには早すぎか。
from <spamd> to any port = smtp
でブロックされてるのがあるのは、勘違いに気付くまで pf <spamd> に spamd.conf のブラックリストが入ってたから。今は空なので、新規にリダイレクトされることはない。
しかし、このテーブルの使い方をもちっとなんとかしたいものだ。
spamd の運用では、pf <spamd> と pf <spamd-white> を維持する必要がある。前者は spamd-setup を定期的に実行して、最近のブラックリストをネットから持ってくる。後者は spamd 自身が /var/db/spamdb の WHITE データで定期的に置き替える。
実のところ、spamd.conf に記述されているデータは有益だと思ってる。特定アジアの CIDR のメンテを半自動でやってくれるのもうれしい。問題は spamd がそれをブラックリストとして扱うことだ。この 2つを分離したい。
pf <spamd> データは、本気でブラックリストを運用したいときに取っておきたいので、pf <spamd-grey> とかいった別の名前で OS種とは関係なく greylisting 対象とすることができればいい。で、spamd.conf のブラックリストデータを spamd に影響を与えることなく pf <spamd-grey> にロードすることができたなら、
table <spamd> persist +table <spamd-grey> persist table <spamd-white> persist no rdr on { lo0 } from any to any rdr pass inet proto tcp from <spamd> to any port smtp -> 127.0.0.1 port 8025 +rdr pass inet proto tcp from <spamd-grey> to any port smtp -> 127.0.0.1 port 8025 rdr pass inet proto tcp from !<spamd-white> os {"Windows 2000", "Windows XP"} to any port smtp -> 127.0.0.1 port 8025 block in log inet proto tcp from any os {"Windows 95", "Windows 98", "Windows ME"} to any port smtp
とするのがよさそうだ。ちょっと、spamd-setup を調べよう。(これは良くない。追記参照)
それはそれとして、GREYTRAPPING でも遊んでる。
$ perl -ne 'print "$1?n" if (/ -?> (?S+)/)' /var/log/spamd.log |? sort | uniq -c | sort -rn
して、ここで上位に並ぶ存在しないアドレスを、SPAMTRAP として登録した。
$ sudo spamdb -T -a "<sinigami@noroi.jp>"
とかね。
こうしておくと、この宛先に送ってきた送信元が TRAPPED として spamdb に登録され、ここからの接続はブラックリスト扱いとなる。そう、spamd の通常モードになる。ゆううっくりと、ふざけたレスポンスが返るようになるのだ。これは楽しい。
つうことで、ログを眺めて今日は終りそうだ… なんて有意義な日曜日。
追記
FreeBSD の ports の spamd は OpenBSD 3.7 付属のものらしい。本家 OpenBSD の spamd(8) はかなり先に行っている。Greylisting がデフォルトモードだし。ちょっとうらやましい。
で、spamd-setup の改造は時間がかかりそうなので、spamd-grey-setup として、データを pf <spamd-grey> に放り込むだけのものを適当に作った。spamd.conf も、本家 spamd ページにあるリストを取り込むことに。
で、pf 側はこうした。
table <spamd> persist table <spamd-grey> persist table <spamd-white> persist no rdr on { lo0 } from any to any no rdr inet proto tcp from <spamd-white> to any port smtp rdr pass inet proto tcp from <spamd> to any port smtp -> 127.0.0.1 port 8025 rdr pass inet proto tcp from <spamd-grey> to any port smtp -> 127.0.0.1 port 8025 rdr pass inet proto tcp from any os {"Windows 2000", "Windows XP"} to any port smtp -> 127.0.0.1 port 8025 block in log inet proto tcp from any os {"Windows 95", "Windows 98", "Windows ME"} to any port smtp
元のやつだと、pf <spamd-grey> に入っている送信元 だと、正しく再送してきて pf <spamd-white> に登録されても、リダイレクトされ続けちゃう。なので pf <spamd-white> の処理を先にすることにした。この方が見通しがいい。で、今、この状態にして様子見の最中。でも、whitelisting されてくるのって、まぁ無いね。
2007-04-26
_ [COMP] その後の pf + spamd
前回の続き。 まず、spam は 9割がた撃退できるようになりました。日ごとに、通過してくる数を数えるとこんな感じ。
523 2007-04-03 501 2007-04-04 517 2007-04-05 556 2007-04-06 490 2007-04-07 565 2007-04-08 490 2007-04-09 614 2007-04-10 540 2007-04-11 553 2007-04-12 580 2007-04-13 374 2007-04-14 74 2007-04-15 45 2007-04-16 63 2007-04-17 66 2007-04-18 29 2007-04-19 78 2007-04-20 40 2007-04-21 17 2007-04-22 53 2007-04-23 66 2007-04-24 65 2007-04-25 33 2007-04-26
14, 15, 16日は、設定をあれこれいじっていたので除外するとして、まぁ概ね十分の一かなと。
一方、pf の状況ですが、二週間でこんな感じに。
$ sudo pfctl -v -sn 2> /dev/null no rdr on lo0 all [ Evaluations: 778053 Packets: 0 Bytes: 0 States: 0 ] no rdr inet proto tcp from <spamd-white> to any port = smtp [ Evaluations: 455683 Packets: 0 Bytes: 0 States: 0 ] rdr pass inet proto tcp from <spamd> to any port = smtp -> 127.0.0.1 port 8025 [ Evaluations: 73465 Packets: 0 Bytes: 0 States: 0 ] rdr pass inet proto tcp from <spamd-grey> to any port = smtp -> 127.0.0.1 port 8025 [ Evaluations: 73465 Packets: 589463 Bytes: 31871075 States: 3 ] rdr pass inet proto tcp from any os "Windows 2000" to any port = smtp -> 127.0.0.1 port 8025 [ Evaluations: 59298 Packets: 730092 Bytes: 39707279 States: 3 ] rdr pass inet proto tcp from any os "Windows XP" to any port = smtp -> 127.0.0.1 port 8025 [ Evaluations: 19373 Packets: 225 Bytes: 10662 States: 0 ] $ sudo pfctl -v -sr 2> /dev/null block drop in log inet proto tcp from any os "Windows 95" to any port = smtp [ Evaluations: 1317533 Packets: 11 Bytes: 704 States: 0 ] block drop in log inet proto tcp from any os "Windows 98" to any port = smtp [ Evaluations: 20462 Packets: 466 Bytes: 23056 States: 0 ] block drop in log inet proto tcp from any os "Windows ME" to any port = smtp [ Evaluations: 20462 Packets: 0 Bytes: 0 States: 0 ]
少ないながらも、95, 98, XP からもメールは来てることがわかりました。さすがに ME はないようで。
spmadb のエントリはこんな状態。
$ spamdb | awk -F'|' '{print $1}' | sort | uniq -c 72 GREY 48 SPAMTRAP 1098 TRAPPED 31 WHITE
48個のエントリ追加で、1100近い TRAPPED が生成されており、常時以下のような感じに。
$ netstat -f inet -n | grep 8025 tcp4 0 0 127.0.0.1.8025 87.99.119.249.4962 TIME_WAIT tcp4 0 0 127.0.0.1.8025 87.99.119.249.4665 TIME_WAIT tcp4 0 0 127.0.0.1.8025 84.123.1.169.4496 TIME_WAIT tcp4 0 0 127.0.0.1.8025 82.56.70.133.3507 TIME_WAIT tcp4 0 0 127.0.0.1.8025 87.99.119.249.4436 TIME_WAIT tcp4 0 0 127.0.0.1.8025 80.57.83.206.2106 TIME_WAIT tcp4 0 0 127.0.0.1.8025 86.124.151.95.4299 TIME_WAIT tcp4 0 0 127.0.0.1.8025 71.29.40.125.61872 ESTABLISHED tcp4 0 0 127.0.0.1.8025 80.180.3.75.3968 TIME_WAIT tcp4 0 0 127.0.0.1.8025 85.71.106.157.39366 ESTABLISHED tcp4 0 81 127.0.0.1.8025 201.50.167.140.3032 ESTABLISHED tcp4 0 0 127.0.0.1.8025 71.29.40.125.60238 TIME_WAIT tcp4 0 0 127.0.0.1.8025 81.14.182.148.62070 FIN_WAIT_1
こういうのを見て喜んでるってのは、蟻地獄に蟻を陥れて喜んでるガキに通じるものがあるやね。趣味の悪いこって。
_ [COMP] pf で brute force attack に対抗
調子に乗って、sshd にパスワード攻撃してくるバカを pf でたたき落とし始めたので、そのメモを。
うちの sshd の設定では、PubkeyAuthentication 以外の認証はすべて切ってある。だから、brute force attack なんて痛くも痒くもない。せいぜい、daily のログがやかましいってくらい? いや、結構目障りなんだけどな、あれ。
クラッカーだけに知られてる OpenSSH の穴がないと断言などできないわけで、外に対してポートを開けてる以上、なにがしかの対策は必要だなとは思ってたのだ。が、ちょっと面倒だった。いやちょっとどころじゃねぇな。とっても面倒だったのだ。だったんだけど、ある日突然 pf が my boom に。勢いにまかせて、こんな感じで対応。
table <internal> const { 192.168.0.0/16, xxx.xx.xxx.xx/2x, xx.xxx.xx.xxx/2x } table <bruteforce> persist block in log quick from <bruteforce> pass quick proto tcp from !<internal> to any port ssh flags S/SA keep state \ (max-src-conn 15, max-src-conn-rate 1/5, \ overload <bruteforce> flush global)
特定の条件を満たしたものだけがフィルタを通過。それ以外は pf <bruteforce> にアドレスが登録され、以後そこからのパケットはすべて叩き落とされる。
いろいろ調べて回ると、max-src-conn-rate が 3/10 とかいう例にぶつかるわけですが、ログをつらつら眺めてると、brute force attack でも中には 3〜4秒おきにしかアクセスしてこないものが増えてきているってことで、ここでは 1/5 などとしてみた。こうすると5秒置きでないとアクセスできない。
待たなきゃいけないって場面での 5秒ってのは意外と面倒な長さであることを実感。クライアントである Mac から対象マシンにパパパッと複数の Terminal.app を開くととたんにブロックされてしまう。pf で落とすわけだから、既に接続してたものまで使えなくなる。KVM経由でコンソールからアクセスし、pf <bruteforce> テーブルからアドレスを消してあげないといけない。これまた面倒な話だ。
つうことで、<internal> てな名前で white-list も用意して準備万端。ところがその後大してアクセスがないんだな。
$ sudo pfctl -v -sr 2> /dev/null block drop in log quick from <bruteforce> to any [ Evaluations: 49481 Packets: 11 Bytes: 536 States: 0 ] pass quick proto tcp from ! <internal> to any port = ssh flags S/SA keep state \ (source-track rule, max-src-conn 15, max-src-conn-rate 1/5, overload <bruteforce> flush global, src.track 5) [ Evaluations: 49470 Packets: 287 Bytes: 40165 States: 0 ]
まだ 11パケットしか落とせてない。もっと掛かってくれぇと祈るのはやっぱり本末転倒か。