POP before SMTPで何処ででもメール送信

いろいろなところで SMTP サーバーが必要になってきました。しかし、sendmail を不正使用されないような設定や SPAM 対策が必要となります。そのために、sendmail に認証のメカニズムを組み込む SMTP AUTH という機能があります。しかし、利用者がそれほど技術的な知識がない場合 SMTP AUTH は難しいかもしれません。そこで、POP before SMTP というメカニズムを利用します。これは、まず自分宛のメールがあるか確認することで POP による認証が行われます。その認証が成功していれば、SMTP サーバーを利用できるようにするというものです。


POP before SMTP を実現するには、いくつかの方法があります。ここでは、DRAC(Dynamic Relay Authorization Control) というSMTPサーバーによる中継を制御するデーモンを利用します。これは、POPサーバーによる認証が成功したホストの IP Address を DRAC サーバーに渡すことで認証済みホストのデータベースを作成します(一定時間保持します)。そのデータベースに登録されている IP Address からのアクセスの場合、SMTPサーバーがメールの送信を行うという仕組みです。メール送信は、DRACで指定された時間内で有効となり、指定された時間を過ぎるとデータベースに登録されたIPアドレスが自動的に消去されます。

* 必要モジュールの入手

MTAとして sendmail を利用し、POPサーバーには qpopper を利用します。Berkeley DB の利用するが、ここでは Redhat Linux を利用した解説なのでインストール済みな database manager を利用します。

DRAC http://mail.cc.umanitoba.ca/drac/
sendmail http://www.sendmail.org/
qpopper http://www.eudora.com/qpopper/
Berkeley DB http://www.sleepycat.com/download/

 

* コンパイル

DRAC, sendmail, qpopper のインストール手順を記述しています。DRAC の利用には、sendmail の再コンパイルは必要ないので現在利用しているものをそのまま利用可能です。

● DRAC の作成

# mkdir drac
# cd drac
# gzip -dc ../drac.tar.Z | tar xf -
# edit Makefile
          
Makefile 変更部分
INSTALL = /usr/bin/install
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C
CFLAGS = $(DEFS) -g
LDLIBS = -ldb
RPCGENFLAGS = -C -I
MANADM = 8
# mkdir /usr/local/man/man{3,8}
# make
# make install
# make install-man
# cp libdrac.a /usr/local/lib/
# edit dracd-setup.linux
起動スクリプト変更部分
daemon /usr/local/sbin/rpc.dracd&
killproc /usr/local/sbin/rpc.dracd
# cp ./dracd-setup.linux /etc/rc.d/init.d/dracd
# ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc3.d/S81dracd
# ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc4.d/S81dracd
# ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc5.d/S81dracd
# cd ..

● POPサーバーの作成

# groupadd pop
# useradd -g pop -s /bin/true pop
# gzip -dc qpopper4.0.4.tar.gz | tar xf -
# cd qpopper4.0.4
# ./configure --enable-apop=/etc/pop.auth --with-popuid=pop --enable-drac
# make
# make install
# cd ..
# edit /etc/xinetd.d/popper
xinetd 設定ファイルの変更
service pop3
{
    socket_type    = stream
    wait           = no
    user           = root
    server         = /usr/local/sbin/popper
    server_args    = -s
    log_on_success += HOST DURATION
    log_on_failure += HOST
    disable        = no
}
# /etc/rc.d/init.d/xinetd restart

● SMTPサーバーの作成(セキュリティー上問題がなければ特に作り直す必要はありません)

# useradd -s /bin/true smmsp
# gzip -dc sendmail.8.12.8.tar.gz | tar xf -
# cd sendmail.8.12.8
# ./Build
# ./Build install
# cd ..
      今まで、sendmail を使っていた場合、いきなりインストールせずに
      プロセスを終了させ必要なファイルをバックアップしてください。

* 設定とテスト

それぞれのサーバーの設定を行います。

● DRAC の設定

DRACの利用を許可するIPアドレスを /etc/mail/dracd.allow というファイルへ登録します。

# edit /etc/mail/dracd.allow
DRAC 設定ファイル
#
255.255.255.255   127.0.0.1

DRAC のソースパッケージを展開したところに、動作テスト用のコマンドが作られています。そのコマンドを利用して動作確認をして見ましょう。まず、DRACデーモンを起動し、testing コマンドで適当な IP Address を指定します。db_dump コマンドでデータベースに登録されていることを確認します。今度は、DRACDコマンドに -i オプションを指定してデータベースを初期化して、データベースが初期化されたことを確認します。

# /etc/rc.d/init.d/dracd start
Starting rpc.dracd daemon:            [  OK  ]
# cd drac
# ./testing localhost 192.168.10.12
# db_dump -p /etc/mail/dracd.db
VERSION=3
format=print
type=btree
HEADER=END
 192.168.10.12
 1048336127
DATA=END
# /usr/local/sbin/rpc.dracd -i
# db_dump -p /etc/mail/dracd.db
VERSION=3
format=print
type=btree
HEADER=END
DATA=END
# 

動作確認ができたら、DRACデーモンの調整をします。デフォルトで、 データベースからIPアドレスを消去する時間が30分になっています。これを変更したい場合、-e オプションを使用します。

DRAC デーモンのオプション
rpc.dracd [-i] [-e expire] [dbfile]
 
 -i       :データベースの初期化
 -e exire :データベースからIPアドレスを消去する時間(デフォルトは30分)
 dbfile   :データベースファイル(デフォルトは /etc/mail/dracd.db)

