NetBSDでメールサーバを作ってみる

NetBSD/i386 6.1.2にはPostfix 2.8.13が含まれており、SMTP認証にはIMAP/POP3サーバのDovecotが使えるので、パッケージでDovecot 2.2.9をインストールして、メールサーバを作ってみた(Postfixのバージョンはpostconf mail_versionで、対応している認証モジュールはpostconf -aで確認できる)。

DNSサーバの設定

DNSサーバには予めメールサーバのホスト名をMXレコードに登録しておく必要がある。既に登録されていれば必要は無い。以下はBINDのゾーンファイルの該当部分の定義例。ns.bar.comと言うホスト名のメールサーバのIPアドレスが216.66.87.11で、smtp.bar.comやimap.bar.com、pop.bar.comとしても参照出来るように定義されている。

                IN      MX 0    ns.bar.com.
ns              IN      A       216.66.87.11
smtp            IN      CNAME   ns.bar.com.
imap            IN      CNAME   ns.bar.com.
pop             IN      CNAME   ns.bar.com.

メールを受信できるようにする

Postfixの設定ファイル /etc/postfix/master.cfでsmtpの受信を行えるように「smtp inet n - n - - smtpd」のコメント化を解除する。

smtp      inet  n       -       n       -       -       smtpd

ホスト名を含まないドメイン名でのメール受信を行う

Postfixの設定ファイル /etc/postfix/main.cfで受信するメールのドメイン名をmydestinationのコメント化を解除して設定する。

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

ホスト名を含まないドメイン名でのメール送信を行う

Postfixの設定ファイル /etc/postfix/main.cfで送信するメールのドメイン名をmyoriginのコメント化を解除して設定する。

myorigin = $mydomain

他ホストからのメール送信を禁止する

Postfixの設定ファイル /etc/postfix/main.cfでメール送信を許可する範囲をmynetwork_styleのコメント化を解除して設定する。

mynetworks_style = host

Dovecotのインストール

Dovecotのバージョン2系をpkg_addコマンドでインストールして、起動スクリプトを/usr/pkg/share/examples/rc.d/dovecotから/etc/rc.d/dovecotパーミッション 755(最初から755になっている模様)でコピーし、/etc/rc.confにdovecot=YES dovecot_fdlimit=1024を追加して自動起動するように設定する。

pkg_add ftp://ftp7.jp.netbsd.org/pub/pkgsrc/packages/NetBSD/i386/6.0_2013Q4/All/dovecot-2.2.9.tgz
cp /usr/pkg/share/examples/rc.d/dovecot /etc/rc.d/
echo 'dovecot=YES dovecot_fdlimit=1024' >> /etc/rc.conf

初期状態ではSSLが有効になっているのにサーバ証明書秘密鍵の設定が無い為、SSLを無効にするか有効にするまで起動できない。

IMAP/POP3サーバのSSLを無効にする

Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-ssl.confでSSLを無効にするために「ssl = no」のコメント化を解除する。

ssl = no

IMAP/POP3サーバのSSLを有効にする

OpenSSLの設定ファイル /etc/openssl/openssl.cnfが無ければ/usr/share/examples/openssl/openssl.cnfからコピーして、OpenSSLで自己署名したサーバ証明書 /etc/openssl/certs/dovecot.pemと秘密鍵 /etc/openssl/private/dovecot.pemを都道府県とグループ名、メールサーバのホスト名を指定して作成する。

cp /usr/share/examples/openssl/openssl.cnf /etc/openssl/
openssl req -new -x509 -nodes -out /etc/openssl/certs/dovecot.pem -keyout /etc/openssl/private/dovecot.pem -subj /C=JP/ST=Tokyo/O=BAR/CN=ns.bar.com

Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-ssl.confでSSLを有効にするために「ssl = no」をコメント化する。

#ssl = no

Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-ssl.confにサーバ証明書ssl_certと秘密鍵ssl_keyをコメント化を解除して記述が間違っている「=」を「=<」に書き換える。

ssl_cert =< /etc/openssl/certs/dovecot.pem
ssl_key =< /etc/openssl/private/dovecot.pem

IMAP/POP3サーバのメールボックスをmbox形式にする

NetBSD/i386 6.1.2のPostfixはデフォルトでメールボックスがmbox形式になっているが、DovecotはデフォルトでMaildir形式になっているのでメールが受信できない。
Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-mail.confでメールボックスの形式をmail_locationのコメント化を解除して設定する。

mail_location = mbox:~/mail:INBOX=/var/mail/%u

SMTP認証の設定

