$Id: cf.html,v 1.9 2000-05-11 10:15:59+09 naito Exp $
ここに述べていることは, すべて私が実行した方法であり, これによる損害等については, 一切私は責任を持ちません. 各自の責任で行なって下さい.

CF を利用した sendmail.cf の作成と SPAM 対策

CF による sendmail.cf の作成方法

CF とは, 京都大学の中村素典氏を中心にして作成された sendmail.cf を 効率的に作成するためのツールです.
現在の CF の version (CF-3.7Wpl2-smtpcheck-patch2) では sendmail.8.10.1 のすべての機能に対応する sendmail.cf を作成できないようですが, CF の README.jpn を読んでみればわかりますが, ここではとりあえず sendmail release 8.9 (V8) に対応する sendmail.cf を作成することにします.

パッケージの使用方法は, CF に付属する README.jpn を読んで下さい. 極めてわかりやすく書いてあります.
ここでは, sendmail.cf を作成するための definition file 中で, SPAM 対策のとり方について説明します.
以後, CF のパッケージは $CFSRCDIR に展開されているとします.

CF を利用した SPAM 対策
CF において SPAM 対策を講じた sendmail.cf を作成するための方法は, $CFSRCDIR/doc/MANUAL.jpn の 2645 行目から書いてあります.

以下では, それを実践した私の方法を記録しておきます.

SPAM とは
SPAM とは当該ホストに対して, 大量(数千から数十万)のダイレクト・メールの ような電子メールを中継させるというものです. これは, 以下のような問題をひきおこします. (注:この文章は, NICE のページの SPAM 対策 の部分から(無断)借用致しました. )
SPAM を防ぐには
SPAM は該当ドメイン外(例えば, 名古屋大学多元数理科学研究科の場合 math.nagoya-u.ac.jp です)から, やはり該当ドメイン外に対するメールの中継のうち, 大量かつ不正なもののことを指します.
SPAM を防ぐためには, 該当ドメインを(エンベロープ) FROM および(エンベロープ) TO に持たないメールのうち, 不正なものの中継を拒否すれば良いのですが, sendmail には, どのメールが不正なものかを知る方法はありません.
さらに, 単に FROM が該当ドメインのものであったとしても, それが偽造されていないという保証はありませんので, 発信元のホストが 133.6.XXX.YYY のもの (すなわち自ドメインのIPアドレス) であるかどうかもチェックする必要があります.

これらの条件を整理して書き直してみると, 以下の2条件の両方にマッチしたメールのみを中継する設定を行なえば良いことがわかります.

ここで, 第一の条件は全く問題がないのですが, 第二の条件が問題となります. 例えば, Eudora のようなパーソナル・コンピュータ上のメール・ツールを利用して, 正当なユーザがドメイン外部(例えば, 自宅からプロバイダを利用しているようなことを想定しています)から FROM を math.nagoya-u.ac.jp にしてメールを発信したいと考えているとします.
実際, 自宅からプロバイダを利用してメールを発信する時などでは, FROM に大学(等)のアドレスを記入してアクセスしたいことがあります. この場合, 実際のメールの配送を行なってくれるホスト (Eudora では SMTP ホスト) に対して, メールの中継を要求して配送を行なっています.
このような場合には, 第二の条件にマッチしないことになり, 上のような利用法を行なっているユーザには非常な不便が出てきます. しかしながら, 現状では, SPAM の手口も悪質になって来ているので, 多少の不便さを我慢しなくてはならない状況になってきています.
以前は, このような不便さについて「我慢しろ!」と言っていれば済んだのですが, 出張先にノートPCなどを持っていき, 出張先の大学でDHCPによるネットワーク接続をして, メールの送受信だけをするなどという状況が発生してきているので, これを単に「我慢しろ」と言っていれば済む状況ではありません.
そこで, 今回(2000年4月)に, 以下のような設定を行うことにしました.
設定の目標

CF の設定方法

クライアントワークステーションの sendmail.cf
基本的には, 受信したメールをすべてメールサーバに転送すれば良いので, CF のパッケージにある null-v8.def を利用します.

null-v8.def を適当な名前 (ここでは, OSの名前をつけて, solaris-null.def としておきます.) につけ変えて, 以下を変更します.

OS_TYPE=solaris2.6   # OSの指定.
SPOOL_HOST='mailhost.math.nagoya-u.ac.jp' # メールサーバの指定.
ALWAYS_APPEND_DOMAIN=yes # 内部へのメールであってもドメイン名をつける.
このような定義ファイルを作成して, make を
make solaris-null.cf
と実行すると, solaris-null.cf が作成されます.

