電子メールの不正な中継からの防御

工学研究科化学工学専攻 北村 祐一郎
kita@tranpo.che.tohoku.ac.jp
情報科学研究科システム情報科学専攻 中村 和浩
nam@yamamoto.ecei.tohoku.ac.jp
総合情報システム運用センター 曽根 秀昭
sone@tains.tohoku.ac.jp

1 電子メールの不正な中継

1.1 spamの概略

 TAINS に接続したワークステーションのメールサーバ機能が学外の何者かにより 悪用され,数千通規模の電子メール広告を 配布する中継のために利用される例が増えてきました。PC-UNIXの 類いも,例外ではありません。
 極めて大量に,無差別的に配布する電子メールは,spam(スパム), あるいは Unsolicited Bulk Email (UBE),Unsolicited Commercial Email (UCE)と呼ばれ,ほとんどが不要で迷惑な広告であることもあり, 多くの人から嫌われています。 TAINS を含めて,インターネットと通信できるワークステーションなどの 管理者には,spamのような不正な中継を防止するように設定してメールサーバを 運用することが期待されています。 本稿では,そのための設定について紹介します。

1.2 spamの背景など

 Spamは,発信元から直接に配布されることもありますが, 第三者のメールサーバを無断で中継地点として不正使用するケースが 少なくありません。例えば, 100万通の広告を配布するのに,1000ヶ所のメールサーバに1000ずつ 指示して再配布させれば,短時間で処理することができます。 再配布のために,学内のワークステーションなどが利用される ことがあります。

[Spam業者]→[匿名のアクセスポイント]→[本学のWS]⇒数千の送り先

 このときに,電話回線経由で他人になりすますなどして再配布の 指示を送ることがほとんどであり,広告の内容にも正しい住所を表示していなければ, 誰の行為なのかを特定することはきわめて困難です。 世の中にはspam業者を名乗る発送代行業者もあり,spam 発送用のソフトウエアも売られているそうです。
 インターネットの電子メールは,中継の繰り返しにより配送するのが基本ですので, メールサーバ,あるいはその機能を果たす電子メール配送プログラム (sendmail) は受け入れたメールを送付先へ向けて送る機能をもっています。 従って,spam業者があなたのワークステーションへ対して中継の形で再配布の 指示を送ってくれば,そこから,最終的な配布先へ自動的に配布してしまいます。 自身から発信,または自身へ着信するメールを扱うほかに,よそから よそへのメールも中継してしまうことが問題です。
 不正に使用されたメールサーバ (*1) は,一時的に処理負荷が増大する被害を受けるほか, 問題のメールの発信元であるという疑いをもたれる可能性があります。 受けとった人から,その組織の担当者へクレームの電子メールが送られることも少なく ありません。


(*1) 第三者間のメールを中継した記録が,あなたのコンピュータの sendmail の ログに残っているかもしれません。

1.3 対策の概略

 もし,お使いのワークステーションが計算処理などの目的で使うものである場合には, メールを中継する機能が不要ですから,sendmail プログラムを止めるのが簡単で確実な対策です。起動処理の設定ファイル (*2) の中の,sendmail を起動する行の先頭に # を付けて,無効にします。 また,現に走っている sendmail のプロセスを kill して止めます。その後にそのコンピュータでメールを 読み書きするためには,他のコンピュータをメールサーバとして, POP対応のメールツールにより利用します。
 同じような運用形態を取っていて一体的に運用されているコンピュータ群では, そのうちの1台だけに付録で述べるような 細かく厳格な対策を施して,他のコンピュータからメールを 発送するときには対策済みのものを経由させるように設定しておく方法も あります。
 以上の二つの方法をとることができなければ,sendmail で不正な 中継を拒否するよう設定しなければなりません。 近年,sendmailプログラムが,そのような拒否の機能をも つようになりました (*3)。Spam対策のためです。
 研究室などで運用するワークステーションのメールサーバを, 中継を制限する機能をもつものと入れ替え,中継の制限を施せば,不正な中継を 拒否するようになります。 以下,3 節ではsendmailの入れ替えについて,4 節では簡単な設定の方法を紹介します。