データベースからIPアドレスを消去する時間を決定したら、起動スクリプトを書き換えます。以下の例では 10 分に設定しています。

# edit /etc/rc.d/init.d/dracd
          
起動スクリプト変更
#!/bin/sh -
# Put this file into /etc/rc.d/init.d/dracd
# and link it intot he run levels you want to use it
# by doing "ln -s  /etc/rc.d/init.d/dracd /etc/rc.d/rc.<runlevel>/S99dracd"
#
# dracd-setup

# Source function library.
. /etc/rc.d/init.d/functions

# See how we were called.
case "$1" in
  start)
        echo -n "Starting rpc.dracd daemon: "
        daemon /usr/local/sbin/rpc.dracd -i -e 10 &
        echo
        touch /var/lock/subsys/rpc.dracd
        ;;
  stop)
        echo -n "Stopping rpc.dracd daemon: "
        killproc /usr/local/sbin/rpc.dracd
        echo
        rm -f /var/lock/subsys/rpc.dracd
        ;;
  *)
        echo "Usage: dracd {start|stop}"
        exit 1
esac

exit 0
# /etc/rc.d/init.d/dracd stop
# /etc/rc.d/init.d/dracd start

● POPサーバーの設定

inetd の設定が完了しているので特に設定することはないが、APOP を利用できるようにするにはデータベースの初期化とユーザー登録が必要になります。たとえば、user00 を登録してみましょう。最後にユーザーの削除も行ってみます。

# /usr/local/sbin/popauth -init
Really initialize POP authentication DB? y
# /usr/local/sbin/popauth -user user00
Adding only APOP password for user00.
New password:<Type password>
Retype new password:<Type paaword again>
# /usr/local/sbin/popauth -delete user00
Warning: deleting user "user00"

データベースの初期化やユーザー登録は、スーパーユーザーか pop ユーザーでなければ行えないが、パスワードの変更は一般ユーザーで行えます。

user00$ /usr/local/sbin/popauth
Changing only APOP password for user00.
Old password:<Type old password>
New password:<Type new password>
Retype new password:<Type new password again>
user00$

● SMTPサーバーの設定

cf の 作成は、sendmail のソースパッケージに含まれるテンプレートを利用して作成します。

# cd sendmail.8.12.8/cf/cf
# edit config.mc
cf テンプレート
divert(-1)
#
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
# All rights reserved.
# ...
#

divert(0)dnl
VERSIONID(`$Id: hostname.mc 8.12 2002/08/03 15:26:50 JST Exp $')dnl
OSTYPE(linux)dnl
DOMAIN(generic)dnl
FEATURE(`always_add_domain')dnl
MASQUERADE_AS(`foobar.co.jp')dnl
MASQUERADE_DOMAIN(`foobar.co.jp')dnl
FEATURE(`masquerade_entire_domain')dnl
FEATURE(`masquerade_envelope')dnl
FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access')dnl
FEATURE(`blacklist_recipients')dnl
FEATURE(`nouucp',`reject')dnl
undefine(`UUCP_RELAY')dnl
undefine(`BITNET_RELAY')dnl
define(`confPRIVACY_FLAGS', `goaway')dnl
define(`confSMTP_LOGIN_MSG', `$j Sendmail; $b')dnl
define(`confMAX_MESSAGE_SIZE', `5242880')dnl
MAILER(local)dnl
MAILER(smtp)dnl
 
LOCAL_CONFIG
# dynamic relay authorization control map
Kdrac btree /etc/mail/dracd
 
LOCAL_RULESETS
SLocal_check_rcpt
# allow recent POP/IMAP mail clients to relay
R$*				$: $&{client_addr}
R$+				$: $(drac $1 $: ? $)
R?				$@ ?
R$+				$@ $#OK
# ./Build config.cf

DRACの動作テストをし、設定が OK であれば sendmail.cf として登録します。

# ../../../drac/testing localhost 192.168.10.12
# db_dump -p /etc/mail/dracd.db
VERSION=3
format=print
type=btree
HEADER=END
 192.168.10.12
 1048341207
DATA=END
# /usr/sbin/sendmail -C./config.cf -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /map drac 192.168.10.12
map_lookup: drac (192.168.10.12) returns 1048341207 (0)
> /map drac 192.168.0.1
map_lookup: drac (192.168.0.1) no match (0)
> /quit
#
# /etc/rc.d/init.d/sendmail stop
# cp config.cf /etc/mail/sendmail.cf
# /etc/rc.d/init.d/sendmail start
 
  または
# /usr/sbin/sendmail -bd -q30m
# /usr/sbin/sendmail -Ac -q30m

【補足】

access_db を設定して、メールの中継やスパムに関するデーターベースを作成します。詳しい記述方法は cf/README ファイルを参照してください。

# edit /etc/mail/access
    spammer@aol.com        REJECT
    spammer.com            ERROR:"550 We don't accept mail from spammers"
    192.168.200            DISCARD
    spam@                  REJECT
    cyberspammer.com       REJECT
    good.cyberspammer.com  OK
    mydomain.co.jp         RELAY
# makemap hash /etc/mail/access < /etc/mail/access

sendmail.cf を作成した際に、DOMAIN の指定で generic.m4 ファイルを利用したので /etc/mail/local-host-names に FQDN 形式で利用するローカルドメインを記述しておく。

# edit /etc/mail/local-host-names
    foobar.co.jp