ところが, なぜか, 内部へのメールはエンベロープFROMにドメイン名がつかないので, このあと, cf ファイルを手で修正します. cf ファイルの変更点は以下の通りです.

以上の3点の書き換えで, クライアント・ワークステーションの sendmail.cf は完成しました. これを(Solaris 2.6 の場合は) /etc/mail に sendmail.cf としてコピーして, sendmail を再起動すればおしまいです.
メールサーバの sendmail.cf
メールサーバで上に書いた条件を満たすようにするには, CF のパッケージにある sendmail-v8.def を利用します.

sendmail-v8.def を適当な名前 (ここでは, OSの名前をつけて, server.def としておきます.) につけ変えて, 以下を変更します. (各変数の意味は, CF のドキュメントを参照してください)

OS_TYPE=solaris2.6             
MY_DOMAIN=math.nagoya-u.ac.jp  
MY_NAME=rabbit                 
OFFICIAL_NAME='$w.$m'          
MY_ALIAS=mailhost
FROM_ADDRESS='$m'
RECIPIENT_GENERIC=yes
REWRITE_GENERIC_FROM=yes
REWRITE_GENERIC_TO=yes
REWRITE_LOCAL_ON_RELAY=generic
ACCEPT_ADDRS='$m'
ACCEPT_LOWER=yes
ONE_TOKEN_HOST=reject
REDIRECT=yes
ALWAYS_APPEND_DOMAIN=yes
RES_NUMERIC=no
USERTABLE_MAPS='snowy.math.nagoya-u.ac.jp=dbm:/etc/mail/sendmail/ut.snowy \
	tintin.math.nagoya-u.ac.jp=dbm:/etc/mail/sendmail/ut.snowy \
	eagle.math.nagoya-u.ac.jp=dbm:/etc/mail/sendmail/ut.eagle'
TRUSTED_USERS='root postmaster'
NIS_DOMAIN=numath-sol
ERROR_MODE='mail'
TIMEOUT_QUEUERETURN='4d'
TIMEOUT_QUEUEWARN='1d'
ALLOW_BOGUS_HELO='True'
HSTAT_DIR='.hoststat'
# ここまでは sendmail 中継制限とは直接関係しない.
MAIL_RELAY_RESTRICTION=yes
# SMTP 接続に関する条件
CHECK_HOST_ALLOW=/etc/mail/sendmail/check_host_allow
CHECK_HOST_DENY=/etc/mail/sendmail/check_host_deny
CHECK_RELAY_DEFAULT=allow # (allow/deny) default
# 【条件1】を処理する部分.
LOCAL_HOST_IPADDR=/etc/mail/sendmail/local_host_ipaddr
LOCAL_HOST_DOMAIN=/etc/mail/sendmail/local_host_domain
# 【条件2】を処理する部分.
CLIENT_HOST_IPADDR=/etc/mail/sendmail/client_host_ipaddr
CLIENT_HOST_DOMAIN=/etc/mail/sendmail/client_host_domain
CLIENT_FROM_DOMAIN=/etc/mail/sendmail/client_from_domain
# 【条件6】を処理する部分.
SPAM_LIST=dbm:/etc/mail/sendmail/spamlist
# 【条件3】を処理する部分.
ROAM_HOST_IPADDR=/etc/mail/sendmail/roam_host_ipaddr
ROAM_HOST_DOMAIN=/etc/mail/sendmail/roam_host_domain
ROAM_USERS=/etc/mail/sendmail/roam_users
# 【その他】
CLIENT_DENY_TO=/etc/mail/sendmail/client_deny_to
ALLOW_RECIPIENT_DOMAIN=/etc/mail/sendmail/allow_recipient_domain
ALLOW_RELAY_FROM=/etc/mail/sendmail/allow_relay_from
ALLOW_RELAY_TO=/etc/mail/sendmail/allow_relay_to
REJECT_EXTERN_SRR=no
ここまでの設定で完成していない部分は, 【条件4】を処理するパートです. これに関しては, 手で sendmail.cf を書き換えることで対応します.
各項目の説明
さらなる設定
ここまでの設定では, という設定が行われていません. これを設定するには, 上で作成した定義ファイルを元に作成した, sendmail.cf を手で書き換えることが必要となります.
cf ファイルの変更
cf ファイルを以下の考えに基づいて変更していきます. 以上で sendmail.cf の変更はおしまいです.

こんなに書き換えるのなら, もう少し整理して書き換えた方が良いような気になってきましたが...


naito@math.nagoya-u.ac.jp