postfixとdovecotでメールサーバーを作る。ついでに意識高い系SSL設定。

Linux

ブログサーバーをお名前VPSからConoHaに移行したのに合わせて、同じサーバーで動かしていた独自ドメインメールサーバーをIDCFクラウド(ワンコインサーバー)に移設しました。

メールサーバー作るぞ

前回メールサーバー作ったのが、お名前VPSでブログ上げた時ですから、かれこれ2年半くらい前です。2年も経てば、何か新しいソフト出てるかなぁ、と思ったら、やっぱりまだpostfix+dovecot現役なんですねぇ。別のものを試したかった気もしないではないです。

とは言え、まずはメールサーバーとして動かすのが最優先ですので、移設しました。ちょっとだけ、SSL設定で「意識の高さ」をアピってみる(苦笑)。

目標。

  • postfixでメールサーバーを作る。認証系は可能な限りdovecotと同期させ、管理の手間を省く。SMTPS(submission)対応を行う。
  • dovecotでIMAPサーバーを作る。認証系は可能な限りpostfixと同期させる。IMAPS対応を行う。
  • OS環境はubuntu。
  • iPhoneからメール送受信ができること。

IMAP/SMTPで使うサーバー証明書を作る

はい、ここで楕円曲線暗号を使います。基本、そんなに古いクライアントで使うことも無いので、問題無いはずです。手順としては、前回Webサーバー用に作った時と同じですが、面倒なので自己署名してしまいます。

まずは作業ディレクトリを作り、楕円曲線暗号鍵の秘密鍵を生成します。パラメータはWebサーバーでの実績からsecp384r1を指定します。

% mkdir ~/ssl ; cd ~/ssl
% openssl ecparam -out mail.ayurina.net.key -name secp384r1 -genkey

次にCSRを作ります。特段指定するパラメータに気を使うことはありませんが(どうせ自己署名してしまうので、警告はされますから)一応、コモンネーム=FQDNくらい、正しいものにしておきます。

% openssl req -new -sha256 -key mail.ayurina.net.key -nodes -out mail.ayurina.net.csr

このCSRに、先程作った秘密鍵で自己署名してしまいます。これで自己署名証明書完成です。

% openssl x509 -in mail.ayurina.net.csr -days 3650 -req -signkey mail.ayurina.net.key > mail.ayurina.net.crt

できた証明書は、postfixのSMTPSとdovecotのIMAPSの両方で使うため、ubuntu標準のキーストアっぽいフォルダに放り込んでおきます。

% sudo cp mail.ayurina.net.key /etc/ssl/private
% sudo cp mail.ayurina.net.crt /etc/ssl/certs

これで証明書の準備は完了です。証明書の中身が気になる場合は、「openssl x509 -text」辺りで確認しましょう。

postfixを設定する

まずはpostfixをインストールします。

% sudo apt-get install postfix

インストール時に、メールサーバーの基本的な設定を聞かれますので、インターネットメールサーバーとして、ドメインはホスト名+ドメイン名を設定します。

ubuntuのpostfixパッケージでは、main.cfがかなりシェイプアップされた形でインストールされていますので、必要な設定を追加・修正していくことになります。よく分からなくなったら、「postconf」コマンドでデフォルトも含めた設定が一覧できます。

修正箇所は以下のような感じです。

まず、SSL関連。既に記載されている証明書ファイルのパスを、上で作った自己署名証明書ファイルのパスに書き換えます。

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/mail.ayurina.net.crt
smtpd_tls_key_file=/etc/ssl/private/mail.ayurina.net.key
smtpd_use_tls=yes

続いて、最も肝心な設定、ドメイン関連の設定です。

myhostname = hostname
mydestination = $myhostname, ayurina.net, ... localhost

myorigin等の設定も確認して、意図したドメインのメールが受信されること、ヘッダ等に表示されるFQDNが実名になっていること(※DNSで引けることが重要)を確認します。これ基本中の基本なんですが、意外に忘れてハマります。

ここまでがメールサーバーとしての基本的な設定ですが、ここから追加設定を入れます。

まずはSPAM対策として、RBLを見るようにしておく設定。

smtpd_client_restrictions =
    reject_rbl_client zen.spamhaus.org
    reject_rbl_client all.rbl.jp
    reject_non_fqdn_sender
    reject_unknown_sender_domain
smtpd_sender_restrictions =
    reject_rhsbl_sender zen.spamhaus.org
    reject_unknown_sender_domain

続いて、SASL関連。今回は個別のSASLモジュールではなく、dovecotのSASLを使います。

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes

最後に、maildirの設定。本当はdovecotのLMTPあるいはローカルセンダーを使っても良かったのですが、ちょっとだけ妥協。「.maildir/」は長年の趣味の設定です。一般にはMaildirにするのかな、やっぱり。

home_mailbox = .maildir/

これでmain.cfは完了。続いて、master.cfを書き換えます。submissionの行をコメントインするだけです。一部変数の指定が良く分からなかったところはコメントアウトしておきます(mua_client_restrictions等)。基本的には、permit_sasl_authenticatedが入っていれば大丈夫なはずです。

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

これでpostfixは設定完了です。systemctl restart postfixして、statusでエラー等出ていないかを確認します。この時点でlocalhostからのSMTP送信試験(telnet localhost smtp)はできますので、動作確認をしておきます。

dovecotを設定する

続いてdovecotをインストールします。

% sudo apt-get install dovecot-imapd

dovecotには1.X系と2.X系があって、新しいのは2.X系で、基本2.X系(ウチは2.2)が入ります。設定ファイルが分割されて見通しが悪いのが玉に瑕ですが、こちらもdoveconfコマンドで設定を確認することが可能です。パッケージがプロトコル・モジュール毎になっていて、一瞬面食らいますが、慌てない。/usr/share/dovecot/protocols.d/*.protocolってファイルを各々読み込むようです。

設定ファイルは/etc/dovecot/conf.d以下にあります。

まずはSSLの設定を10-ssl.confで設定。postfixと同じ自己署名証明書を指定します。

ssl = yes
ssl_cert = </etc/ssl/certs/mail.ayurina.net.crt
ssl_key = </etc/ssl/private/mail.ayurina.net.key

続いて10-master.confで、imapsの設定と、saslの設定を行います。

  inet_listener imaps {
    port = 993
    ssl = yes
  }
...
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

この、unix_listenerのところですが、postfixもアクセスに来るので、user/groupを指定しておきます。

続いて10-mail.confでは、maildirの指定です。postfixと同じフォルダにしておきます。

mail_location = maildir:~/.maildir

最後に、一番大事な認証系です。ユーザー認証は、UNIX認証ではなく、メール用の個別認証にしておきたいので、passwdfileを使います。あと、これは気分の問題として、CRAM-MD5を有効化します。

auth_mechanisms = plain cram-md5
...
!include auth-passwdfile.conf.ext

ここで読まれるauth-passwdfile.conf.extを見ると分かりますが、ユーザー情報は「/etc/dovecot/users」に配置することになります。このファイルの形式ですが、「ユーザー名(メールアドレス):パスワード:UID:GID:(shell):HOME」という形のテキストです。

パスワード部は、doveadmコマンドで生成して作成します。

% doveadm pw -s CRAM-MD5

出力される「{CRAM-MD5}(暗号化文字列)」をすべてパスワード項に記載します。最後に、この/etc/dovecot/usersを、dovecotのプロセスユーザー(dovecot)からしかアクセスできないよう、chown&chmodして完了です。

再起動を忘れずに・・・systemctl restart dovecot

ネットワークを開ける

今回のサーバーはIDCFクラウドなので、Firewallとポートフォワーディングの設定が必要です。実際、開ける(フォワードする)必要があるのは、以下の3つのポートです。

  • TCP/25 smtp・・・メールを外部から受信するために使います。
  • TCP/587 submission・・・メールをクライアントから送るために使います。
  • TCP/993 imaps・・・メールをクライアントから受信する(メールボックスにアクセスする)ために使います。

この3つだけで充分です。

ここまで来れば、DNS設定でメールサーバーの向き先を変えてしまって問題無いです。DNSの反映には結構時間がかかるので、気長に待ちましょう(私は、事前にTTL落としておきました)。あと、メールボックス(フォルダ)のコピーも、そのまま持ってきてしまって問題ありません(私はrsyncでコピーしちゃいました)。フォルダ構造は変わらないので問題無く過去メールも読めます。

iPhoneからメールサーバーを使う

これでメールサーバーができたので、iPhoneから設定して使います。このとき、iPhoneというか、メールクライアントの設定でちょっとポイントがあります。

普通にメールアカウントを設定すると、その時点の疎通試験でNGになると思います。これはSSLでの接続が初期設定の段階ではできないためです。一度アカウントを設定したあとで、アカウント設定を再度開き、「詳細」へ行き、「受信設定」の「SSLを使用」をオンに、そして認証を「MD5チャレンジ応答」に変更します。SMTPサーバーの方にも、SSLと認証の設定がありますので、同じく設定します。

これで、SMTPS(submission)とIMAPSで通信が可能になり、メールサーバーが使えるようになります。当然ながら、iPhoneは楕円曲線暗号証明書に対応していますので、SSL通信も問題無く使えます。

あとは適当に、送受信試験して、完成です。

やっぱりメールサーバーは難しい

という訳で、久しぶりにメールサーバー作ったので備忘録でした。楕円曲線暗号証明書がちゃんと使えて良かった。あとdovecotのSASL使うってのが今回新しかったです。

久しぶりでしたが、基本的なところは変わってなくて、もう慣れたところと、やっぱり難しいところと、半々って感じですね。どこまで行っても、やっぱりメールサーバーってまだまだ個別に作るとなると難しいのかなぁ、と思います。

今後の予定として、spamassasinとclamavとsieveは設定しようかなと思っていますが、それほど流量のあるサーバーでも無いので、オイオイで良いかな、と。まずは無事移設できて良かったです。

コメント

タイトルとURLをコピーしました