Postfixの設定ファイル /etc/postfix/main.cfでSMTP認証を行うためにsmtpd_sasl_auth_enableにyes、Dovecotで認証を行うためにsmtpd_sasl_typeにdovecotDovecot側と同じパスをsmtpd_sasl_pathでパス(/var/spool/postfix以下)を指定して、他ホストからの認証を受け付けないようにsmtpd_recipient_restrictionsを設定、これらを追記する(Windows 98Outlook Express等に対応したい場合はbroken_sasl_auth_clients = yesも追記する)。

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-master.confでPostfixからSMTP認証できるように「unix_listener /var/spool/postfix/private/auth {」から「{」までのコメント化を解除してPostfix側で指定したパスとパーミッション、オーナー名、グループ名を設定する。

  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = wheel
  }

SSL接続でSMTP認証を使うための設定

Postfixの設定ファイル /etc/postfix/main.cfでSSLでもSMTP認証を使うためにsmtpd_tls_security_levelでmayを指定、サーバ証明書をsmtpd_tls_cert_fileで設定、秘密鍵をsmtpd_tls_key_fileで設定して、これらを追記する。

smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/openssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/openssl/private/dovecot.pem

SMTP認証でサブミッションポートを使えるようにする

Outbound Port 25 Blocking(OP25B)が実施されたプロバイダばかりの現状では必須だと思う。
Postfixの設定ファイル /etc/postfix/master.cfでサブミッションポートを使えるように「submission inet n - n - - smtpd」と続く「 -o」で始まるオプションのコメント化を解除する。

submission inet n       -       n       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

SMTP認証でSSL接続を使えるようにする

Postfixの設定ファイル /etc/postfix/master.cfでSSL接続を使えるように「smtps inet n - n - - smtpd」と続く「 -o」で始まるオプションのコメント化を解除する。

smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Outlook Express等の送信時LOGIN認証と受信時平文認証に対応する

Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-auth.confでLOGIN認証を使えるようにauth_mechanismsにloginを追記する。

auth_mechanisms = plain login

Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-auth.confで平文認証を使えるようにdisable_plaintext_authのコメント化を解除してnoを指定する。

disable_plaintext_auth = no

迷惑メール対策をSelective SMTP Rejection (S25R)方式で行う

Postfixの設定ファイル /etc/postfix/main.cfにブラックリストホワイトリスト、その他のフィルタを参照して動作する設定を追記する。

smtpd_client_restrictions =
  permit_mynetworks,
  check_client_access regexp:/etc/postfix/white_list,
  check_client_access regexp:/etc/postfix/rejections

smtpd_helo_required = yes

smtpd_helo_restrictions =
  permit_mynetworks,
  reject_invalid_hostname,
  check_helo_access regexp:/etc/postfix/helo_restrictions

smtpd_sender_restrictions =
  permit_mynetworks,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain

ホワイトリスト /etc/postfix/white-list.txtはホワイトリスト情報からwhite_listの名前でダウンロードする。必要に応じて適切に修正する。

wget -O /etc/postfix/white_list http://www.gabacho-net.jp/anti-spam/white-list.txt

ブラックリスト /etc/postfix/rejectionsは阻止率99%のスパム対策方式の研究報告の付録A. Postfixでの設定方法にある/etc/postfix/rejectionsファイルの中身をコピーして作成する。必要に応じて適切に修正する。今回は以下の手順で前述のサイトより抜き出した。

wget http://www.gabacho-net.jp/anti-spam/anti-spam-system.html
sed -n -e '/^\/etc\/postfix\/rejections/,/^\/etc\/postfix\/helo_restrictions/p' anti-spam-system.html | sed -e '1,/^<TD /d' -e '/<\/TD>/,$d' -e 's/^<PRE>//' -e 's/&lt;/</g' -e 's/&gt;/>/g' > /etc/postfix/rejections

その他のフィルタ /etc/postfix/helo_restrictionsも阻止率99%のスパム対策方式の研究報告の付録A. Postfixでの設定方法にある/etc/postfix/helo_restrictionsファイルのサンプルをコピーして作成する。必要に応じて適切に修正する。サンプルは見ての通り、すべてコメントなので空のファイルをtouch /etc/postfix/helo_restrictionsで作成しても良いかと思う。

# Illegal HELO command blocking specification
# Provided that your mail server's IP address is 223.12.34.56 and its
# acceptable domain name is "example.com", specify as follows:
#
#/^223\.12\.34\.56$/                            REJECT
#/^(.+\.)?example\.com$/                        REJECT

S25R方式で検出された迷惑メールのログを確認する

メールのログ /var/log/maillog からS25R方式で検出された迷惑メールを抽出するために拒絶ログソーティングスクリプトシェルスクリプトコードを適当なディレクトリに実行権限を付けて配置する。CGIとしても動作する。
NetBSD/i386 6.1.2には上記スクリプトで使われているgawkが入っていないので、パッケージでgawkをインストールする。

pkg_add ftp://ftp7.jp.netbsd.org/pub/pkgsrc/packages/NetBSD/i386/6.0_2013Q4/All/gawk-4.1.0nb1.tgz

また、NetBSD/i386 6.1.2では古いmaillogは圧縮されているので「cat /var/log/maillog.1 /var/log/maillog」とある箇所を「zcat /var/log/maillog.1.gz | cat - /var/log/maillog」に置き換える。今回は以下の手順で前述のサイトより抜き出した。

wget http://www.gabacho-net.jp/anti-spam/log-sorting-script.html
sed -e '1,/^<TD>/d' -e '/<\/TD>/,$d' -e 's/^<PRE>//' -e 's/&lt;/</g' -e 's/&gt;/>/g' -e 's/cat \/var\/log\/maillog\.1/zcat \/var\/log\/maillog\.1\.gz | cat -/' log-sorting-script.html > log-sorting.cgi
chmod +x log-sorting.cgi

このスクリプトを定期的に実行すれば、表示される内容を参考にホワイトリストブラックリスト、その他のフィルタを適切に書き換えることが出来る。

その他

Dovecotで認証が上手く通らない場合はDovecotのログファイル /var/log/dovecot_debug.logを確認する。デフォルトではログファイルが作成されないので、Dovecotの設定ファイル /usr/pkg/etc/dovecot/conf.d/10-logging.confのdebug_log_pathでログファイル出力先を指定、auth_debugとmail_debugとverbose_sslにyesを指定して再起動する。

debug_log_path = /var/log/dovecot_debug.log
auth_debug = yes
mail_debug = yes
verbose_ssl = yes