Chapter 07

メールサーバー

UR
UR
2022.12.09に更新

この章では、メールサーバーソフトウェアのPostfixとDovecotを設定するとともに、基本的な使い方を説明します。

メールサーバー

GmailOutlook.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です。必要な設定は後ほど足します。

/etc/postfix/main.cf
myhostname = sv1.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8

設定の myhostnamemydomain はそのままの意味ですね。残りの意味は下表にまとめます。

設定項目 意味
myorigin 外行きのメールに使うドメイン
mydestination メールを受信するドメイン
mynetworks メールリレーを許可するネットワーク

メイン設定ファイルができたらサービスを再起動してみましょう。

sudo systemctl restart postfix.service

改めて systemctl status postfix.service を実行すると、今度は出力に active (exited) と表示されると思います。

無事サービスが起動できたら mynetworks に組織内のネットワークセグメントを追加し、下記のような感じで一般的な設定も追加しておきましょう。

/etc/postfix/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
-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

作り直した設定ファイルを次のように変更します。

/etc/dovecot/conf.d/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 {
}
/etc/dovecot/conf.d/10-master.conf
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 {
  }
}
/etc/dovecot/conf.d/10-auth.conf
+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 を次のように変更します。

/etc/postfix/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 という拡張子のオリジナルが既にあるはずなので、バックアップしなくても良いと思います。

/etc/postfix/master.cf
+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

上記のように submissionsmtps を有効にします。そして main.cfmaster.cf の用意ができたらサービスを再起動しましょう。

sudo systemctl restart postfix.service

Dovecot TLS暗号化

続いてDovecotの設定変更です。まずIMAPとPOP3を無効に、IMAPSとPOP3Sを有効にします。

/etc/dovecot/conf.d/10-master.conf
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
  }
}
以下略

それからプレインテキストの認証を無効にして

/etc/dovecot/conf.d/10-auth.conf
-disable_plaintext_auth = no
auth_mechanisms = plain
!include auth-system.conf.ext

次のような感じで証明書のファイルパスを修正します。

/etc/dovecot/conf.d/10-ssl.conf
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暗号化にあわせてメールソフトの設定を変更してテストメールを送受信してみましょう。テストは成功しましたでしょうか?

成功した方はおめでとうございます。失敗した方はエラーメッセージを読んで解決してもらえたら幸いです。

ひとまずメールサーバーの基本的な説明は以上です。

参考資料

脚注
  1. 表では省略しましたけれど debugger_command はPostfixデーモンが -D オプション付きで呼ばれたときに実行される外部コマンドです。 ↩︎

  2. これは 10-mail.conf の例ですが、他も同様に作り直します。 ↩︎

  3. セキュリティのため、この確認では特定のサブネットだけからメールを送受信できるようにします。 ↩︎

  4. 追加しなくても良いと言えば良いのですが、設定していないと警告が出るので追加しました。 ↩︎