メールサーバ構築 | sendmail + Dovecot

10日でおぼえるLinuxサーバーでは、メールサーバの構築をわざと外して執筆をしました。これは理由があってなのですがメールサーバを構築する難しさが一昔前より困難になっているからです。要するに初心者には敷居がかなり高いためです。

現在のメールサーバはスパム対策を意識して作る必要がデフォルトで必須となります。これが難しさの一因となっています。
しかし、メールサーバ構築の方法について切望する方も多いため、今回はsendmail + dovecotで構成する構築方法を案内します。

通常CentOSでメールサーバを導入するというとPostfixがデフォルトで入っています。しかし、昔ながらのsendmailもなかなか負けていません。カスタマイズの柔軟差では歴史的な蓄積がありますので、ここで紹介するのはsendmailにしようと思います。

1.最初の準備(パッケージのインストール)

既にインストールされているPostfixを削除しsendmailをインストールします。
もちろんroot権限でインストールします。

# yum  remove   postfix
# yum  install  sendmail (sendmailメールパッケージ)
# yum install sendmail-cf (sendmialのCF作成ツール関連)

SPF(センダーポリシーフレームワーク)の導入。
# wget http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-10.rhel6.noarch.rpm
# vi /etc/yu.repos.d/city-fan.org.repo

[city-fan.org]
name=city-fan.org repository for Red Hat Enterprise Linux (and clones) $releasever ($basearch)
#baseurl=http://mirror.city-fan.org/ftp/contrib/yum-repo/rhel$releasever/$basearch
mirrorlist=http://mirror.city-fan.org/ftp/contrib/yum-repo/mirrorlist-rhel$releasever
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-city-fan.org

smf-spfのパッケージをインストールします。
# yum –enablerepo=city-fan.org install smf-spf

メールドメインのDNSサーバへSPFの登録

正引きDNSレコードへ追加してください。
# vi xxxxxx.zone
@ IN TXT “v=spf1 mx ~all”

※ ‘-all’と’~all’の指定に注意。チルダの場合は除外メールの場合SPF:failを件名の先頭に追加され、実際には削除されない。
ある一定期間観測してからホワイトリスとを作って登録し、全除外を実行’-all’とするとよいだろう。
ホワイトリスとは/etc/mail/smfs/smf-spf.conf の編集により実現が可能です。

編集が終わったらDNSを再起動。
# service named restart

2.sendmail.mcの編集(sendmailサーバの設定中間ファイル)

sendmailの動作を決めるのはsendmail.cfファイルです。しかしこのファイルは設定が難しいため中間の設定ファイルとしてsendmail.mcを編集します。

# cd /etc/mail
# vi sendmail.mc

(修正する内容だけピックアップします。)
dnl # SMTP_AUTHの設定
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
define(`confAUTH_MECHANISMS’, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
dnl # procmailの設定
define(`PROCMAIL_MAILER_PATH’, `/usr/bin/procmail’)dnl
dnl # spamass-milterを動作させるためのマクロ
define(`confMILTER_MACROS_HELO’, confMILTER_MACROS_HELO`, {verify}’)dnl
dnl # smf-spfでSPFフィルターを実装
INPUT_MAIL_FILTER(`smf-spf’, `S=unix:/var/run/smfs/smf-spf.sock, T=S:30s;R:1m’)dnlFEATURE(`no_default_msa’, `dnl’)dnl
dnl # sendmailのセキュアシェル
FEATURE(`smrsh’, `/usr/sbin/smrsh’)dnl
dnl # 特定ホスト向けのメールを中継するサーバを指定する
FEATURE(`mailertable’, `hash -o /etc/mail/mailertable.db’)dnl
dnl # 仮想ホストの定義
FEATURE(`virtusertable’, `hash -o /etc/mail/virtusertable.db’)dnl
dnl # すでに削除されてしまったアカウント宛のメールに対して、 エラーメールの中に転送先アドレスの案内を含めます。
FEATURE(redirect)dnl
dnl # すべてのヘッダの送信者アドレスに、ホスト名が追加される
FEATURE(always_add_domain)dnl
dnl # 受信すべきドメインの定義を有効
FEATURE(use_cw_file)dnl
dnl # trusted-usersに記述する信頼ユーザ -fを指定してもワーニングを出されない
FEATURE(use_ct_file)dnl
dnl # procmailで配送
FEATURE(local_procmail, `’, `procmail -t -Y -a $h -d $u’)dnl
dnl # smtp接続(リレー)許可設定
FEATURE(`access_db’, `hash -T -o /etc/mail/access.db’)dnl
dnl # access_dbに受取らない設定をすることが出来ます。
FEATURE(`blacklist_recipients’)dnl
dnl # Submission Port(587)の設定
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea’)dnl
dnl # 25番ポートでの受信設定
DAEMON_OPTIONS(`Port=smtp, Name=MTA’)dnl
dnl # ローカルドメインでの受信有効
LOCAL_DOMAIN(`localhost.localdomain’)dnl
dnl # RBLで受信拒否
FEATURE(dnsbl,`all.rbl.jp’,`”554 Rejected ” $&{client_addr} ” found in all.rbl.jp”‘)dnl
dnl # 最大受信メッセージ容量(バイト)
define(`confMAX_MESSAGE_SIZE’,`10485760′)dnl
dnl # 1メール受信で最大50の受信者指定が可能
define(`confMAX_RCPTS_PER_MESSAGE’, `50′)dnl
dnl # バージョン情報をunknownに変更する
define(`confSMTP_LOGIN_MSG’,`unknown’)dnl
dnl # メールヘッダーに展開する際にバージョン情報をunknownに変更する
define(`confRECEIVED_HEADER’,`$?sfrom $s $.$?_($?s$|from $.$_)
$.$?{auth_type}(authenticated)
$.by $j (unknown)$?r with $r$. id $i$?u
for $u; $|;
$.$b’)dnl

