Archive for the 'Perl' Category
ウチに来るスパムメールは相変わらず減り続けている。で書いたスパム対策の途中経過を報告します。
■postfixの設定は以下のようになっています(細かい説明は後日)

■REJECTの各項目
1はreject_unlisted_recipientで拒否した数
2はreject_unverified_senderで拒否した数
3はreject_non_fqdn_senderで拒否した数
4はreject_unauth_destinationで拒否した数
5はcheck_policy_serviceで拒否した数
6はsleepで諦めた数
7はブラックリストでピンポイントで拒否した数
8はprocmail側(dnsbl、urldb、ベイジアンスパムフィルタ)でspam判定された数
■OKは配送されたすべてのメール数
■TRUE JUDGEはOKの中で配送されたスパムの数
■FALSE JUDGEは拒否した非スパムの数
■REJECT RATE(postfix)はpostfixのみの拒否率
■REJECT RATE(ALL)はpostfix、procmailをあわせた拒否率
■1番下のREJECT RATEは設定毎の拒否率
というわけで現在の拒否率はpostfixのみで99.44%、procmailをあわせると99.96%となっています。
reject_non_fqdn_senderとsleepの出番がまったくありません・・・
(唯一6月9日にsleepで6というのがありますが、これは一時的にcheck_policy_serviceの前にsleepを置いてみた結果で、現在はcheck_policy_serviceの後に戻しています。)
見てのとおりreject_unlisted_recipient(User Unknown)だけで40%を拒否しています。
これが最近多いBackscatterというヤツです。
まだ途中ですが概ね合格点といったところでしょうか。
1年前とは比べ物にならない程スパムが減っているのがなにより。
あれからいろいろ考えてみた結果問題が2つ見つかったのです。
問題その壱
sendmail経由で送信されたメールはポリシーサービスに渡せないので送信履歴(キャッシュ)が残せない
問題其の弐
ウチのサーバー外からウチのドメインを使って送信した場合も送信履歴(キャッシュ)が残せない
つまり上記のメールが宛先不明でバウンスしてウチのサーバーに戻ってきた場合、送信履歴(キャッシュ)が無いので受け取りを拒否してしまうということ。
ということで導入はヤメっ!
まぁ〜reject_unlisted_recipientを入れてるのでほとんどのBackscatterは550で拒否してるからいいんですけどね・・・
たまぁ〜に実在するアドレスに配送されてくることがあるのでいろいろ考えてみたのですが、導入するメリットよりもデメリットの方が大きいので・・・┐(´д`)┌
なんでしょうね?
ここ2、3ヶ月は平均200/日程度しか来ていません。
まぁ〜いいことなんですが、せっかく新サーバー機にして新しいスパム対策を施したというのに、なんか張り合いがなくなってしまってちょっとつまらない・・・┐(´д`)┌
つい最近知ったのですが、UNIXではCR(\r)は行頭に戻るという意味だったのね( ´ー`)
#!/usr/bin/perl
$| = 1;
for (my $C = 1,my $D = 30; $C < = $D; $D--) {
print "Please wait for " . sprintf("%02d",$D) . " seconds more";
sleep 1;
print "\r";
}exit;
↑をコンソール上で実行すると改行しないでカウントダウンしてくれます。
先週の土曜日あたりから親知らずがコンニチハしてきて若干痛いです(´;ω;`)
さて先日のsmtpguardですが、元々はqmail用だったみたいですね・・・
ubuntuのリポジトリにはpostfix-smtpguardっていうのがありますが。
で、肝心の会社のフィルタリングサーバーの件ですが、結局check_policy_serviceを通して自分で書いたスクリプトでフィルタリングすることにしました。
先日書いたように、本来はGateWay的なポジションにあるサービスなのでスパムをゴリゴリ弾くわけにもいかないので以下のような運用ポリシーにしました。
1.逆引き不可&逆引きしたホスト名が動的IPっぽいとこからきたものであった場合にcheck_policy_serviceでスクリプトに渡す。
2.スクリプトはエンベロープのFROMとTOのFQDNを組み合わせたキーにして値にリクエスト時間を記録する(同一キーの記録数はコンフィグで指定)。
3.スクリプトは2のキーからのリクエストが一定時間内(この時間もコンフィグで指定)にコンフィグで指定した回数を超えた場合は450で要求を拒否する。
4.スクリプトはリクエストがある毎にコンフィグで指定した時間を越えた2のキーは削除していく。
5.チェック対象のFROM、TOのFQDNはコンフィグで定義しておいてこれに該当しないものはスルーする。
といった感じ。
上記のスクリプトはperlで作成してデータの記録にはDB_File(BTREE)を使用。
正確には4→3→2の順番で2は3の条件を満たしていない場合のみ実行されます。
このスクリプトはすでに作成済みで後はpostfixに組み込んでテストするだけです。
ちなみにコンフィグは以下のようなフォーマットに
[FROM FQDN][TAB|SPACE][TO FQDN][TAB|SPACE][LIMIT TIME][TAB|SPACE][LIMIT COUNT]
example.com example.jp 5 10
上記の場合example.comからexample.jpへの送信は5分間に10通まで要求を受け付けるという設定。
前回はお客さんのメールサーバーからリレーされてくるだけだと思っていたのですが、このサービスのサーバー管理者から詳細を聞いてみたところお客さんのメールサーバー(お客さんのエンドユーザーが外部へ送信する場合)だけでなく外部(お客さんのエンドユーザー宛)からも送信されてくるみたいで、さらに外部からのスパムが今回の悩みのタネだったというオチ。
そこで、上記スクリプトで外部からのFROM(スパマーがよく使うフリーのメアド)とTO(お客さんとこ)のFQDNをキーにして短時間に大量にスパムが送られてきてもコンフィグで指定した一定時間の間に一定数に達した時点で450で弾いて配送数を制御してしまおうと思ったのです。
こうしておけば正常なメールが弾かれてしまっても再送されてきたときに許容数を超えていなければちゃんと要求を通すことができるというのが今回の目玉。
最初はコンフィグでのチューニングがとても大変かもしれませんが、それはこのサービスのサーバー管理者が担当するのでキニシナイ!
以前作成したサーバー監視スクリプトにバグが見つかったので修正しました。
Socketで接続後にレスポンスから取得した文字列が静的コンテンツと動的コンテンツの場合で違うことが判明したのです。
これは常識?( ゜Д゜ )
■静的コンテンツの場合
・HTTPヘッダー終了後にコンテンツのソース
■動的コンテンツ(CGIやPHP)の場合
・HTTPヘッダー終了後にコンテンツのサイズ?らしき数字(英数字の時もある)
・次行にコンテンツのソース
・最後に0
というようなレスポンスだったので、これに対応させるよう修正を加えました。
なぜ今更こんなものを!?
それはAccessCheckerを作り直そうと思っているからです。
現在のAccessCheckerのwhois検索機能というのはサーバーにwhoisコマンドがインストールされていないと使えないのです。
そこで作り直すにあたり、まずwhois検索機能をsocketやってみよう!ということです( ´ー`)
ソースはこちらから⇒whois.pl
使い方は至って簡単
解凍してwhois.plとwhois.txtを同じ場所に設置して
perl whois.pl example.jp
と実行するだけです。
IMAP対応ならRoundCubeとかSquirrelMailとかあるからいいんだけど、IMAPイラネは自分にとってはなんというかもぅ・・・┐(´д`)┌
今はXOOPSのWebmail2を使ってるんですが他にはPOP3対応となるといいのがぜんぜんないのよね〜・・・;-(
そこでPerl+Ajax+MySQLでゴリゴリ動いてPOP3対応でPOP before SMTP対応でSMTP AUTH(SASL)対応なWEBメーラーを自分で作ってしまおうかと妄想してる訳で御座います。
プロバイダから貸してもらえるWEBスペースはperlが使えてtelnet、sshでのログインも可能でcronまで使えるのです。
そこで以前から自宅サーバーを監視するのにhttp接続を行うperlスクリプトを書いて(wgetもインストールして)ずっと監視してきていたのですが、結構適当に作ったスクリプトだったのでちゃんと作り直そうと思ったのです。
今回はwgetや余計なライブラリ、モジュール等をできるだけ使わないように書き直しました。