(*2) システムによって変わりますが,/etc/init.d/sendmail/etc/rc など。
(*3) sendmailは,頻繁に改良されていますが,8.8.x 以降のものは, 設定により,不正な中継を拒否することが可能です。 8.7以前のsendmailを使っていたならば,入れ替えが必須です。
原稿執筆の時点で公開されている最新版は,8.9.1 です。 その他の記述内容についても,執筆時点のものですので,変更になっている 可能性があります。

2 sendmail を停止する場合の処理

 sendmail がデーモンとして動作していない時に, sendmail を使用してメールの送信を行うと, 相手先ホストにメール届ける事が出来ない場合には,そのメールは送信元ホストの mail queue (*4) へ保存されたまま,再送信されません。これを回避するために, crontab 等より sendmail-q オプション付きで 定期的に実行 (*5) すれば,mail queue に保存されたままになっているメールを再送信する事が可能です。
 例えば毎時30分に再送信を行う場合,
# crontab -e root
と実行して,crontab (*6)
30 * * * * /usr/lib/sendmail -q >/dev/null 2>&1
と登録します (*7)
 計算機室の様な環境で,常時 sendmail を動作させる必要は無いが送信用に sendmail は利用したい, しかし台数が多くすべてのマシンで sendmail の入れ替えと設定を するのは面倒,という場合にお薦めです。
(*4) 例えば /var/spool/mqueue
(*5) 一般ユーザが実行しても大丈夫です。
(*6) cron デーモンが扱うテーブル。 crontab -e を実行すると,エディタによりこのテーブルが編集出来ます。
(*7) sendmail はフルパスで記述する必要があります。 システムにより sendmail の置かれている場所が異なるので 御注意ください。

3 sendmail-8.9.1 のインストール

 ここではsendmail-8.9.1 のインストール例として, ハードウェアが Sun4 で システムは日本語版 Solaris2.5.1 であり, データベース・ライブラリ (*8) には DB を使用し,NIS や NIS+ を利用する環境において,コンパイラに gcc を使用する ケースについて,DB のインストール方法と併せて説明します (*9)

(1) ソース・アーカイブを入手

 sendmail や DB のソース・アーカイブを入手します。 たとえば,以下の場所から入手できます。
ftp://ftp.topic.ad.jp/pub/net/sendmail/sendmail.8.9.1.tar.gz
ftp://ftp.topic.ad.jp/pub/net/db/db-2.4.14.tar.gz
以下の説明では,/usr/local/src へ置いたものとします。

(2) DB のインストール

 DB のソース・アーカイブを展開します。 db-2.4.14 というディレクトリが作られます。
% cd /usr/local/src
% gzip -dc db-2.4.14.tar.gz | tar xvf -
% cd db-2.4.14
次に,作業用のディレクトリへ移ります(*10)
% cd build.unix
引き続き ../dist/configure を実行しますが, その前に,コンパイラとして gcc を使用するために,環境変数 CCgcc を設定します (*11)
% setenv CC gcc; ../dist/configure  … (csh 系)
% CC=gcc ../dist/configure  … (sh 系)
あとは DB ライブラリを構築し,root 権限でインストールして完了です。 デフォルトでのインストール先は /usr/local 以下の各サブディレクトリです。
% make
% su
# make install
# exit

(3) sendmail のインストール

 最初に sendmail のソース・アーカイブを展開します。 sendmail-8.9.1 というディレクトリが作られます。
