この章では、メールサーバーソフトウェアのPostfixとDovecotを設定するとともに、基本的な使い方を説明します。
メールサーバー
Gmail や Outlook.com みたいなWebメールサービスの普及もあり、最近は自分でメールサーバーを構築する必要もなくなってきているように思います。しかし、あえて自分でメールサーバーを構築することで、メールの仕組みやセキュリティの理解を深めることができます。
というわけで、本章ではメールサーバーを構築してみます。
エージェント
メールサービスは複数の「エージェント」と呼ばれるソフトウェアが連携することで成り立っています。主なエージェントは次の4つです。
- MUA(Mail User Agent)
- MTA(Mail Transfer Agent)
- MDA(Mail Delivery Agent)
- MRA(Mail Retrieval Agent)
ここでメールの送信から受信までの流れとエージェントの関係を下図に示します。
説明としては次のようになるでしょうか。
まず、送信する人はMUAを使ってメールを送信します。MUAは、例えば Thunderbird のような電子メールクライアント(メールソフトやメーラーとも言う)のことですね。
それから、MUAはMTAにメールの転送を依頼します。この時に使う通信プロトコルがSMTPです。メールはMTAからMTAへと伝わっていき、いつかは終点のMTAに配送されます。配送されたメールはMDAによってユーザーのメールボックスに保存されます。
最後に、受信する人はMUAを使ってメールボックスに届いたメールをMRAから受信します。この時に使う通信プロトコルがPOP3やIMAPです。
本章で扱うPostfixはこのうちのMTAとMDAに、そしてDovecotはMRAにあたるものです。
PostfixとDovecot
それではPostfixとDovecotをセットアップしていきましょう。
インストール
はじめにPostfixをインストールします。
sudo apt install postfix
インストール時のダイアログは「設定なし」でOKです。
続いてDovecotをインストールします。
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d
Dovecotで使うプロトコルにあわせてパッケージをインストールしていることに注意しましょう。つまり、IMAP用に dovecot-imapd
を、POP3用に dovecot-pop3d
をインストールしているわけですね。
Postfix 最小限の設定
Postfixのメイン設定ファイルは /etc/postfix/main.cf
ですが、インストール時に「設定なし」を選ぶとこれは作られません。おそらくサービスの起動にも失敗しているはずです。
次のコマンドでサービスの状態を確認すると inactive (dead)
や start condition failed
と表示されると思います。
systemctl status postfix.service
というわけでメイン設定ファイルを作っていきましょう。コマンドは次のようになります。
cd /etc/postfix/
sudo vim main.cf
ひとまず中身は次のような感じでOKです。必要な設定は後ほど足します。
myhostname = sv1.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8
設定の myhostname
と mydomain
はそのままの意味ですね。残りの意味は下表にまとめます。
設定項目 | 意味 |
---|---|
myorigin |
外行きのメールに使うドメイン |
mydestination |
メールを受信するドメイン |
mynetworks |
メールリレーを許可するネットワーク |
メイン設定ファイルができたらサービスを再起動してみましょう。
sudo systemctl restart postfix.service
改めて systemctl status postfix.service
を実行すると、今度は出力に active (exited)
と表示されると思います。
無事サービスが起動できたら mynetworks
に組織内のネットワークセグメントを追加し、下記のような感じで一般的な設定も追加しておきましょう。
+compatibility_level = 3.6
myhostname = sv1.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
+mynetworks = 192.168.0.0/24 127.0.0.0/8
-mynetworks = 127.0.0.0/8
+home_mailbox = Maildir/
+smtpd_sasl_auth_enable = yes
+smtpd_sasl_type = dovecot
+smtpd_sasl_path = private/auth
+debugger_command =
+ PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
+ ddd $daemon_directory/$process_name $process_id & sleep 5
設定項目の意味を下表にまとめます。[1]
設定項目 | 意味 |
---|---|
compatibility_level |
互換性レベル(ここではPostfixのバージョンを指定します) |
home_mailbox |
メールボックスのホームディレクトリからの相対パス |
smtpd_sasl_auth_enable |
SASLサポートを有効にするかどうか |
smtpd_sasl_type |
SASLサポートで使う認証の実装 |
smtpd_sasl_path |
認証デーモンソケットのPostfixキューディレクトリからの相対パス |
SASL(Simple Authentication and Security Layer)と連携してSMTP-AUTH(SMTP認証)していることに注目してください。
Dovecot 最小限の設定
次はDovecotです。Dovecotの設定ファイルは /etc/dovecot/conf.d/
の中に複数ありまして、ここで扱うのは 10-mail.conf
10-master.conf
10-auth.conf
10-ssl.conf
の4つです。ただ、既定の設定ファイルはコメントが多くて見づらいかもしれません。
私は次のような感じで作り直すのが好きです。[2]
cd /etc/dovecot/conf.d/
sudo mv 10-mail.conf 10-mail.conf.orig
sudo chmod a-w 10-mail.conf.orig
cat 10-mail.conf.orig | grep -v -e '#' -e '^$' | sudo tee 10-mail.conf
作り直した設定ファイルを次のように変更します。
+mail_location = maildir:~/Maildir
-mail_location = mbox:~/mail:INBOX=/var/mail/%u
namespace inbox {
inbox = yes
}
mail_privileged_group = mail
protocol !indexer-worker {
}
service imap-login {
inet_listener imap {
}
inet_listener imaps {
}
}
service pop3-login {
inet_listener pop3 {
+ port = 110
}
inet_listener pop3s {
}
}
service submission-login {
inet_listener submission {
}
}
service lmtp {
unix_listener lmtp {
}
}
service imap {
}
service pop3 {
}
service submission {
}
service auth {
unix_listener auth-userdb {
}
+ unix_listener /var/spool/postfix/private/auth {
+ mode = 0666
+ user = postfix
+ group = postfix
+ }
}
service auth-worker {
}
service dict {
unix_listener dict {
}
}
+disable_plaintext_auth = no
auth_mechanisms = plain
!include auth-system.conf.ext
設定ファイルの変更が終わったらDovecotのサービスを再起動します。
sudo systemctl restart dovecot.service
また /etc/aliases.db
を次のコマンドで作っておきます。
sudo newaliases
いよいよ動作確認です。ファイアウォールのポートを開放します。[3]
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 25
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 110
メールソフトを使ってLDAPサーバーに登録したテストユーザーで自身(テストユーザー自身)にメールを送り、それを受け取ってみましょう。テストメールの送受信はできましたか?
できた方はひとまずおめでとうございます!次に進みましょう。
できない方はエラーメッセージを頼りにがんばりましょう。これはこれで良い経験です。
TLS暗号化
ひとまずテストメールで動作確認できましたが、現状は通信を暗号化していませんね。
ゆえに何かしらの方法で通信を見られてしまうと認証パスワードが筒抜けになってしまい、大変危険です。急いでTLSによる暗号化を適用しましょう。
Postfix TLS暗号化
まず main.cf
を次のように変更します。
compatibility_level = 3.6
myhostname = sv1.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.0.0/24 127.0.0.0/8
home_mailbox = Maildir/
+smtp_tls_security_level = may
+smtp_tls_loglevel = 1
+smtp_tls_note_starttls_offer = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
+smtpd_tls_cert_file = /etc/letsencrypt/live/sv1.example.com/fullchain.pem
+smtpd_tls_key_file = /etc/letsencrypt/live/sv1.example.com/privkey.pem
+smtpd_tls_received_header = yes
+smtpd_tls_security_level = may
+smtpd_tls_loglevel = 1
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
+mua_client_restrictions =
+mua_helo_restrictions =
+mua_sender_restrictions =
証明書はWebサーバーで使っているのと同じ、Let's Encryptの証明書を使いました。
また mua_client_restrictions
mua_helo_restrictions
mua_sender_restrictions
の設定を最後の方に追加しました。[4]
同じディレクトリにある master.cf
も変更します。ちなみにPostfixの設定ファイルは .proto
という拡張子のオリジナルが既にあるはずなので、バックアップしなくても良いと思います。
+submission inet n - y - - smtpd
+ -o syslog_name=postfix/submission
+ -o smtpd_tls_security_level=encrypt
+ -o smtpd_sasl_auth_enable=yes
+ -o smtpd_tls_auth_only=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
+smtps inet n - y - - smtpd
+ -o syslog_name=postfix/smtps
+ -o smtpd_tls_wrappermode=yes
+ -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
上記のように submission
と smtps
を有効にします。そして main.cf
と master.cf
の用意ができたらサービスを再起動しましょう。
sudo systemctl restart postfix.service
Dovecot TLS暗号化
続いてDovecotの設定変更です。まずIMAPとPOP3を無効に、IMAPSとPOP3Sを有効にします。
service imap-login {
inet_listener imap {
+ port = 0
}
inet_listener imaps {
+ port = 993
+ ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
+ port = 0
- port = 110
}
inet_listener pop3s {
+ port = 995
+ ssl = yes
}
}
以下略
それからプレインテキストの認証を無効にして
-disable_plaintext_auth = no
auth_mechanisms = plain
!include auth-system.conf.ext
次のような感じで証明書のファイルパスを修正します。
ssl = yes
+ssl_cert = </etc/letsencrypt/live/sv1.example.com/fullchain.pem
-ssl_cert = </etc/dovecot/private/dovecot.pem
+ssl_key = </etc/letsencrypt/live/sv1.example.com/privkey.pem
-ssl_key = </etc/dovecot/private/dovecot.key
ssl_client_ca_dir = /etc/ssl/certs
ssl_dh = </usr/share/dovecot/dh.pem
Dovecotもサービスを再起動します。
sudo systemctl restart dovecot.service
それから、先述の動作確認で追加した次のルールを削除して
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 25
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 110
次のような感じでルールを追加しましょう。ここでSMTPとそれに類するポートが全IPに対して開放されているのは、外部からのメールを受け取れるようにするためです。
sudo ufw allow proto tcp to 0.0.0.0/0 port 25
sudo ufw allow proto tcp to 0.0.0.0/0 port 465
sudo ufw allow proto tcp to 0.0.0.0/0 port 587
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 993
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 995
それではいよいよ最後の動作確認を行います。TLS暗号化にあわせてメールソフトの設定を変更してテストメールを送受信してみましょう。テストは成功しましたでしょうか?
成功した方はおめでとうございます。失敗した方はエラーメッセージを読んで解決してもらえたら幸いです。
ひとまずメールサーバーの基本的な説明は以上です。
参考資料
- Ubuntu Server Guide - Postfix
- Postfixの設定 - 基本
- Postfix Backwards - Compatibility Safety Net
- Postfix 設定パラメータ
- Postfix SASL How
- Ubuntu Server Guide - Dovecot Server