メールサーバを立ち上げる(sendmail)


sendmail

電子メールを利用するには、MTA(Mail Transfer Agent)が必要です。 MTA の代表的なものには、sendmail があります。sendmail の歴史は非常に長く、 また非常に高機能で、IP上のメールのやり取りだけではなく、UUCP や他のプロトコル のメールのやりとり、さらには FAX でメールを送るといったことまで出来ます。
sendmail は、その稼働しているマシンの多さや、またそれ自体の複雑さもあって、 数多くのクラッカーの攻撃対象になってきました。したがって、sendmail を運用する 際には、できるだけ最新のものを使うようにします。
sendmail の公式サイトは
http://www.sendmail.org
です。ソースの入手や、その他いろいろな情報があります。

インストール

sendmail の入手は、以下のURL
ftp://ftp.sendmail.org/pub/sendmail/
ftp://ftp.iij.ad.jp/pub/network/sendmail/
から入手できます。できるだけ最新のバージョンの sendmail をダウンロードします。 今回は sendmail-8.9.3.tar.gz をダウンロードしました。
今回は、sendmail を FreeBSD-2.2.8Release にインストールします。

まず、ソース自体が改ざんされていないかを検証します。検証には PGP が必要です。 sendmail-8.9.x を検証するために、"Sendmail Signing Key/1999"の公開鍵を事前に、
http://www.sendmail.org/sendmail1999.asc
から入手して、PGPに登録しておきます。登録は、以下のように行います。 なお、事前に PGP をインストールしておきます。PGPについては、 ここを御覧ください。
% pgp -ka sendmail1999.asc 
Pretty Good Privacy(tm) 2.6.3i - みんなの公開キー暗号.
(c) 1990-96 Philip Zimmermann, Phil's Pretty Good Software. 1996-01-18
国際化版 - 非アメリカ合衆国向け. RSAREFは使用していません.
現在時刻: 2000/05/27 15:02 JST

新しいキーを検索中...
pub  1024/A39BA655 1999/01/04  Sendmail Signing Key/1999 

署名を検査しています...
pub  1024/A39BA655 1999/01/04 Sendmail Signing Key/1999 
sig!      A39BA655 1999/01/04  Sendmail Signing Key/1999 
sig!      D432E19D 1999/01/04  Sendmail Signing Key/1998 


キーファイルの内容:
   1 個の新しいキー

新しいキーは完全に保証はされていません.
これらのキーをあなた自身で保証を行いますか (y/N)? n
検証をするには、入手したソースファイル sendmail.8.9.3.tar.gz と別のサイトから、 sendmail.8.9.3.tar.sig を入手します。同じサイトから取ってくると、sig ファイルも 同時に改ざんされている危険性があるためです。検証は、以下のように行います。
% pgp sendmail.8.9.3.tar.sig 
Pretty Good Privacy(tm) 2.6.3i - みんなの公開キー暗号.
(c) 1990-96 Philip Zimmermann, Phil's Pretty Good Software. 1996-01-18
国際化版 - 非アメリカ合衆国向け. RSAREFは使用していません.
現在時刻: 2000/05/27 15:03 JST

ファイルに署名があります. 署名検査に公開キーが必要です.

ファイル 'sendmail.8.$00' は署名を含んでいます.しかしテキストがありません.
次の署名に使うためのテキストのファイル名を入力してください: sendmail.8.9.3.tar   ←検証するファイルを入力
.
ユーザ"Sendmail Signing Key/1999 "からの正しい署名です.
署名は 1999/02/05 01:07 JST を作りました. 1024-bit キー, キーID A39BA655 が用いられました.

警告: この公開キーは信用できる署名によって保証されてないので
"Sendmail Signing Key/1999 "の公開キーは
高い機密性を持っているかどうかはわかりません.

署名とテキストが分離されます. 出力ファイルは作成しません.
ソースの検証が終わったら、適当なディレクトリでソースファイルを展開します。
% tar xvfz sendmail.8.9.3.tar.gz
FreeBSDの場合は、展開したソースの src ディレクトリの makesendmail スクリプトを 実行するだけで OK です。
% cd sendmail-8.9.3/src
% ./makesendmail
FreeBSDの場合は、groff や m4マクロプロセッサが標準で付属しているので、 何もエラーを出すことなくコンパイルすることができます。
コンパイルが終了したら、出来上がった sendmail をテストしてみます。 以下のように sendmail を実行し、すぐに終了すれば、コンパイルは大丈夫です。
% cd obj.FreeBSD.2.2.8-RELEASE.i386
% ./sendmail -bt -d0.1 < /dev/null
Version 8.9.3
 Compiled with: MAP_REGEX LOG MATCHGECOS MIME7TO8 MIME8TO7 NAMED_BIND
                NETINET NETUNIX NEWDB NIS QUEUE SCANF SMTP USERDB XDEBUG

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = oak
  (canonical domain name) $j = oak.eg.t.kanazawa-u.ac.jp
         (subdomain name) $m = eg.t.kanazawa-u.ac.jp
              (node name) $k = oak
========================================================

Warning: .cf file is out of date: sendmail 8.9.3 supports version 8, .cf file is version 7
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter < ruleset > < address >
> %   ←コマンドプロンプトが戻る
テストが終わったら、インストールします。その前に、以下のようにして、現在、動いている sendmail を止め、古いバイナリをバックアップしておきます。
# ps ax | grep sendmail
 124  ??  Is     0:00.05 sendmail: accepting connections on port 25 (sendmail)
# kill 124
# mv /usr/sbin/sendmail /usr/sbin/sendmail.old
バックアップを取った後、1つ上の src ディレクトリに移動し、以下のようにして インストールします。
# cd ..
# ./makesendmail install
以上で、sendmail のインストールは終了です。

smtpfeed

大規模なメーリングリストを運用しているサイトでは、sendmail は処理が 遅くなるため、smtpfeed を使用すると便利です。これは、送信時の DNS 問い合わせと配信を並列処理して高速にメールを配信します。
以下の URL
ftp://ftp.kyoto.wide.ad.jp/pub/mail/smtpfeed/
より、最新版の smtpfeed をダウンロードします。今回は、smtpfeed-1.06.tar.gz を 入手しました。ソースファイルを入手したら、以下のように解凍・展開して、ディレクトリを 移動します。
% tar xvfz smtpfeed-1.06.tar.gz
% cd smtpfeed-1.06
インストールは、付属のドキュメントにあるようにして、以下のようにして行います。
% ./configure
% make all
% su
Password
# make install
次に、/etc/syslog.conf ファイルを編集します。 以下の記述を追加します。
local5.info                                     /var/log/smtplog
追加後、syslogd を再起動します。
# ps ax | grep syslog
   98  ??  Ss     1:59.63 syslogd
# kill -HUP 98
次に、動作確認を行います。TEST.in の中のアドレスを適当に変更した後、 以下のように実行し、デバッグ結果を確認します。
# ./smtpfeed -dA -lstderr < TEST.in
...
...
221 oak closing connection
xyz: time=0.000+0.000/0.002 rss=0 nivcsw=4 (all done)
以上で、smtpfeed のインストールは終了です。

また、smtpfeed を使用するためには、sendmail に WIDEパッチを当てる必要が あります。上記と同じ場所より、sendmail-8.9.3 用のパッチとして、 sendmail893+3.2W.patch.gz を入手します。
その後、sendmail のソースファイルのあるディレクトリに移動して、 以下のようにしてパッチを当てます。
% gunzip sendmail893+3.2W.patch.gz
% cd sendmail-8.9.3/src
% patch < ../../sendmail893+3.2W.patch
後は、前回と同じようにインストールします。
% ./makesendmail
% su
Password:
# ./makesendmail install
以上で、smtpfeed を利用するための sendmail のインストールは終了です。

MXレコード

作成中です。 詳しくは こちらを参考にして下さい。

sendmailの設定ファイル

sendmail の動作の制御は、sendmail.cf ファイルで行います。これは、sendmailが 起動時に読み込むファイルで、デフォルトでは、/etc/sendmail.cf となります。
sendmail のソースには、sendmail.cf ファイル生成ユーティリティである cf が 付属していますが、これは非常に分かりにくいため、ここでは、WIDEプロジェクトで 開発されている CF というツールを用います。

