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