FC4 付属の sendmail で POP before SMTP(qpopper+DRAC)への対応

1. はじめに

 このページでは Fedora Core 4 に付属されている sendmail に対して POP before SMTP*1 機能を実装するための手順書および解説です。POP before SMTP というのは、メールサーバの第三者による不正中継を防止するための手段の1つとして有名で、メールを受信することによりサーバの利用者であると認識し、SMTP(sendmail)サーバ側で一定期間その利用者の IP アドレスに対してメール中継(送信)を許可するという方法です。

 具体的な認証の仕組みとしては、メール受信時に qpopper が dracd(DRAC本体) にメールを受信したぞという記録を送り、dracd が sendmail の参照する許可リストに利用者の IP アドレスを記述するものです。時間が経てば自動的に dracd は許可を取り消します。定期的にメールを受信するような設定にされていれば、特に「送信前には受信が必要」と構える必要は無いでしょう。この仕組みの唯一の欠点であり利点であるのが、メールを受信しないと送信出来ないと言うこと。送信が出来ない場合には、まず受信が正しく行われているか確認しなくてはいけません。

 昨今は SMTP Auth という選択肢もありますが、急なシステム変更を行うことができない場合、あるいは新システムを導入しても POP Before SMTP でありつづけなくてはいけない(まぁ説明が面倒ですとか)等々の理由により、とにかく POP before SMTP を導入するぞー!とうい場合にお役に立てばと思います。

2. DRAC のセットアップ

2-1. DRAC ??

 POP Before SMTP 認証の認証許可・許可取り消しを司る dracd のセットアップを行います。

2-2. 作業手順

1. ソースディレクトリに移動して drac というディレクトリを作ります

$ cd /usr/local/src
# mkdir drac

2. ディレクトリを作ったら、中に移動します。

$ cd drac

3. DRAC のソースを wget で入手します。

$ wget ftp://ftp.cc.umanitoba.ca/src/drac.tar.Z

4. tar を使いファイルを展開(解凍)します

$ tar xfz drac.tar.Z

5. Makefile を編集します

$ vi Makefile

6. ファイルを開いたら7行目以下をざっくり編集して、INSTALL 等の行をざっくり入れ替えます。

INSTALL = install
EBIN = /usr/local/sbin
MAN = /usr/local/man/man
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C
CC = gcc
RANLIB = :
CFLAGS = $(DEFS) -g
LDLIBS = -ldb
TSTLIBS = -L. -ldrac
RPCGENFLAGS = -C -I
MANLIB = 3
MANADM = 8

7. Makefle の準備が終わったら make します

$ make

 特にエラーメッセージが出てこなければ大丈夫です。正常にコンパイルされています。もしエラーが出てしまって正しくコンパイルされていなければ、Makefile の記述が正しいかどうか疑ってください。 8. 次にインストールします。

# make install

9. 一緒に man*2 もセットアップしてしまいます。

# mkdir /usr/local/man/man3
# mkdir /usr/local/man/man8
# make install-man

10. 起動スクリプトを /etc/init.d にコピーします。後からサーバ起動時に自動で DRAC が起動するように設定するためです。

# cp dracd-setup.linux /etc/init.d/dracd

11. コピーした dracd ファイルを編集するため vi で開きます

# vi /etc/init.d/dracd

