spamを排除:受信する前に拒絶

2004-7-20改訂しました

ここからはUNIXのsendmailでのお話です。qmailのユーザーさんWindowsのユーザーさんごめんなさい。

spamメールの宛て先が自分だったらたとえ中継を禁止していても受信してしまいます。これに対しては指定した From: のメールアドレス(spam発信者あるいはspamがかたっている偽のアドレス)をチェックして拒絶する方法があります。これは新しいsendmailをインストールしsendmail.cfにこのメカニズムを付加することで有効になります。(最近のsendmailではデフォルトで有効になっているようです)



sendmailのインストールとsendmail.cfの生成

ご注意:以下の説明はsendmailのバージョンが8.10.0以上に対応したものですので必ず最新のバージョンを入手したうえでお試しください。ただしsendmal 8.12.Xは微妙に違うのでご注意。またsendmail.cfを間違った設定にしてしまうとメールが全く配送されなかったり、全部の受けとりを拒絶してしまうなど極めて危険ですからかならず別のマシンで実験して自信がついてから実際のサーバーにインストールしてください。たとえこのページの説明が誤っていた結果おかしい動作をしても当社では責任を持ちません。

sendmail.cfというのはsendmailの動作の定義をするファイルです。sendmailは立ちあがるとまずこのファイルを読みに行き、どういうファイルに拒絶リストがあるかなどを保持しそのように動きます。その記述フォーマットは難解で直接作成することは不可能に近いのでいくつかのツールを使って生成することになります。

生成ツールとして有名なのはCFと呼ばれる日本で開発されたものとsendmailに付属のm4というマクロプロセッサの定義ファイル形式のものがあります。当社では後者のものを使っています。これはsendmailに添付されてくるものなので常に最新版のsendmailに対応しているというメリットがあるからです。

以下ではそのsendmailに付属のm4形式のマクロを使って生成する手順について説明します。

1) 最新のsendmailをインストール

sendmailのソースをダウンロードして説明にある通りコンパイル・インストールします。ここではその具体的方法を省きます。 順序としてはダウンロードしたあと、
tar zxvf sendmail.8.12.XX.tar.gz
cd sendmail.8.12.XX
make
make install
でできるはずです。OSによってはこれ以外にm4などいくつかのプログラムが古かったり存在しなかったりするのでこれもインストールします。
補足:バージョン8.12.0Beta16からはインストールする前にsmmspというユーザーをグループも同じ名前であらかじめ作成しておく必要があります。(2001-8-20)

2) sendmail.cfを生成

sendmail.8.12.XX(または8.13.XX)をコンパイルしたディレクトリの下のcf/cfに移動し、そこに genericから始まりOSのタイプがわかる名前で.mcで終わっているファイルを見つけます。バージョン8.12.XXでは以下のファイルがありました。
chez.cs.mc              generic-hpux9.mc        mailspool.cs.mc
clientproto.mc          generic-linux.mc        python.cs.mc
cs-hpux10.mc            generic-mpeix.mc        s2k-osf1.mc
cs-hpux9.mc             generic-nextstep3.3.mc  s2k-ultrix4.mc
cs-osf1.mc              generic-osf1.mc         submit.mc
cs-solaris2.mc          generic-solaris.mc      tcpproto.mc
cs-sunos4.1.mc          generic-sunos4.1.mc     ucbarpa.mc
cs-ultrix4.mc           generic-ultrix4.mc      ucbvax.mc
cyrusproto.mc           huginn.cs.mc            uucpproto.mc
drac.mc                 knecht.mc               vangogh.cs.mc
generic-bsd4.4.mc       mail.cs.mc              
generic-hpux10.mc       mail.eecs.mc
(最新のFreeBSDではOSをインストールしたときに/etc/mail以下に.mcファイルが出来るのでmakeとするだけでだいたいそのまま使えます。Linuxなどでもそうなっていると思います)

これをあなたの好きな名前としてコピーし以下の行を1行追加します。以下の例は Linuxでの例です。ここではファイル名はgeneric-linux.mcをコピーしたmylinux.mcとします。(FreeBSDやBSDIの場合generic-bsd4.4.mc、Digital-Unixの場合generic-osf1.mc を選んでください。それ以外は対応がつきますね。)

mylinux.mcの内容
divert(0)dnl
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
MAILER(local)dnl
MAILER(smtp)dnl
FEATURE(`access_db',`hash -o /etc/mail/access')dnl
(最後のFEATUREの行は「受信する前に拒絶」の機能を生かすための指定ですから必要ない場合はオリジナルのまま何も追加する必要はありません)

sendmail.cfを生成(移動)
そのディレクトリで次のコマンドを入れます。
m4 ../m4/cf.m4 mylinux.mc > sendmail.cf 
これで今のディレクトリにsendmail.cfが生成されましたのでそのコピーを新しくインストールしたsendmailの定義ファイルの格納先である /etc/mail/にコピーします。ファイルのオーナーとパーミッションの設定には注意してください(現在のsendmai.cfと同じものにすればいいでしょう)。

3) その他のファイルを作成

