« 前のページ | Home | 次のページ »    [mail ]

2006.10.17

spamメール対策(その2)

前のエントリーでスパム対策として、accessに加えてGreeting pauseの設定について書きました。
しかし、次々に すり抜けて来ます。
こうなったら、Spam Assasinでも入れるかと考えたのですが、ただ入れただけではスパムが判定できても、スパムメールを受けた旨の通知は届くので、これならThunderbirdのスパム判定とあまり変わりなく、キッチリと機能させるためには、Procmailと組み合わせて自動的に捨てる仕組を作る必要があります。
チョット厄介だなぁーと思って二の足を踏んでいたのですが、世の中にはRBL(Real Time Black List)というものがあり、適宜Black Listを更新してくれています。
しかし、海外のRBLはNiftyがRBLに登録されたり(NiftyをかたってSpamを出すのもあるので)で、あまりよろしくないなぁーと思っていたら、日本発の”all.rbl.jp”というのがあり、手堅く運営している(それだけすり抜けよいが)ようなので,これを使ってみることにしました。
設定は、いたって簡単で、以前にメール設定ファイルのfreebsd2.mcに入れたGreeting Pauseの設定の前にでも、1行追加するだけです。

FEATURE(dnsbl,`all.rbl.jp')dnl
FEATURE(`greet_pause',`5000')dnl

入れたら、前回と同じで、次のようにmakeして出来たfreebsd2.cfをsendmail.cfとしてコピーします。

# make freebsd2.cf
# cp freebsd2.cf sendmail.cf

あとはsendmailを再起動しておしまいです。
maillogを見ると次のように、引っ掛かっています。 Spamの5〜7割りぐらいは防げてます。

Oct 16 21:46:14 uls sm-mta[6129]: ruleset=check_relay,
arg1=[222.170.195.25], arg2=127.0.0.4, relay=[222.170.195.25],
reject=550 5.7.1 Rejected: 222.170.195.25 listed at all.rbl.jp
Oct 16 21:46:36 uls sm-mta[6130]: ruleset=check_relay,
arg1=[222.170.195.25], arg2=127.0.0.4, relay=[222.170.195.25],
reject=550 5.7.1 Rejected: 222.170.195.25 listed at all.rbl.jp

2006.07.29

Spamメール対策

メールを良く使う人は誰でも「迷惑メール」に悩まされていることでしょう。
プロバイダーのメールアカウントを使っている方は、最近ではプロバイダーが「迷惑メール」対策サービスを提供しているので、それらを利用されている方も多いと思いますが、自前でメールサーバを立てていると、自分で防ぐ以外に方法はありません。 以下に小生のサーバで行っている対策について記述します。

1. accessファイルで制限

FreeBSDでは/etc/mailにaccessというファイルがあるので、この中に制限したいメールアドレスを書きます。

From:hotmail.co.jp                    REJECT ・・・・・・・?
tw               REJECT・・・・・・・・?
From:abcdxyz@        REJECT・・・・・・・・?
From:xyz@aaa.bbb.com        REJECT・・・・・・・?

などですが、上の例の?ではhotmai.co.jpから来るメールを全て拒絶しますし、?ではtw(台湾)からくるメールは全て拒絶します。
?はドメイン名によらず、abcdxydのアカウント名もつメールを拒絶するもので、fuck@とかpussy@などのエッチなアカウント名を拒絶するのに便利です。
?はずばり決め打ちでの拒絶例です。
しかし、知り合いでhotmailを使っている、台湾に友人がいるなどのときは困りますので、知人、友人だけは通すように設定します。 下記は例外を付けた例ですが、chijinn, yuujinをそれぞれの方のアカウント名とします。

chijin@                     RELAY
yuujin@              RELAY
From:hotmail.co.jp              REJECT
tw                  REJECT
From:abcdxyz@              REJECT
From:xyz@aaa.bbb.com            REJECT

これで、まずchijinn@, yuujin@が評価され、それ以降の設定によらず受け取れます。
また、REJECTの変わりに 550 User unknownと書けば相手には受け取れない理由として
User unknownとして通知されます。
もちろん、特定アドレス向けを拒絶することもでき、

To:stuv@xxxx.cccc.co.jp         REJECT

と書くことも出来ます。
accessのファイルが出来たら、sendmailが参照できるようにするため、access.dbを作成し、sendmailを再起動すれば設定が反映されます。

# makemap hash /etc/mail/access < /etc/mail/access
# kill -HUP <PID>

<PID>はsendmailのPIDで cat /var/run/sendmail.pidで番号を調べておきます。

2. Greet Pauseの設定

spamメールの送信者は次々と新しいアドレスで送りつけてくるのでaccessによる制限だけでは、なかなか防げません。
そこで、有効なのがGreet Pauseを入れるという方法です。
Grret Pauseを理解するために、メールの送受信のやり方を知る必要がありますが、例えばabc@xxx.yyyy.comにメールを送信するときは、送信側のサーバが相手側にメールを送信しても良いか問い合わせ、相手側から受け取れる旨の返事を待って実際のメールを送信します。
この相手からの返事をグリーティングメッセージと呼んでいます。
ところが、グリーティングメッセージは相手のメールサーバが忙しいと返事が遅れますので「迷惑メール」の送信者は数を稼ぐために、グリーティングメッセージを待つことなく勝手にメールを送り出します。
そこで、メール送信の問い合わせがあったとき、グリーティングメッセージをわざと少し遅らせ、返事を返していないのに勝手に送りつけてくるメールは「迷惑メール」と判断して捨ててしまうようにします。
通常のメールサーバなら1〜2分程度でも問題なく待ってくれるのですが、小生のところではとりあえず5秒遅らせることにしました。
それでは、設定ですが、簡単です。 sendmailにはGreet Pause機能が用意されています。
/etc/mailにsendmail.mcの名前のファイルがあるので、次の1行を追加します。