12. dracd ファイルの7行目に以下の項目を追加します(#必要です)

# chkconfig: 235 99 99
# description: for POP before SMTP
# processname: rpc.dracd

 引き続き 19 行目の記述も変更します(rpc.dracd をフルパスで指定します)。

        daemon /usr/local/sbin/rpc.dracd&

13. Fedora Core にサービスとして dracd を登録します

# /sbin/chkconfig --add dracd

 動作確認は --list オプションで可能です。

# /sbin/chkconfig --list dracd
dracd           0:off   1:off   2:on    3:on    4:off   5:on    6:off

 このようにランレベル 3, 5 で on としてありますので、マルチユーザモードでも、X11 が動いていても問題ないでしょう。 14. dracd の起動・停止テスト  dracd の起動・停止は Fedora Core のその他の一般的なデーモンと操作方法は同じです。起動は start 、停止は stop です。

# /etc/init.d/dracd start
Starting rpc.dracd daemon:                                 [  OK  ]

 ps で見ると、プロセスが動いている事が分かります。

# ps ax | grep dracd
7004 ?        S      0:00 /usr/local/sbin/rpc.dracd

 停止は stop です。

# /etc/init.d/dracd stop
Stopping rpc.dracd daemon:                                 [  OK  ]

 以上で drac のセットアップは終わりました。起動・停止テストをした場合は、再び rpc.dracd デーモンを起動させておいてください(start してください)。

3. dovecot 使用時の注意

 dovecot サーバを有効にしていると、次に作業を行う qpopper の稼働に支障が出る場合があります。pop3 サーバのみを無効にしたいので、以下の手順で作業を行ってください。

 vi /etc/dovecot.conf で設定ファイルを開きます。8行目を見てください。

protocols = imap imaps

 もしこの中に pop3 があれば、pop3 の記述を削除して dovecot の再起動を行います。

# /etc/init.d/dovecot restart
Dovecot Imap を停止中:                                     [  OK  ]
Dovecot Imap を起動中:                                     [  OK  ]

 Imap のみ使えるように dovecot で残しておいても大丈夫です。

4. qpopper のインストール

4-1. qpopper ?

 qpopper というのは POP3 サーバ(MRA) です。要はメールを受信するためのサーバです。Fedora Core では dovecotという非常に優れたサーバが入っていますが、残念、これが POP Before SMTP に対応していないので、qpopper という結構日本では有名な POP3 サーバをインストールすることにします。この qpopper 君が rpc.dracd に認証したよという情報を送る訳です。

4-2. qpopper のセットアップ作業

1. ソースディレクトリに移動します

$ cd /usr/local/src

2. wget でアーカイブを取得します。今日現在(2005/07/12)の最新版は 4.0.8 です。もしこのページの記述が古くなってダウンロードできなければ、ダウンロード用 ftp サイトを辿ってください*3

$ wget ftp://ftp.qualcomm.com/eudora/servers/unix/popper/qpopper4.0.8.tar.gz

3. アーカイブを展開(解凍)します

$ tar xfz qpopper4.0.8.tar.gz

4. ディレクトリを移動します

$ cd qpopper4.0.8

5. さて、ここでは後々のため(apop や pop3s で使います) qpopper 動作用のアカウントを作成しておきます。UID, GID は適当です。好きな番号でも構いません。

# /usr/sbin/groupadd -g 102 pop3
# /usr/sbin/adduser -u 102 -g 102 pop3 -s /sbin/nologin

6. 次に ./configure を実行します。オプションは少し色々ありますが、後々のため、一通り指定しておくことにします。

# ./configure \
    --enable-apop=/etc/mail/apop.auth \
    --enable-popuid=pop3 \
    --with-openssl \
    --enable-log-login \
    --enable-specialauth \
    --with-drac=/usr/local/src/drac

7. 問題なければサクサクッとセットアップしてしまいましょう。

# make
# make install

 これでファイルが /usr/local/sbin/popper にコピーされました。

5. xinetd の設定と動作確認

 セットアップした qpopper は xinetd*4経由でメールを受信することにします。

 設定フィルを作成します。

# vi /etc/xinetd.d/qpopper

 新規にファイルを作成します。以下の内容をそのままコピーしてください。

service pop3
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/local/sbin/popper
        server_args     = -s -R
}

 サーバの引数に -s をつけているのは受信時の詳細なログを記録するためです。トラブルの時に役立ちます。-R はホスト名の逆引きを行いません。受信時間短縮のためです。

 さて、ファイルを保存したら xinetd を再起動します。

# /etc/init.d/xinetd restart
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]

 特にエラーが出なければ作業完了です。

 動作確認は telnet を使って手軽に行います。

$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
Escape character is '^]'.
+OK Qpopper (version 4.0.8) at sion starting.  <11021.1121178868@sion>

 このように qpopper が正常応答してくれれば問題ありません。終了は QUIT と入力してエンターです。

QUIT
+OK Pop server at sion signing off.
Connection closed by foreign host.

 あとは、念のため /var/log/maillog も確認してみましょう。メールの受信が正常に行われていれば次のようにメッセージが表示されます。tail -f /var/log/maillog で

Jul 12 23:34:28 sion popper[11021]: (v4.0.8) Servicing request from "sion" at 127.0.0.1
Jul 12 23:37:02 sion popper[11060]: (v4.0.8) Servicing request from "192.168.11.102" at 192.168.11.102
Jul 12 23:37:02 sion popper[11060]: (v4.0.8) POP login by user "zem" at (192.168.11.102) 192.168.11.102
Jul 12 23:37:02 sion popper[11060]: [drac]: login by zem from host 192.168.11.102 (192.168.11.102)
Jul 12 23:37:12 sion popper[11060]: Stats: zem 0 0 30 110356 192.168.11.102 192.168.11.102

 これは zem というユーザが 192.168.11.102 というホストから sion というホストに接続し、認証が通ったので [drac] へ zem が login しましたよ、と情報を送っています。

 正しく dracd が sendmail の為のファイルを更新しているかどうか調べてみましょう。対象ファイルは /etc/mail/dracd.db です。