sendmailはバージョン8.10.0以降から全ての設定ファイルはデフォルトで場所が変更され、/etc/mail/というディレクトリに移動になっています。このディレクトリ内に以下のファイルを移動または作成します。

/etc/mail/aliases
従来の/etc/aliasesはここに移動しなければなりません。移動したらnewaliasesとコマンドを入力してdbファイルを新たにこのディレクトリ内に作成します。

/etc/mail/local-host-names
はメールのホスト名で従来は /etc/sendmail.cw という名前で作成されていたものです。
たとえばそのサーバーがXXXX@hart.co.jpというアドレスのメールを受け付けるのであればこの中身はhart.co.jpとだけ記述してください。XXXX@tokyo.hart.co.jpというアドレスのメールを受信するのであればこの中身はtokyo.hart.co.jpとします。

/etc/mail/relay-domains
にはメールの中継を許すドメイン名を記述します。このサーバーがXXXX@hart.co.jpとXXXX@mail.hart.co.jpとXXXX@osaka.hart.co.jpの3種類の形式のメールを処理する場合であっても共通のhart.co.jpだけを記述するだけでかまいません。これが空だったり、間違った名前になっていると自社内から送るメールですら拒絶されてしまいますのでご注意ください。


以上で終了。sendmailを再立ち上げするかマシンをリブートするかして新しいsendmailが使えるようにします。OSのブート時にsendmail.cfがあるかどうかをチェックしてそれが存在したらsendmailが立ちあがるような設定になっている場合、位置が変わりましたのでスクリプトを修正することをお忘れなく。

当社のsendmailインストールサービスを受けた方はすでににこのspam拒絶の設定がされていますので上の操作は不要です。以下の設定方法を見てご自分でどんどん登録してください。(ただしsendmailバージョン8.10.X以降)

排除方法

排除アドレスの設定

この方法を使うには上で説明した方法でsendmail.cfが生成されている必要があります。単に最新のsendmailとそれに付属のsendmail.cfを使うだけでは機能しませんのでご注意ください

●ファイルの編集
suになり/etc/mailに移動しaccessというファイルを編集します。

以下が書式で拒絶したいメールアドレスの頭にFrom:をつけてTABまたはスペースで区切りそのあとREJECTと記述してください。
1行に1つのアドレスを書き、何行あってもかまいません。

※ sendmailの最新版(8.12.11と8.13.0で確認)はアドレスやドメインが宛先(To:)にあっても拒絶されてしまうので差し出し人のメールアドレスだけを拒絶したいわけですから明示的にFrom:を先頭につけます。ホスト名やサーバーのアドレスレベルでも拒絶したい場合にはFrom:はつけません(でも副作用があるので注意、詳細は以下の解説)。(2004-7-20)

/etc/mail/accessの例
(実際のspamの発信者ですからこのデータを登録してもかまいません)
From:aimatcc@h.do-up.com     REJECT
From:hit@hollywood-j.com     REJECT
From:privatefun@usa.net      REJECT
From:bedroomtoys@usa.net     REJECT
From:officialpolltaker7@hotmail.com  REJECT
From:patrick0824@hongkong.com        REJECT
From:grantgoldworld@aol.com  REJECT
From:imustlotto.com  REJECT
From:Home-Income-Solutions@ohta-hp.or.jp       REJECT
(From:のあとにスペースをつけてはいけません)

一括変換
すでにたくさん登録している方は以下のviのコマンドで@がある行の先頭に一括でFrom:を挿入できます。
vi /etc/mail/access
:g/@/s/^/From:/
:wq
●特殊な記述 その1:アドレス全部を拒絶
69.63.161.83  REJECT
mta163060.savings1friend.com	REJECT
exrim.net	REJECT
のようにIPアドレスまたはホスト名を記述するとそのアドレスを持つサーバーからのメールはすべて拒絶されます。
3つ目のexrim.netはホスト名であって、サブドメインが設定されていない例ですがこのようにするとFrom:にあってもつないでくるサーバー名にあっても拒絶します。副作用としてXXX@exrim.net宛てにはメールは送れなくなりますのでご注意。

savings1friend.comは実際にはmta163043.savings1friend.comとかmta163044.savings1friend.comとかいった複数のホストから送ってくるので
savings1friend.com	REJECT
とします。こうすればサブドメインを持つすべてのホストからの接続を拒絶します。もちろんFrom:(実際にはReturn-Path:)にこのドメインがあっても拒絶します。

