CentOS Stream 9にDovecot + Postfixをインストール:SSL/TLSとSELinuxで守るIMAP/POP3メールサーバー

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

自前のメールサーバー — 「Google Workspaceを使えばいいじゃない」と言われそうですが、社内メールを完全にコントロールしたい場合、データの保存場所に制約がある場合、あるいは単純にメールシステムの仕組みを理解したい場合は、自前で構築するスキルを身につける価値があります。

私は本番環境でメールサーバーをセットアップした経験が何度かあります。最もつらかったのは、CentOS 8がEOLになったとき、1週間で5台のサーバーを急いで移行しなければならず、そのうち2台がメールサーバーだったケースです。その経験から得た最大の教訓:DovecotとPostfixの設定は徹底的にドキュメント化する必要があるということ — 設定の詳細が欠けた状態でのメールサーバー移行は本当に悪夢です。

アプローチの比較:適切なMTAとMDAの選択

アプローチ1:Postfix単体(SMTPのみ)

PostfixはMTA(Mail Transfer Agent)— サーバー間でのメールの送受信のみを担います。アプリケーションからのメールリレーが必要なだけなら(WordPressの通知メール、cronjobのアラートなど)、Postfix単体で十分です。

  • メリット:シンプルでコンポーネントが少なく、デバッグしやすい
  • デメリット:IMAP/POP3プロトコルがないため、ユーザーはメールクライアント(Outlook、Thunderbird)を使って直接メールを読めない

アプローチ2:Dovecot + Postfix(本格的なメールサーバーの標準構成)

PostfixがSMTPの送受信を担い、DovecotがIMAP/POP3を担当してメールクライアントの接続を可能にします。これは共有ホスティングからエンタープライズまで、業界で最も広く使われている組み合わせです。

  • メリット:機能が充実していて高性能、セキュリティも優れており、ドキュメントも豊富
  • デメリット:複数のレイヤーを設定する必要があり、特にCentOSのSELinux部分は初心者がつまずきやすい

アプローチ3:オールインワンスタック(iRedMail、Mailcow、Mailu)

これらのスタックは、Postfix + Dovecot + SpamAssassin + Roundcube + Web管理画面をインストールスクリプトまたはDocker Composeにまとめたものです。

  • メリット:セットアップが速く、Web管理UIがあり、アンチスパム機能が組み込まれている
  • デメリット:深いカスタマイズが難しく、レイヤーが多すぎてエラー時のデバッグが困難 — そしてCentOSのデフォルトSELinux設定と衝突することが多い

分析:CentOS Stream 9で手動セットアップを選ぶ理由

50ユーザー以下のメールサーバーや学習環境では、Dovecot + Postfixを手動でセットアップすることで各レイヤーを理解できます — 特にCentOSのSELinux部分は初心者にとって「ブラックボックス」になりがちです。問題が発生したとき、どこを見ればいいかが正確にわかります。

CentOS 8からの移行経験を経て、CentOS Stream 9を選択しました。Stream 9は悪評ほど不安定ではありません — メールサーバーには最新鋭のパッケージは必要なく、後でエンタープライズサポートが必要になったときにRHEL互換性は大きなメリットになります。

ステップバイステップの構築ガイド

ステップ1:PostfixとDovecotのインストール

# システムを事前にアップデートする
sudo dnf update -y

# PostfixとDovecotをインストールする
sudo dnf install -y postfix dovecot mailx

# サービスを有効化して起動する
sudo systemctl enable --now postfix
sudo systemctl enable --now dovecot

ステップ2:Postfixの設定

メインの設定ファイル:/etc/postfix/main.cf。変更前は必ずバックアップを取ります — CentOS 8の移行騒動から身についた習慣です。

sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

以下のパラメータを/etc/postfix/main.cfに追加・編集します:

# メールサーバーのドメイン
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain

# すべてのインターフェースでリッスンする
inet_interfaces = all
inet_protocols = ipv4

# メールを受信するドメイン
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# Mailbox形式Maildir(Dovecot互換)
home_mailbox = Maildir/

# Dovecot SASLを使ったSMTP認証
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous

# TLS設定
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.example.com.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.example.com.key
smtpd_use_tls = yes
smtpd_tls_auth_only = yes

# 基本的なアンチスパム設定
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination

ステップ3:SSL/TLS証明書の作成

本番環境ではLet’s Encryptを使用します。ラボ/テスト環境では自己署名証明書を使います:

# 自己署名(テスト環境のみ)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/pki/tls/private/mail.example.com.key \
  -out /etc/pki/tls/certs/mail.example.com.crt \
  -subj "/C=JP/ST=Tokyo/L=Tokyo/O=Example/CN=mail.example.com"

sudo chmod 600 /etc/pki/tls/private/mail.example.com.key

# 本番環境:Let's Encryptを使用する
sudo dnf install -y certbot
sudo certbot certonly --standalone -d mail.example.com
# 証明書は/etc/letsencrypt/live/mail.example.com/に保存される

ステップ4:Dovecotの設定

Dovecotは/etc/dovecot/conf.d/ディレクトリ配下にファイル分割された設定構造を持っています — 各ファイルが特定の部分を担当するクリーンな構造で、Postfixのモノリシック設定とは対照的です。

# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

# /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login

# /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/pki/tls/certs/mail.example.com.crt
ssl_key = </etc/pki/tls/private/mail.example.com.key
ssl_min_protocol = TLSv1.2

PostfixがDovecotに接続できるようにSASLソケットを設定します — /etc/dovecot/conf.d/10-master.confに追加します:

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

ステップ5:SELinuxの対処 — 最もよく見落とされるポイント

CentOSでメールサーバーをセットアップするときの最大の難関です。SELinuxは初心者が思いもよらないものをたくさんブロックし、エラーが無音で発生することが多い — サービスは起動しているのに接続が通らない、というケースです。

黄金ルール:本番環境で問題を「解決」するためにsetenforce 0は絶対にやめましょう。audit2allowを使って正しいポリシーを作成してください。

# SELinuxがブロックしていないか確認する
sudo ausearch -m avc -ts recent | grep -E 'dovecot|postfix'

# 有効にする必要があるboolean
sudo setsebool -P allow_postfix_local_write_mail_spool 1

# Dovecotがデフォルトディレクトリ外のファイルにアクセスする必要がある場合
sudo restorecon -Rv /etc/pki/tls/
sudo restorecon -Rv /var/spool/postfix/

# AVC拒否からカスタムポリシーを作成する(最も強力な方法)
sudo ausearch -m avc -ts recent | audit2allow -M postfix_dovecot_local
sudo semodule -i postfix_dovecot_local.pp

# 修正後もSELinuxがEnforcingのままか確認する
getenforce

CentOS 8移行時のコツ:古いサーバーからauditログをエクスポートし、audit2allowでポリシーを事前に生成して、サービス再起動前に新しいサーバーにインポートしました — おかげでSELinuxのデバッグに半日費やさずに済みました。

ステップ6:firewalldでポートを開放する

# SMTP
sudo firewall-cmd --permanent --add-service=smtp        # ポート25
sudo firewall-cmd --permanent --add-service=smtps       # ポート465
sudo firewall-cmd --permanent --add-service=smtp-submission  # ポート587

# IMAPとPOP3
sudo firewall-cmd --permanent --add-service=imap        # ポート143
sudo firewall-cmd --permanent --add-service=imaps       # ポート993
sudo firewall-cmd --permanent --add-service=pop3        # ポート110
sudo firewall-cmd --permanent --add-service=pop3s       # ポート995

sudo firewall-cmd --reload
sudo firewall-cmd --list-services

ステップ7:ユーザーの作成と動作確認

# メールユーザーを作成する(ログインシェル不要)
sudo useradd -m -s /sbin/nologin mailuser
sudo passwd mailuser

# Maildirのディレクトリ構造を作成する
sudo -u mailuser mkdir -p /home/mailuser/Maildir/{cur,new,tmp}

# サービスを再起動する
sudo systemctl restart postfix dovecot

# 内部テストメールを送信する
echo "テスト本文" | mail -s "Test Subject" [email protected]

# メールが届いているか確認する
sudo ls -la /home/mailuser/Maildir/new/

IMAPとSMTP接続の確認

# 手動でIMAPをテストする
telnet localhost 143
# 接続後:
a LOGIN mailuser yourpassword
b SELECT INBOX
c LOGOUT

# TLSでSMTPをテスト(SASL認証を確認)
openssl s_client -connect mail.example.com:587 -starttls smtp

よくあるエラーと対処法

  • Postfixが外部からメールを受信しない:mydestinationinet_interfaces = allを確認してください — このパラメータを忘れがちです
  • 正しいパスワードなのにDovecotがログインを拒否する:90%はSELinuxの問題です。他のことをデバッグする前にausearch -m avc -ts recentを実行してください
  • Postfixのログに"SASL authentication failure"が表示される:main.cfのソケットパス(private/auth)がDovecotの10-master.confと一致しているか確認してください
  • メールクライアントがSSLエラーを報告する:自己署名証明書では正常です — 手動でトラストするか、本番環境ではLet’s Encryptを使用してください
  • MaildirでPermission deniedが発生する:restorecon -Rv /home/mailuser/を実行してSELinuxコンテキストを修正してください

本番稼働前のチェックリスト

  • systemctl status postfix dovecot — 両方ともactiveでwarningがないこと
  • ポート25、587、993、995がリッスンしていること:ss -tlnp | grep -E '25|587|993|995'
  • SELinuxがEnforcing状態であること:getenforceの出力がEnforcingであること
  • telnetを使ったメールの送受信テストが成功すること
  • ThunderbirdからIMAPSポート993への接続が成功すること
  • ログがクリーンであること:sudo tail -f /var/log/maillogに継続的なエラーがないこと
  • DNS上でSPF/DKIM/DMARCが設定済みであること(スパムフォルダに入らないために必須)

CentOS Stream 9での手動メールサーバー構築は「挿してすぐ動く」ものではありません — しかし、SASLハンドシェイクからSELinuxポリシーまで各レイヤーを理解できれば、どんなメールの問題もデバッグできるようになります。そして何より重要なのは、私が経験したような急な移行を迫られたとき、何をバックアップしてドキュメント化すべきかが正確にわかるということです。

Share: