メールサーバーの構築(sendmail)

1.なぜsendmailか

sendmailはインターネット上で最もシェアの高いMTAで、アメリカのSendmail社が開発元です。企業が開発を行っていますが、フリーウェアですので無料で使用可能です。sendmailは柔軟かつ強力なMTAで、メインの設定ファイルを正しく設定すればメールに関するほとんどのことが実現可能です。
しかし、かつてsendmailはroot権限で動作していたためセキュリティーホールが見つかった場合に重大な問題に発展する可能性がありました。またメール配送自体もそれほど高速ではないため、大規模なメーリングリストを運用したり、大量にメール配送するには不向きです。
最近では、メール爆弾、スパムメールといった犯罪、または犯罪として認定されつつある行為に利用されてしまうことになります。このようなメールの中継ホストとして利用されると、他のホストやユーザーに大変な迷惑をかける上、サーバーやネットワークのリソースを利用されてしまいます。また、サーバーの所属する組織と管理者の信用を著しく失墜させることになります。管理し切れない方は素直にqmailかpostfixを使用する事をお薦めします。
しかし、sendmailに付随する各種メールに関するソフトはsendmailを基本に作られていることが多く、またfreeBSDではインストール時から稼働しておりroot宛にいろいろなメールも届きます。ここは素直にsendmailを引き続き使用する事にします。

2.インストールの前に

最初からFreeBSD4.6をインストールした場合はsendmail-8.12.2がデフォルトで入っています。
8.12.2であればそれほど問題有りませんが、FreeBSD4.5以前をインストールしてある場合は8.11あたりですのでバージョンアップした方が無難でしょう。

FreeBSD4.5以前の方はまずユーザーを追加しなければなりません。
以前は全てrootで動いていましたが、8.12以降はsmmspというユーザーに一部変更されています。

ユーザー追加(FreeBSDが4.5以前の場合)
adduserで追加できますが、今回はいきなりmaster.passwdを編集して反映して見ます。
/etc/master.passwdに追加
smmsp:*:25:25::::Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
mailnull:*:26:26::::Sendmail Default User:/var/spool/mqueue:/sbin/nologin
ファイルを編集しただけでは反映されないので以下のコマンドを実行します。
# pwd_mkdb /etc/master.passwd
# pwd_mkdb -p /etc/master.passwd
これでsmmspとmailnullユーザーが追加されました。
引き続きsendmailのバージョンを上げましょう!

3.インストール

sendmailは何かとセキュリティーホールで騒がれますので、常に最新版にできるよう、ソースから入れて見ます。
最新版はhttp://www.sendmail.org/にありますのでダウンロードして下さい。
ダウンロードしたら解凍、コンパイル、インストールと進めます。
$ cd /usr/local/src
$ tar xvzf sendmail.8.12.5.tar.gz
$ cd sendmail-8.12.5
$ sh ./Build
$ su
# sh ./Build install

4.CFファイル生成&設定

sendmail.cfを作るのにCFをいうツールが有りますが、CFは8.9までしかサポートされていませんのでsendmailに付属している
mcファイルを使用して生成します。
8.12からはsendmail.cfだけでなくローカルの発信用にsubmit.cfを使用する為、2つのcfファイルを生成します。
まずはオリジナルのFreeBSD用mcファイルをコピーします
# cd /usr/local/src/sendmail-8.12.5/cf/cf
# cp generic-bsd4.4.mc sendmail.mc

次にsendmail.mcとsubmit.mcを編集します
sendmail.mc
# 最初から有り変更しない
divert(-1)
divert(0)
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.29 2003/12/24 21:15:09 gshapiro Exp $')
OSTYPE(freebsd5)
DOMAIN(generic)
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')

# ホストにメールを送るのに必要
FEATURE(`access_db', `hash -T<TMPF> /etc/mail/access')dnl

# 自分でDNSの登録を忘れていた時に文句を言われないため
FEATURE(`accept_unresolvable_domains')dnl

# PCから外部へメールを送るのは転送になるので必要
FEATURE(`relay_mail_from')dnl

# uucpは使っていないので
FEATURE(`nouucp',`reject')dnl

# ここからはmajordomoを動かす場合
FEATURE(`allmasquerade')
FEATURE(`always_add_domain')
FEATURE(`limited_masquerade')
FEATURE(`masquerade_envelope')
EXPOSED_USER(`root')
MASQUERADE_AS(`$m')
# ここまで

# デフォルトでIPv6があるのでとりあえずコメントアウトする
DAEMON_OPTIONS(`Name=IPv4, Family=inet')
#DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O')

# ドメイン名指定
define(`confDOMAIN_NAME',`server.hogehoge.org')dnl

# これがないとローカルスプールのロックができなくてメールが受け取れません
define(`LOCAL_MAILER_PATH', /usr/libexec/mail.local)dnl
define(`LOCAL_MAILER_FLAGS', LOCAL_MAILER_FLAGS`'SP)dnl

# RELAY制限
MAILER(local)dnl

# これがないと動きません
MAILER(smtp)dnl

submit.cf
# 最初から有る物、変更なし
divert(-1)
divert(0)dnl
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.submit.mc,v 1.1 2003/10/19 00:03:13 gshapiro Exp $')
define(`confCF_VERSION', `Submit')dnl
define(`__OSTYPE__',`')dnl dirty hack to keep proto.m4 from complaining
define(`_USE_DECNET_SYNTAX_', `1')dnl support DECnet
define(`confTIME_ZONE', `USE_TZ')dnl
define(`confDONT_INIT_GROUPS', `True')dnl
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')dnl
FEATURE(`msp', `[127.0.0.1]')dnl

# ローカルスプールに書き込むプログラムの実行ユーザを smmsp に指定しておきます
define(`confRUN_AS_USER', `smmsp')
# メーリングリスト使用の場合TRUSTEDも指定する
define(`confTRUSTED_USER', `smmsp')

# ここからはmajordomoを動かす場合
FEATURE(`allmasquerade')
FEATURE(`always_add_domain')
FEATURE(`limited_masquerade')
FEATURE(`masquerade_envelope')
EXPOSED_USER(`root')
MASQUERADE_AS(`$m')
# ここまで

編集できたらCFファイルを生成します
# make sendmail.cf
# make submit.cf

エラーが無ければ正規の場所にコピーします
# cp sendmail.cf /etc/mail/
# cp submit.cf /etc/mail/
make install でもいくかもしれませんね
submit.cfはsmmspが使うのでパーミッションを以下のように設定します
-rw-r--r--  1 root   wheel  53735 Jul 29 22:51 sendmail.cf
-r--r--r--  1 smmsp  smmsp  39902 Jul 29 22:56 submit.cf

このままでは、誰もリレーできない為、宛て先がサーバー内でないと送信できません。
外部にメールを送る作業を「リレー」と言いますが、このリレーを許可する必要があります。
スパムメールなど外部に迷惑をかける可能性がある為、最初はローカル内のみ送信可能にしておきましょう。
IPを書き込むファイルは/etc/mail/access.dbですが編集するのは/etc/mail/accessです
/etc/mail/access
127.0.0.1 RELAY
192.168 RELAY
127.0.0.1は無くても動くと思いますが一応入れておきました。
編集したらaccess.dbに反映しなければならないので以下のコマンドを実行します
# makemap hash /etc/mail/access.db < /etc/mail/access
これでローカルIPはリレーできるようになります。

また、smmspユーザーがspoolの下に有るclientmqueueディレクトリーを使用するのでパーミッションを変更します
drwxrwx--- 2 smmsp smmsp 512 Jul 30 20:01 clientmqueue

5.起動

8.12からはsendmail.cfとsubmit.cfを2つあるのでいつも通りの/etc/rc.confで起動設定ではうまく動かないかもしれませんので起動シェルを作成します。
/usr/local/etc/rc.d/sendmail.sh
#!/bin/sh
case "$1" in
start)
        /usr/sbin/sendmail -L sm-mta -bd -q15m
        /usr/sbin/sendmail -L sm-msp-queue -Ac -q15m
        ;;
stop)
        kill `head -1 /var/spool/clientmqueue/sm-client.pid`
        rm -f /var/spool/clientmqueue/sm-client.pid
        echo -n " sendmail-smclient stopped. "
        kill `head -1 /var/run/sendmail.pid`
        rm -f /var/run/sendmail.pid
        echo -n " sendmail-mta stopped. "
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

exit 0

よってrc.confでは起動しないようにします
/etc/rc.conf
sendmail_enable="NONE"

これで今走っているデーモンをkillして上記シェルを走らせればOKです。
パーミッション関係でエラーしていることがあるかもしれませんのでうまく動かない時は
/var/log/maillog
を見て何処でエラーしているか確認するといいでしょう。

6.qpopperのインストール

sendmailが動いているだけでは送信は可能ですがメールをメーラーで取り込めません。
メールを取り込むにはPOPサーバーとして動かなければなりません。
POPにはqpopperを使用します。
こちらはパッケージで入れて見ます。
# pkg_add -r qpopper

7.qpopperの設定

POPサーバーは普段からデーモンが走っている必要はあまりないので、inetdで起動するようにします。
/etc/inetd.confに追加
pop3 stream tcp nowait root /usr/local/libexec/qpopper qpopper

次にユーザー登録をしますが、これはtelnetで登録します。(FreeBSD5.4では必要有りませんでした)
# telnet localhost pop3
trying 127.0.0.1...
Connected to localhost.hogehoge.net
Escape character is '^]'.
+OK QPOP (version 4.0.4) at chaco.hayagui.com starting.
user hogeuser ←ユーザー名入力
+OK Password required for miyakoshi.
pass hogepass ←パスワード入力
+OK kenz has 0 visible messages (0 hidden) in 0 octets.
quit ←終了の入力
+OK Pop server at chaco.hayagui.com signing off.
Connection closed by foreign host.

あとはクライアントマシンからpop3でアクセスすればメールを受信することができます。

8.APOPの設定

POPそのままではユーザーパスが平文で流れるのでとても危険です、暗号化するAPOPを導入して見ます
まずは初期化します
# qpopauth -init
エラーが出る場合は
/usr/local/etc/qpopper
のディレクトリーを作成して下さい

次にユーザー登録をします
# qpopauth -user ユーザー名
Adding only APOP password for ユーザー名.
New password:(ここでパスを打ち込みます)
Retype new password:(もう一度パス入力)
#

あとはクライアントマシンからAPOPでアクセスすればメールを受信することができます。