●特殊な記述 その2:ドメイン全部を拒絶
From:imustlotto.com        REJECT
From:adult-newsletter.com  REJECT
@を含まないドメイン名だけを記述するとそのドメイン名のメールは全て拒絶します。毎回From: のアドレスが異なるときや同じドメイン名だが異なるサブドメインがついているメールを送ってくる場合に有効です。adult-newsletter.comはFrom: members@list.adult-newsletter.comというspamが来ます。

たとえば上のように設定るすと、
sales@po2.imustlotto.com
info@mail.imustlotto.com
help@imustlotto.com
は全部が拒絶されます。(全部終わりのところが imustlotto.com となってるからです)

aol.comとかhotmail.comはよくアドレス詐称されていてspamが多いのですが日本にもサービスを展開していてユーザーも多数存在しますからごっそり拒絶するというわけにはいかないですね。ちなみに当社は1つのサーバーを除いてこれらのドメインをごっそり拒絶することは行ってはいません。

それでもhotmail.comとかearthlink.netなどからは絶対来ないので拒絶したいという場合には
From:hotmail.com	REJECT
From:earthlink.net	REJECT
としてください。
hotmail.com	REJECT
earthlink.net	REJECT
だけだと自分が送るメールの宛先にあっても拒絶されてしまいます。
よく考えると受信は拒否して送信だけできるというのもやや問題はあるかと思いますが、hotmail.comのアドレスを持っている知人に「うちはhotmail.comからのメールは拒絶しているよ」という通知を送るということは考えられますね。

●特殊な記述 その3:スケベな名前を拒絶

pussy@hotmail.com とか pussy@livedoor.com とか差し出し人の名前がよくあるスケベな名前を使ったアカウントの場合には @ までを記述するとドメイン名(プロバイダ名)が何であってもそのアカウントがFrom: にあると拒絶します。普通であれば絶対取得しないようなきたない言葉とかスケベなメールアカウントがあったらそれを設定するとよろしいでしょう。 sex@ とか viagra@ とか fuck@ とか口に出すのも恥ずかしいこの日本語名のローマ字読みなどを設定するといいのではないでしょうか。でも From: が pussy123@hotmail.com で送られたらこのメカニズムは働きません。
From:pussy@  REJECT
From:sex@  REJECT
From:fuck@  REJECT
From:viagra@  REJECT
注意して設定しないと必要なメールまで拒絶しまうので慎重に設定してください。


以上の設定をしたら次の作業に移ります。ただ設定しただけでは有効にはなりません。

データベースファイルに変換


/etc/mail/accessの編集が完了したら/etc/mailのディレクトリに移動して、
makemap hash access < access
とコマンドを入れてdbファイルを作ったらすぐに有効になります。当社のインストールサービスを受けた方はこの作業がMakefileに記述されていますので単にgmakeとします。
sendmailを再立ち上げする必要はありません。
●検証
これでこのアドレスがFrom: にある メールは

Sep 1 14:34:37 sv2 sendmail[54327]: e815Ybe54327: ruleset=check_mail, arg1=<Hom e-Income-Solutions@ohta-hp.or.jp>, relay=[210.125.239.121], reject=550 5.7.1 <Ho me-Income-Solutions@ohta-hp.or.jp>... Access denied

のように拒絶されています(/var/log/maillog)。

必要なメールが受信できなくなっては大変ですのでかならずテストしてください。試しに自分のアドレスを登録して送ってみてそれが拒絶され、その行を削除してみるとちゃんと受信してもらえればOKでしょう。

●拒絶するのをやめるには
spam撃退の機能をキャンセルするには空の/etc/mail/accessに戻したうえで同じことをしてください。

操作の流れ

(#はプロンプトです)
$ su
Password:
# cd /etc/mail
# vi access
# makemap hash access < access   (またはgmake)
# exit
$ 

これで撃退準備完了

これであなたのサーバーに来る憎らしいspamのうちFrom: のアドレスがわかっているものは確実に排除することができるようになりました。

どれが送るのを拒絶されてどれがOKなのかを悩まずに済ませる方法は受信サーバーと送信サーバーを分けるのがいいと思います。NAT経由で外部に出ていけるように設定した(一切の拒絶をしないで、ローカルアドレスエリアにある)送信専用サーバーを用意してそこから送るのがグローバルアドレスを消費することもないし安全面からもいいでしょう。(2004-7-21)

雑談:From: は本当のものなのかな?

上のspamリストはあくまでもFrom: にそういうアドレスがあるだけで、ほとんどの場合そのサイトから発信されてはいません。たとえばFrom: Home-Income-Solutions@ohta-hp.or.jpのメールは単に名前をかたられただけで実際にohta-hp.or.jpから発信されたものではありませんでした。お気の毒なことに ohta-hp.or.jpにはたくさんのエラーメールと抗議メールが殺到しているはずです。一種のメール爆弾ですね。

たとえばあなたのメールソフト(OutlookExpressとかEudoraとか)の自分のアカウント情報のうち電子メールアドレスを試しにaheaheaheahe@aol.comなどとしてメールを自分に送ってみてください。届いたメールのFrom: を見ると確かに差出人がこのアドレスになっていることがわかります。そう、あなたでも簡単に別のメールアドレスでメールを発信することができてしまうのです。(テストが終わったら必ず戻しておいてください)

このようにして多量の宣伝メールを送れば、宛先が存在しない人へのメールや、それに抗議する(単にリプライボタンを押して抗議のメールを送るでしょうから)メールもあなたに行くのではなく、この偽メールアドレスaheaheaheahe@aol.comに行ってしまうわけです。100万通送ってそのうち5%のメールが(プロバイダ退会などで)すでにアドレスが存在しない(※1)とすると、エラーがあったという通知のメールはaheaheaheahe@aol.comに送られます。すなわち5万通のメールが無実の罪の人あてに押し寄せることになります。その宛先が実在しないと代わりに今度は送ったプロバイダにエラーの通知が送られますからプロバイダのサーバーがパンクしてしまいます。(そのメールのヘッダを調べるとどういう経路で送ったかがばれてしまいますので遊びでもやらないでください)

(※1) 最近の情報によるとメールアドレス販売業者から購入したメールアドレスは50%近くがもう使えないアドレスだそうです。

hotmail.comやlivedoor.comなどの無料のメールサービス/無料プロバイダはどうしてもspamを発信する人が多いようです。 理由は無料であるため会員になって一回だけspamを発信してバレても単に除名されるだけで終わりで何の出費も伴わないからです。また別の名前で入会あるいは別の無料サービスに入会すればまた送れるわけでいたちごっこになっちゃっています。無料だけあってメールアドレスが沢山発行されているため相手がなかなか特定できないというメリット(?)もあるようで差し出し人としてhotmail.comの名前をかたっているだけで実際は別のところから発信されたメールも多く見られます。

これらの無料サービスから送られたメールは読まないで捨てているという人もいるようです。見ず知らずの人から来たメールにはウイルスがあるかもしれないし、まして無料メールアドレスから送る人は信用できないというのがその理由です。

電子メールは恋が芽生えたり大事な取り引きの連絡をしたり、あるいは就職の申し込みをしたりといった大事なものですからお金を払ったプロバイダのアドレスを使うほうがいいかもしれませんね。無料のアドレスは予備のアドレスとかPostPetとかいった趣味の世界だけにしておきましょう。

通常spamの発信者はそのメールに返事してもらうことは期待しておらず、本文にある申込書をFAXしてもらったり本文中のURLをクリックしてもらうのが目的なのです。したがって送り主のアドレスは実際には存在しないものか、存在しても別人だったりすることが多いようです。

無差別に送ったspamはほとんどの人は無視したり、怒ったりするだけですがごくわずかの人はそれを信用してお金を本当に支払ってしまうようです。だからこのようなビスネスがすたれないで延々と続いているわけでしょう。たとえば100万人にメールを送ったとしてそのうちわずか0.01%の人がだまされて購入したとしても100人となります。単価2万円としてそれでも200万円入ってくるわけでいい商売といえばいい商売かな ;-)

当社では毎日たくさんのspamメールを受信していますが朝来てこのリストに追加するのが日課になっています。このアドレスの合計はもう20万件を越えました。

雑談2:変なアドレス

最近 #fun-club@docomo.ne.jpと、メールアドレスの先頭が # から始まるspamがきました。実は/etc/mail/accessは先頭にこの#があるとコメントと見なしてその行を無視して変換しますので普通では拒絶できません。このspamの発送人は(偶然かもしれませんが)この仕組みを知っているのかと敵ながら感心しました。このようなメールは拒絶できないとあきらめてはいけません。ソースを直しちゃえばいいわけですね。
sendmailのソースを解凍するとmakemapというディレクトリができますがその中のmakemap.cを以下のようにしてまたsendmailを作りなおし(実際にはmakemapだけ)インストールすればこのようなメールも拒絶できます。
変更前
   if (ibuf[0] == '\0' || ibuf[0] == '#')

変更後
   if (ibuf[0] == '\0')
makemapはいろいろなところでに使われているので他に影響が出るので注意。コンパイルしてできたmakemapはmail-makemapなど別名でしまっておき/etc/mail/accessのコンバート専用にしてもいいでしょう。
cp makemap /usr/local/sbin/makemap-access
とした上で
makemap-access hash access < access
としてコンバートします。

spam情報トップへ・次章:無断中継を許すサーバーのデータベース