CFは、以下のURL
ftp://ftp.kyoto.wide.ad.jp/pub/mail/CF/
より、最新版の CF を入手します。今回は、CF-3.7Wpl2.tar.gz を入手しました。 入手後、適当なディレクトリで解凍・展開し、ディレクトリを移動します。
% tar xvfz CF-3.7Wpl2.tar.gz
% cd CF-3.7Wpl2
ここで、付属のドキュメント README.jpn を読み、それに従って設定を 行っていきます。
まず、Makefile の PERL 変数に perl のコマンド名を設定します。その後、 以下のようにして Tools ディレクトリ以下にある sendmail.cf 作成用ツールを 自分の環境に合わせて再構築します。
% make cleantools
% make tools
次に、以下のようにして、標準定義 def ファイルを作成します。
% make samples
この操作により、Standards ディレクトリ以下に、次のような def ファイルが 作成されます。
smtpcheck-v8.def   sendmail 8.9.x 転送拒否設定追加用
smtpcheck-v7.def   sendmail 8.8.x 転送拒否設定追加用
sendmail-v8.def    sendmail 8.9.x 用一般
sendmail-v7.def    sendmail 8.8.x 用一般
sendmail-v6.def    sendmail 8.7.x 用一般
sendmail-v5.def    sendmail 8.6.x 用一般
sendmail-v1.def    sendmail 5.x+1.6W 用一般
nmtc.def           sendmail 5.x ベース用一般
null-v8.def        sendmail 8.9.x 用 null client
null-v7.def        sendmail 8.8.x 用 null client
null-v6.def        sendmail 8.7.x 用 null client
null-v5.def        sendmail 8.6.x 用 null client
null-v1.def        sendmail 5.x 用 null client
(null client は、全てのメールを特定のホストに送るために利用する)
次に、上記のファイルのうちの 1つを sendmail.def など適当な名前のファイルに コピーし、このファイルを編集します。ここでは、sendmail-8.9.3 をインストール するので、sendmail-v8.def を雛型に用います。
% cp Standards/sendmail-v8.def sendmail.def
% vi sendmail.def
多くのホストで共通な最小限度の設定については doc/INTRO.jpn を、 詳細な設定の説明については doc/MANUAL.jpn を参照し、ファイルを編集します。
主な設定項目を以下に示します。
また、 こちらも参考にして下さい。
また、前述の smtpfeed を利用するには、以下の記述を追加します。 なお、hostname コマンドの出力が FQDN でないときは A=smtpfeed -c $j にします。 P= の部分は smtpfeed のインストールディレクトリを指定します。
LOCALHACKMAILER='# smtp feed mailer\
Msmtpf,   P=/usr/libexec/smtpfeed, F=mDFMuXz, S=11, R=21,\
          T=DNS/RFC822/SMTP, E=\n, L=990,\
          A=smtpfeed'
# hostname が FQDN でないときは A=smtpfeed -c $j に
DIRECT_DELIVER_DOMAINS=none
DEFAULT_RELAY='smtpf:LMTP'
sendmail.def を編集したら、以下のようにして cf ファイルを生成します。
% make sendmail.cf
続いて、作成した sendmail.cf ファイルで sendmail が正常に動作するかどうかを 確認します。以下のようにして sendmail のルールセットモードで試してみます。 以下のように、配信エージェントのルールセット 0 を使用して確認してみます。
# /usr/sbin/sendmail -C sendmail.cf -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter < ruleset > < address >
> 0 sakai@oak.eg.t.kanazawa-u.ac.jp
rewrite: ruleset   0   input: sakai @ oak . eg . t . kanazawa-u . ac . jp
    :
    :
rewrite: ruleset   0 returns: $# local $: sakai
>
動作を確認したら、古い /etc/sendmail.cf ファイルをバックアップして、新しく 作成した sendmail.cf ファイルを /etc 以下にコピーします。
# mv /etc/sendmail.cf /etc/sendmail.cf.old
# cp sendmail.cf /etc/sendmail.cf
以上で sendmail.cf の作成は終了です。

sendmailの起動

準備が整ったので、実際に sendmail を起動します。 以下のように起動します。
# /usr/sbin/sendmail -bd -q30m
-bd はデーモンモードの指定で、-q30m は 30分ごとにキューの中にあるメッセージを 処理させる指定です。
正常に起動するなら、システムのブート時に自動的に sendmail が起動するように します。FreeBSDの場合は、/etc/rc.conf ファイルを以下のように設定します。
sendmail_enable="YES"        # Run the sendmail daemon (or NO).
sendmail_flags="-bd -q30m"   # -bd is pretty mandatory.
他の OS では、例えば Solaris 2.x では、/etc/rc2.d/S88sendmail で、 SunOS では /etc/rc.local で、Linux では /etc/rc.d/init.d/sendmail で 設定します。

POP3