# db_dump /etc/mail/dracd.db
VERSION=3
format=bytevalue
type=btree
db_pagesize=512
HEADER=END
 3139322e3136382e31312e313032
 31313231313831303037
DATA=END

 これは生のデータなので、分かり易くするためには mekemap オプションで参照して確認します。IP と受信時刻が記録されます。

# makemap -u btree /etc/mail/dracd.db
192.168.11.102  1121181782

 次に、そのまま /etc/mail/dracd.allow ファイルを編集します。自分自身からしか基本的に許可しないので、次のように書きます。

255.255.255.255 127.0.0.1

5. sendmail の設定

5-1. 最期は sendmail の設定

 最終的にメールを送信するのは sendmail です。sendmail が dracd によって作成される許可リスト /etc/mail/dracd.db を参照するようにする事が次の作業です。

 この作業では sendmail.cf の再構築を行います。環境が変わる恐れもありますので、一応事前にバックアップを取っておくことをおすすめいたします。

# cp -p /etc/mail/sendamil.cf /etc/mail/sendmail.cf.backup

5-2. sendmail.mc の編集と sendmail.cf の構築

1. sendmail の設定ファイル sendmail.mc を開きます

# vi /etc/mail/sendmail.mc

 ファイルを開いたら、一番末尾に次のように記述を追加します。

LOCAL_CONFIG
Kdrac btree /etc/mail/dracd
LOCAL_RULESETS
SLocal_check_rcpt
dnl # allow recent POP/IMAP mail clients to relay
R$*				$: $&{client_addr}
R$+				$: $(drac $1 $: ? $)
R?				$@ ?
R$+				$@ $#OK

(※左右の文字列にあるのは空白ではなくタブ[TAB]です。空白では動作しません。mc ファイルへの記入時にはご注意下さい。)

2. sendmail.cf を再構築します

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

3. 最期に sendmail を再起動します。

# /etc/init.d/sendmail restart
sendmail を停止中:                                         [  OK  ]
sm-client を停止中:                                        [  OK  ]
sendmail を起動中:                                         [  OK  ]
sm-client を起動中:                                        [  OK  ]

 あとはメールソフト側から送信が可能かどうか、確認してみてください。

 なお、初期状態ではメール受信後 30 分間の送信が許可されます。時間の変更は rpc.dracd の引数に -e xx(秒) と指定します。詳しくは man .rpcdracd をご覧下さい。

ハマりポイント

  • エラー『554 5.3.0 rewrite: map drac not found』 /etc/mail の中に dracd.db はありますか? sendmail.mc の記述が不適切でも、このようにエラーが出ます。
  • エラー『reject=550 5.7.1 <メールアドレス>... Relaying denied. Proper authentication required.』メール中継が拒否されました。ちゃんと受信されたあとに送信を試みられているか確認してください。

メモ

  • DRAC の手順 11 で "/usr/sbin/chkconfig --add dracd" を試みたがエラー

     「サービス dracd は、chkconfig をサポートしていません。」と出てサービスとして受け付けてくれない。何故?? ドキュメントではシンボリックはれば?と出てるが、なんとかスマートな方法が無いものか。

     と、色々さぐっているうちに【 chkconfig 】なる行が必要な事が判明 (参考URL - http://www.turbolinux.co.jp/dcforum/DCForumID11/6109.html)。 なるほど。ランレベルと優先順位を書けば良いんだな。ということは、ランレベル 235 で問題ないだろう、あとは起動手順としてはラストかな 99 に決定。うむ、問題ない。

  • DRAC の手順 14 でハマる。

     起動しようとしても、"Starting rpc.dracd daemon: /etc/rc.d/init.d/functions: line 148: rpc.dracd: command not found" ?? functions ファイルの 148 行目をみたら "$nicd $*" しかない。うーん。SELinux は disable だから関係ない。

     うーむ。原因は dracd ファイル 19 行目 "daemon rpc.dracd&" に間違いない。あ、もしかして単にシステムパスが通ってないだけ!? あり得る……。そこでフルパス "/usr/local/sbin/rpc.dracd" に書き換えると……。キタ━(゚∀゚)━ッ!! なんだ、それだけかよ orz...


*1 ポップ・ビフォーア・エスエムティピーと発音
*2 man コマンドで参照するマニュアルのことです
*3 ダウンロードページをのぞいたら 4.0.5 が最新ですよ〜と書いてあるのに、実際には 4.0.8 がリリースされていました……何時の間に
*4 ザイネットディー、と呼びます man に書いてありました

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Mon, 18 Jul 2005 23:06:23 JST (6862d)