% cd /usr/local/src
% gzip -dc sendmail.8.9.1.tar.gz | tar xvf -
% cd sendmail-8.9.1
システム毎のデフォルト設定に加えて 独自の設定を行いたい場合には BuildTools/READMEBuildTools/Site/README を参考に, BuildTools/Site/ に設定ファイルを作成します。DB を使用するため, confMAPDEF の定義から -DNDBM を削除して独自の設定を 作ります (*12)。 今回は以下の内容で BuildTools/Site/site.config.m4 を作成しました。
define(`confLIBDIRS', `-L/usr/local/lib')
define(`confMAPDEF', `-DNIS -DNISPLUS -DMAP_REGEX')
 次に sendmail を構築します。
% cd src
% Build
 以上のコマンドを実行すると,src ディレクトリに obj で始まる名前のディレクトリが作られ,その中に sendmail が作成されます (*13)groff がインストールされていなければ, オンライン・マニュアルの組版時にエラーが発生しますが, 無視しても構いません。
 引き続きインストールを行う前に,予め既存の sendmail 関係の ファイル群を別の名前に変更して保存しておきます (*14)
% su
# mv /usr/lib/sendmail /usr/lib/sendmail,orig
# mv /etc/mail/sendmail.hf /etc/mail/sendmail_orig.hf
# mv /etc/mail/sendmail.st /etc/mail/sendmail_orig.st
# mv /usr/share/man/man8/sendmail.8 \
     /usr/share/man/man8/sendmail_orig.8
# mv /usr/share/man/man5/aliases.5 \
     /usr/share/man/man5/aliases_orig.5
# mv /usr/share/man/man1/mailq.1 /usr/share/man/man1/mailq_orig.1
# mv /usr/share/man/man1/newaliases.1 \
     /usr/share/man/man1/newaliases_orig.1
 続いてインストールします。
# cd obj.SunOS.5.5.1.sun4
# make install
 メールスプールなどのディレクトリのパーミションを変更します。 sendmail.cf など設定ファイルのあるディレクトリ,mail spool の ディレクトリと,/ からそこまでの途中のディレクトリについて, root 以外が書き換えできないように設定する必要があります (*15)
# chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
# chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
# exit
 これで,sendmailの入れ替えが完了です(*16)
(*8) データベース・ライブラリをまったく組込まず,かつ NIS も NIS+ も使用しない環境では,例えば /etc/aliases を変更してその内容を反映させる場合に,sendmail 自体を再起動する必要がありますが,データベース・ライブラリを組み込んであれば newaliases コマンドを実行することで反映されます。 最近の版では,データベース・ライブとして DBM や GDBM ではなく,DB の使用が強く推奨されており,かつ sendmail-8.9.0 からは DB の版も 2.x が 前提となっています。
以上の点を考慮し,今回は db-2.4.14 を DB ライブラリとして使用することにしました。
(*9) 他のシステムの場合でも,UNIXであれば,操作はほとんど共通です。 ただし,ネームサーバへの登録や設定が完了している必要があります。
(*10) このソース・ツリーを共用して他のシステムのものを作る場合には, それぞれに作業用のディレクトリ (たとえば,build.solaris2.5.1 など) を build.unix と同じレベルに確保して,移ります。
(*11) cc を使う場合には,環境変数 CC の設定は不要です。
(*12) システム毎のデフォルト設定は BuildTools/OS/os-name に記述があります。
(*13) \footnote{たとえば,obj.SunOS.5.5.1.sun4。}
(*14) システムの種類により,ファイルの所在が変わります。たとえば, /usr/lib/sendmail/usr/lib/sendmail.hf/etc/sendmail.st/usr/share/man/cat?/*.?
(*15) 具体的なディレクトリは,システムにより異なります。 この設定に不備があると,sendmailを起動したときに警告が表示されます。
(*16) 新しいsendmailを実際に動作させるには,デーモンのプロセスを終了させ, 新たにデーモンを起動させる必要があります。

4 お薦め版 sendmail.cf の利用

 sendmail の動作は sendmail.cf というファイルで設定しますが, このファイルは慣れない方々には複雑で扱い難いものです。そこで,TAINS 内で配布されているお薦め版 sendmail.cf の入手方法と改造方法について説明します。
 ローカルの事情に柔軟に対応して sendmail.cf を作成する場合には, CF というツールが良く使われています。これを用いた方法は,付録で説明します。

(1) お薦め版 sendmail.cf の入手

 以下の URL にて配布用の CGI スクリプトを運用しています。 「条件の入力」に従って各ホストの環境を入力します。 条件を指定するときにメールアドレスのドメインとして che.tohoku.ac.jp が表示されますが, 後で書き換えて使いますので,ご自分のドメインに読み替えて選択してください。 「東北大学学内のホスト用の中継制限を行なう。」を選択すれば, TAINS 内で最低限の中継制限を設定した sendmail.cf を入手することができます。
 選択した後,Submit をクリックしてください。
http://www.che.tohoku.ac.jp/cgi-bin/cfindex.cgi?relay=tains

下の部分に「結果」が現れて,該当するお薦め版 sendmail.cf と生成に使用した CF 用定義ファイルへのリンク, sendmail.cf の修正箇所が示されます。
 「お薦め版 sendmail.cf」をクリックすれば,入手できます。 sendmail.cf などの名前で保存します (*17)

(2) 基本的な修正

 お薦め版 sendmail.cf を入手したときの修正箇所の指示に従って, 修正を施します (*18)
 必ず修正が必要になるのは,「条件の入力」にて 「user@mail.che.tohoku.ac.jp 宛と user@host.domain.che.tohoku.ac.jp 宛」のメールを受け取る, を選択した場合です。この場合には
# address which should be accepted
#FZ/etc/sendmail.aa
CZ mail.che.tohoku.ac.jp
という部分の ``mail.che.tohoku.ac.jp'' という部分を御自身の メールドメインで書換えます。さらに,
# default from-address (can be $j, $m or another generic address)
DSmail.che.tohoku.ac.jp
という部分も同様に書換えてください。

(3) sendmail.cf のインストール

 入手した sendmail.cf を所定のディレクトリに移します (*19)
% su
# mv /etc/mail/sendmail.cf /etc/mail/sendmail_orig.cf
# mv sendmail.cf /etc/mail/sendmail.cf
# exit
 以上で,入れ替えが済みました。sendmail デーモンを 再起動してください。
(*17) 保存のときに,長い行を自動的に分割したり,ファイルの中の「タブ」 コードを空白に置き換えるようなブラウザでは,正しく保存できません。
(*18) 今回は「メールの中継制限」がテーマですので,中継制限が不可能な sendmail-8.7.x 以前を対象とした sendmail.cf の修正箇所については割愛させていただきます。
厳密な中継制限を実施するために詳細な設定をする場合には, 付録A をご覧ください。
(*19) 入手したときのファイルの名前は,選択条件によって異なりますが,ここの説明では sendmail.cf としています。 システムの種類により,移すべきディレクトリの所在が変わります。たとえば, /etc/sendmail.cf

5 sendmail の中継制限の動作確認

 sendmail のテストモードを利用してデバッグする方法もありますが, 表示されるメッセージがわかりにくくて苦労する可能性があります。ここでは, 学外からメールの中継を試みて,外部メールの中継を拒否するか どうかをテストするウェブページを紹介します (*20)。 WWWブラウザで,以下のURLを表示します。
http://www.topic.ad.jp/cgi-bin/rlytest.cgi
メールの中継制限を確認したいメールサーバの FQDN(Fully Qualified Domain Name; 例えば hostname.domainame.tohoku.ac.jp) を入力し,[実行]ボタンを クリックしてください。
 しばらくして,次のいずれかがテスト結果として表示されます。
   実行結果 : メールの中継は拒否されました。
   実行結果 : メールの中継は許可されました。

(*20) 原作は http://maps.vix.com/tsi/ar-test.html

参考文献

付録A より厳密な中継制限

 4 で述べた方法で 「東北大学学内のホスト用の中継制限を行なう。」を選択したよりも 厳密な中継制限が要求される場合には,以下の手順により修正してください。

(1) 無条件に中継するホストの指定

 sendmail.cf の中に以下の行があり,sendmail.cf を使用するホストを,SMTP サーバや中継ホストとして指定しているホストの範囲を 指定します。
# CONFIG: acceptable (no further checking) clients
C{LocalIP} 127.0.0.1
C{LocalIP} 130.34 10 172.16 172.17 172.18 172.19 172.20 .....
C{LocalDom} localhost
C{LocalDom} tohoku.ac.jp
IP アドレスを列挙したファイルを指定する場合には,この部分に
F{LocalIP} ファイル名
という行を追加します。また,ドメイン名を列挙したファイルを指定する場合には,
F{LocalDom} ファイル名
を追加してください。
 IP アドレスの範囲やドメイン名を sendmail.cf 中で指定する場合には, 表 1 を参考に,それぞれ3行目と5行目を修正します。 いずれかの条件を満たす場合には無条件に中継を許可するので御注意ください。
表 1: IP アドレスとドメイン名の指定方法}
指定内容                          │適用範囲
━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━
130.34                            │ 130.34.*.*
'130.34.78 130.34.79'             │ 130.34.78.*, 130.34.79.*
tohoku.ac.jp                      │ *.tohoku.ac.jp
'che.tohoku.ac.jp cc.tohoku.ac.jp'│ *.che.tohoku.ac.jp, *.cc.tohoku.ac.jp 

(2) 扱うメールの宛先アドレスの指定

 以下の行が存在します。
# CONFIG: acceptable destination addresses
C{AcceptDom} tohoku.ac.jp
この部分では,このホストで扱うべき宛先アドレスの範囲を限定しています。 もしもメールアドレスの範囲を記述した外部ファイルを指定するのであれば,
F{AcceptDom} ファイル名
という行を追加してください。sendmail.cf 内でドメイン名を指定する 場合には,この部分の2行目を変更します。

(3) SPAM メールに対する防御の指定

 メールの受け取りを拒否したい差出し人アドレスのリストは,
# CONFIG: list of spammers/spamming domains to be rejected
Kspamlist null -m -a@rej@ -o /etc/sendmail.spamlist
という部分で /etc/sendmail.spamlist と定義されています。別のファ イル名を利用する場合にはこの部分を変更してください。
 このファイルの内容に関しては 表 2 に説明があります。

付録B CF による中継制限つき sendmail.cf の作成

 CF は WIDE Project の中村 素典さんが作成した,sendmail.cf を生成するためのツールとサンプルファイルにより構成されたパッケージです。 以下のサイトから入手しましょう。
ftp://ftp.topic.ad.jp/pub/net/CF/
正式リリース版の最新は CF-3.6W.tar.gz ですが,sendmail-8.9.1 を使用する場合には CF-3.7Wpre.tar.gz 以降のものを入手してください。 CFの利用にあたっては sedperl がインストールされている必要があり,perl を利用した方が処理速度が向上します。
 なお,すでにsendmail-8.8.x か sendmail-8.9.x を使っている場合に, 既存の sendmail.cf をそのまま使って ``不正転送を防止するための速攻修正方法''が,CF-3.7Wpre4.tar.gz に含まれている docs/MANUAL.jpn に示されています。 sendmail.cf を新たに作る手間がかからず,簡単ですのでお勧めです。

(1) パッケージの展開

 以後の内容は CF-3.7Wpre4.tar.gz の使用を前提とします。パッケージを 入手して適当なディレクトリに置き,以下の手順で展開してください。
% gzip -dc CF-3.7Wpre4.tar.gz | tar xvf -
% cd CF-3.7Wpre4

(2) 作成ツールの構築

 perl のコマンド名が perl 以外の場合には,Makefile 中の PERL 変数へ設定します。もしもコマンドサーチパス中に perl が見付からない場合には,sed を使用する様に設定されます。
 以下のコマンドを実行すると,サブディレクトリ Tools 以下に sendmail.cf 作成ツールが生成されます。
% make cleantools
% make tools

(3) 定義ファイルの作成

 サブディレクトリ Standards/ 以下に標準定義ファイルが用意されて いるので,使用する sendmail のバージョンに合ったファイルを sendmail.def としてコピーし,編集します。
% cp Standards/sendmail-v7 sendmail.def (sendmail-8.8.x の場合)
% cp Standards/sendmail-v8 sendmail.def (sendmail-8.9.x の場合)
 定義ファイル内では # で始まる行がコメント行となり, 標準定義ファイル内で # 一個で始まる行がデフォルトの定義を意味します。また # 二個で始まる行を有効にしたい場合には,# を二個とも削除する必要があります。
 以下の内容について変更してください。さらに,興味があれば doc/INTRO.jpndocs/MANUAL.jpn を参考に様々な設定を行っても良いでしょう。

(4) 変更箇所

1. 必須な変更

 どの様な目的の sendmail.cf を作成する場合でも31行目先頭の # を削除して OS_TYPE を有効とし, Master/OSTYPE/ ディレクトリにあるファイルの中から, 使用するシステムに該当するものを選択して記述する (例 : OS_TYPE=bsd4.4) 必要があります。なお,FreeBSD や NetBSD,OpenBSD の場合には bsd4.4 を記述してください。

2. 送受信時のメールアドレスに依存する箇所

 作成した sendmail.cf を使用するホストの FQDN(Fully Qualified Domain Name; ドメイン名を含むホスト名)が foo.bar.tohoku.ac.jp の 場合に,
  1. 送受信のアドレスが FQDN であれば,デフォルトのままで構いません。
  2. メールドメイン hoge.tohoku.ac.jp 宛のメールを受信し, 送信時も同様のメールドメインを使用する場合には,61行目の FROM_ADDRESS と88行目の ACCEPT_ADDRS を有効にし, = の後に hoge.tohoku.ac.jp を記述します。
  3. ドメイン bar.tohoku.ac.jp 宛のメールを受信し,送信時も 同様のドメインを使用する場合には,62行目のFROM_ADDRESS と84行目の ACCEPT_ADDRS を有効にします。
2 と 3 の場合でも,FQDN 宛のメールを受信することができます。

3. sendmail 起動時にネームサーバから取得される箇所

 ここで説明する部分は,本来であれば sendmail 起動時にネームサーバから取得される内容です。 しかし万が一取得に失敗した場合に備え,設定した方が良いでしょう。
 37行目の MY_DOMAIN を有効とし,= の後にホストの属するドメイン名を記述します。また40行目の MY_NAME を有効とし,= の後にドメイン名を除いたホスト名を記述してください。

4. 無条件に中継するホストの指定

 この sendmail.cf を使用するホストを,SMTP サーバや中継ホストとして指定しているホストの範囲を指定します。 いずれの設定も共存可能です。
 東北大学学内のホストからのメールは無条件に中継する,という場合には 以下の様に設定します。
736行目(sendmail-8.8.x では722行目)  LOCAL_HOST_IPADDR=130.34
738行目(sendmail-8.8.x では724行目)  LOCAL_HOST_DOMAIN=tohoku.ac.jp

5. ホストが扱う宛先アドレスの指定

 この sendmail.cf を使用するホストで扱うべき,宛先アドレスの範囲を 指定します。 東北大学学内宛のメールを扱う場合には,以下の様に設定します。
784行目(sendmail-8.8.x では 772行目) ALLOW_RECIPIENT_DOMAIN=tohoku.ac.jp

6. SPAM メールに対する防御

表 2 : /etc/sendmail.spamlistの記述方法
記述内容                  │ 適用範囲
━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━
user1@domain1.jp  comment │ user1@domain1.jp からのメールを拒否
domain2.jp        comment │ domain2.jp からのメールを拒否
123.45            comment │ 123.45.*.* からのメールを拒否
12.34.56          comment │ 12.34.56.* からのメールを拒否
 差出し人アドレスの条件を指定して,そのメールの受け取りを拒否することが できます。 デフォルトでは /etc/sendmail.spamlist にそのアドレスを列挙しますが,ファイル名を変更する場合には760行目 (sendmail-8.8.x では746行目)を有効とし, SPAM_LIST= の後にファイル名を記述してください。
 このファイルの記述方法をに示します。 このファイルの内容を変更すると,sendmail へ動的に反映されます。 なお,comment という部分はsendmail の処理上,ダミーとして記述する必要がある文字列で特に意味はありません。

(5) sendmail.cf の作成

 以上の変更を完了後,以下のコマンドを実行して sendmail.cf を作成してください。
% make sendmail.cf


www-admin@tohoku.ac.jp
pub-com@tohoku.ac.jp