今までの設定で、メールクライアントからのメール送信は可能となりました。 次に、受信をできるようにします。メールサーバに届いたメールをクライアントから 取り込むための仕組みに POP(Post Office Protocol)があります。
POPサーバの代表的なものに qpopper があります。以下のURL
ftp://ftp.qualcomm.com/eudora/servers/unix/popper/
より、最新バージョンの qpopper を入手します。ここでは、 qpopper3.0.2.tar.gz を入手します。入手後、適当なディレクトリで解凍・展開して ディレクトリを移動します。
% tar xvfz qpopper3.0.2.tar.gz
% cd qpopper3.0.2
APOP や RPOP を使わない場合は、以下のようにしてコンパイルできます。
% ./configure
% make
APOPを使う場合は、以下のようにして configure を実行します。
% ./configure --enable-apop --with-apopuid
この場合は、APOPで使われる DBファイル(/etc/pop.auth)にアクセスできる ユーザ pop を作成する必要があります。vipw などで、新規にユーザ pop を 作成します。ログインシェルは不要で、パスワードも '*'としてログイン不可に します。なお、FreeBSDでは、既に、ユーザ pop が作成されています。 /etc/passwd には、以下のような記述があります。
pop:*:68:6:Post Office Owner:/nonexistent:/sbin/nologin
RPOPを使う場合には、configure が終わった後に出来上がった config.h を 編集し、"#define RPOP" を定義します。

コンパイルが終わったら、以下のようにインストールします。 APOP対応でコンパイルした場合は、インストールするバイナリは popper と popauth の 2 つです。
% su
Password:
# install -c -s popper/popper /usr/local/libexec/
# install -c -s -o pop -m 4511 popper/popauth /usr/local/bin/
# cp man/popper.8 man/popauth.8 /usr/local/man/man8/
次に、/etc/services に
pop3                110/tcp
の記述があることを確認します。なければ追加します。
また、popper は inetd から起動されるので、inetd が popper を起動できるように /etc/inetd.conf ファイルに
pop3        stream  tcp     nowait  root    /usr/local/libexec/popper       popper -s
を記述(有効に)します。ここで popper の -s オプションは、syslog 経由でログを残す オプションです。記述したら、以下のようにして inetd を再起動します。
# ps ax | grep inetd
  151  ??  Is     0:00.23 inetd
# kill -HUP 151
APOPで POPサーバに接続できるようにするために、APOPで使用する DBファイル(/etc/pop.auth)を初期化します。以下のように popauth に -init オプションをつけて起動します。
# popauth -init
APOPでアクセスできるユーザは、root で -userオプションを指定して作成するか、 各ユーザ毎に作成します。
# popauth -user sakai    root で作成する場合
% popauth                各ユーザが作成する場合
Changing APOP password for sakai.
New password:
Retype new password:
あとは、APOP対応のメールクライアントからメールが取り込めれば、OKです。

IMAP4

POPは、メールサーバに届いている自分宛てのメールを単純に転送します。 POPの他に、メールを取り込むためのプロトコルとして、 IMAP4(Internet Mssage Access Protocol)があります。 IMAP4はPOPとは違い、読んだメールをクライアント側に取り込まず、サーバ上に 保管します。IMAP4では、メールがサーバ上に残るので、端末側でメールを保存する 必要がなく、複数の端末からサーバ上にある同じメールを読むことができます。 また、メールの本文や Subject を検索する機能もあります。

ここでは、UW IMAP4 Server を導入します。以下のURL
ftp://ftp.cac.washington.edu/imap/
より、最新版の IMAP4 プログラムを入手します。ここでは、 imap-4.7c2.tar.Z を入手します。入手後、適当なディレクトリで解凍・展開して ディレクトリを移動します。
% zcat imap-4.7c2.tar.Z | tar xvf -
% cd imap-4.7c2
コンパイルは、FreeBSDの場合は "bsf"を、SunOS4.x の場合は "sun" を引数に 指定して make するだけです。make の引数に何を指定するかは、Makefile の 先頭部分を参照してください。
% make bsf
コンパイルができたら、以下のようにしてインストールします。
% su
Password:
# install -c -s -m 555 imapd/imapd /usr/local/libexec/
imapd も inetd から起動されますので、その設定をします。まず、/etc/services に
imap            143/tcp
の記述があることを確認します。また、/etc/inetd.conf ファイルに
imap4  stream  tcp     nowait  root    /usr/local/libexec/imapd        imapd
を記述(有効に)します。
記述したら、以下のようにして inetd を再起動します。
# ps ax | grep inetd
  151  ??  Is     0:00.23 inetd
# kill -HUP 151
以上で IMAP4のインストールは終了です。あとは、IMAP4対応のメールソフトを 使用し、設定を IMAP4に対応させて、メールの受信ができることを確認します。

戻る

sakai@oak.eg.t.kanazawa-u.ac.jp
Last modified: Wed Jun 14 23:43:31 JST 2000