sendmail.mcからsendmail.cfを作成

# make sendmail.cf
# make install-cf
以上でsendmail.cfとsubmit.cfがインストールされます。

submit.cf
sendmail 8.12では、25/TCPでメールを待ち受けるMTAと、MSA(Message submission agent)の機能が分離されました。
MSAとはローカルからのメールを587/TCPで待ち受ける特殊なMTAで、メール送信(投稿)のための構成要素です。
submit.cf はMSA のための設定ファイルで、メッセージの情報が不足していたり、形式が不完全であった場合にメッセージ形式を整形してからMSAは配送処理を行います。
標準では、/usr/bin/mailのようなMSP(ローカルホストからメールを送るプログラム)はsendmailのバイナリを実行しますが、 その際にMSAと通信してメールを送ります。
MSAはMSPから送信されたメールを受け取り、MTAに渡す機能を果たします。

受信ドメインの設定
複数のドメインを受信する場合もここ書きます。後はアカウント単位で設定をvirtusertableに書けば簡単にマルチドメイン
対応が可能です。

# vi local-host-names
xxxxxxx.com

強制受信つまりWhitelist
自分のサーバがチェックが厳しくて弾き返すなら、強制受信を以下のように行います。
# vi access
Connect:sakura.ne.jp OK
Connect:nifty.com OK
Connect:biglobe.ne.jp OK

sendmailの起動

# service sendmail start

アカウント作成はお好みで/etc/passwd,shadowでアカウントを作り、認証はsaslauthdデーモンで行います
巷のネットにあるサーバ構築情報には間違いが多くsaslauthdとauxpropをごちゃ混ぜにして説明しているサイトが多いですが
/etc/passwd使うならsaslauthdデーモンを利用します。

# /etc/sasl2/Sendmail.conf
pwcheck_method:saslauthd
mech_list: plain login cram-md5 digest-md5

# yum install cyrus-sasl # service saslauthd start
dovecotが入っている場合はdovecotも再起動してください。
# service dovecot restart

Imap – Dovecotの設定

まず最初にdovecotをインストール
# yum install dovecot
# service dovecot start

今回はシンプルな/etc/passwdで認証する方法をご紹介する。大勢のアカウントが無い、精々20人程度ならそんなもんでいいでしょう。

#cd /etc/dovecot

dovecot.confを編集します。
特にpopは必要ないでしょう。下記のようにします。
protocols = imap imaps

次に詳細を設定します。
# cd /etc/dovecot/conf.d

修正するファイルは以下の通り。
10-auth.conf
10-mail.conf
10-master.conf
10-ssl.conf
auth-system.conf.ext

1.
# vi 10-auth.conf
2カ所修正。

auth_mechanisms = plain login
include auth-system.conf.ext

2.
# vi 10-mail.confmbox_write_locks = fcntl

mail_location = maildir:~/Maildir
mbox_write_locks = fcntl

3.
# vi 10-master.conf

service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}

}

4.
あらかじめ証明書は作っておいてくださいね。

# vi 10-ssl.conf
ssl = yes

ssl_cert =”xxxxxxxxx.crt”

ssl_key =”xxxxxxxxx.key”

ssl_key_password = “xxxxxxxxxx”

# vi auth-system.conf.ext

passdb {
driver = pam
# [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=]
# [cache_key=] []
#args = dovecot
}

userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
driver = passwd
# [blocking=no]
#args =
}

# service dovecot restart

アカウント作成とパスワード設定
# useradd username
# passwd username