FEATURE(`greet_pause',`5000')dnl

mSec単位なので、5000で5秒遅らせることになります。
あとは、以下のようにfreebsd2.mcからfreebsd2.cfを作ってfreebsd2.cfをsendmail.cfにコピーしsendmaiを再起動でお終いです。 /etc/mailディレクトリー内で作業します。

# make freebsd2.cf
# cp freebsd2.cf sendmail.cf

効果はテキメンでした。 ほとんと拒否できています。
なお、デフォルト値は5秒ですが、acccessに以下のように書いておくと、特定のアドレスを0にしたり、もっと大きくしたり出来ます。

GreetPause:nakama.yoiserver.co.jp 0
GreetPause:abc.xyz.co.jp                 200

はっきりと問題ないと分かっているサーバは0にしておくのもエチケットでしょうか(相手の処理を遅らせるので)。

2006.01.19

ウイルスチェックソフト(clamAV)のインストール

WindowsのクライアントPCにはNorton Anti Virusを入れているが、ウイルスはサーバで阻止した方が好ましい。
特にMLを運用していると、誰かがウイルスに感染すると急速に広がる危険性を帯びており、以前から何とかしたいと考えていた。
しかし、個人のクライアント用は数千円で買えるのにサーバ用は数十万円もするので二の足を踏んでいた。 個人使用は無料のものもあるが、試してみたがどうもしっくりこないので、本格的な導入は見合わせていた。
ところが、最近Clam Antivirus (略称ClamAV)というソフトが見つかり、フリーとは言うもののApple, IBM, SunMicroなどでも採用していて営利目的でも使えるとして評判が良いので入れることとした。
インストール方法の下記に手順を書いておく。
FreeBSDにはportsにclamavがあるので、/usr/ports/security/clamavでインストールする。

# cd /usr/ports/security/clamav
# make WITH_MILTER=yes clean

clean動作が終わったら、次にインストールです。

# make WITH_MILTER=yes install

インストールが終わると、/usr/local/etcにclamd.confというファイルが出来ていて、/usr/local/etc/rc.d
に clamav-clamd.sh, clamav-freshclam.sh, clamav-milter.shの3つのファイルが出来る。
ここで、/etc/mailに移動しsendmail.cfのバックアップを取って、freebsd2.mcに次の赤字部を追加してsendmai.cfを作り直す。

dnl Enable for both IPv4 and IPv6 (optional)
DAEMON_OPTIONS(`Name=IPv4, Family=inet')
DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O')
INPUT_MAIL_FILTER(`clmilter', `S=local:/var/run/clamav/clmilter.sock, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter')dnl
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')

そして、インストール

# make all install restart

次に/etc/rc.confに次の3行を追加。

clamav_clamd_enable="YES"
clamav_milter_enable="YES"
clamav_freshclam_enable="YES"

ここで、サーバをリブートすれば有効になって立ち上がるはず。
ところが、3つの起動ファイルで # xxxxx.sh startとすると、clamav-clamd.sh以外はalready runnningと出るのにclamav-clamd.shのときは/var/log/clamav/clamd.logがPermissionが許容されていないとして立ち上がらない。

# chown clamav /var/log/clamav/*

として再度起動したら、うまく起動できたようだ。
あとは、動いていることの確認だがWindowsのメーラから自分宛にメールを出して、届いたメールのヘッダをみると、以下の2行が追加されいている。 これでOKだ。
X-Virus-Scanned: ClamAV version 0.87, clamav-milter version 0.87 on uls.fam.cx
X-Virus-Status: Clean

2005.01.23

MajordomoのSequencerの改造(2)

またまたまた、Majordomoの改造の話です。
sequencerを改造してOutlook Expressでもメールシーケンスの重なりを起こらないようにしたが、Eudoraでは重なりが起こる事が分かった。

EudoraのSubjectはSubject:のWordの直後に改行が入るので、最初の方法ではシーケンス番号を取り除けない。

Subject:
=?ISO-2022-JP?・・・

のようになっているので、Subject:行の次の行もmimedecodeしてmimeencodeしシーケンスを取り除く必要がある。
Subject:行の次の行も処理すべき対象か、それ以外の行かは、mimeencodeされた行には=?が現れる事で判別しているが、Subjectの継続行以外でmimeencodeされている可能性はFrom, To, Reply行であるので、これらは除く。 
また、メールの本文中にシーケンスの重なり除去のアルゴリズムに引っかかるものが存在すると困るのでシーケンス番号の除去はメールのheader部だけに作用させるようにした。
これらの条件を考慮した結果が次である。

$in_header = 1;
while (<STDIN>) {
     if ($in_header){
if (/^s*$/) {$in_header =0 ;}
if (/^Subject:/ || (/=?/ && !/From|To|Reply/)) {
$_ = &mimedecode($_);
$_ = &mimeencode($_);
s/[rR][eE]:.*[([].*d+[)]]/Re:/;
s/[rR][eE]:s*[rR][eE]:/Re:/g;
           }
}
#############################################
if(/out-of-the-office/i){$taboo = 1;}
############################################
print IN $_;
}

どうも、スッキリした方法では無いですね。
誰か、良いアイデアがあればお教えください。

2005.01.15

Majordomoのsequencerの改造

またまた、Majordomoです。
メーリングリストでタイトルにシーケンスナンバーを付けるのが一般化しています。
このため、Majordomoではresendの変わりにsequencerを使うが改造が必要なのは既に書いた
ところが、これでもOutlook ExpressではMIME decodeのルールに違反しているため、シーケンスナンバーの重なり防止が出来ない。
そこで、mime-decodeして改めてmime-encodeして正しいMIMEに直してやる必要がある。
このためにはmimer.plとmimew.plを取ってきて、sequencerの67行目あたりに次のように使用を宣言する。

require "shlock.pl";
+require "mimer.pl";
+require "mimew.pl";

そして、158行あたりを以下のように改造する。

&open_temp(IN, "/tmp/sequencer.$$.in") ||
&abort("sequencer: Can't open /tmp/sequencer.$$.in: $!");
while (<STDIN>) {
+       # by nob & tamotsu
+       if (/^Subject:/) {

+               $_ = &mimedecode($_);
+               $_ = &mimeencode($_);
+               s/[rR][eE]:.*[([].*d+[)]]/Re:/;
+               s/[rR][eE]:s*[rR][eE]:/Re:/g;
+       }
print IN $_;
}

さて、これで終わりだと思ったら、sequencerを使うとtaboo headerやtaboo bodyの「禁句」の指定が有効にならない。
taboo headerは添付ファイルの禁止する場合など、便利に使え是非欲しい機能である。
しかし、幸いにもsequencerはsequencerそのものに指定できる場所がある。

275行目あたりに下の赤字部分を挿入して添付ファイル(multipart/mixed)を禁止する。

                      /^subject:s*Failed mailb/ ||
/^subject:s.*bchangeb.*baddressb/ ||
/^subject:s*requestb.*badditionb/i ||
                            /^Content-Type:s*multipart/mixed/i   )) { 
&bounce("Admin request");
}

次にtaboo bodyであるが、私の運営しているMLで最近、出張に際して自動不在メール設定をした人がいて、メールがループする事故が起こった。
元来、長期にメールが受け取れないときは一時的にMLから退会して戻ったら入り直すべきとは思うがMLの運営側でも対策を考えることにした。
そこで、前述のシーケンス重なり防止の後ろに以下を挿入した。
自動応答不在メールの本文のどこかに必ずout-of-the-officeの語句を入れてもらい、これを引っ掛けてBounce mailにして逃げようというものである。

               s/[rR][eE]:s*[rR][eE]:/Re:/g;
s/[rR][eE]:s*[rR][eE]:/Re:/g;
}
#############################################
          if(/out-of-the-office/i){$taboo = 1;}
############################################
print IN $_;
}

さらに、taboo headerで追加した前述の後ろに以下のようにBounce mailを発行させる行を追加する。

                      /^subject:s*requestb.*badditionb/i ||
/^Content-Type:s*multipart/i   )) {
&bounce("Admin request");
}
#############################
if($taboo == 1){&bounce("Auto reply mail");}
############################

管理者には誰かMLに投稿する度にBounce mailが届くが、これは良しとした。
やれやれ、これで目的は達したか???

« Previous | Next »