Skip to main content

メールサーバー(Postfix / Dovecot / Roundcube)

Author
blackratel

Ubuntu 24.04 / Postfix / Dovecot / Roundcube / SpamAssassin による受信専用メールサーバー


1. 要件
#

機能要件
#

項目 内容
メールドメイン blackratel.com
受信 外部メールサーバーから SMTP port 25 で受信
メール閲覧 IMAP port 143(localhost のみ)/ Roundcube WebUI
スパムフィルタ SpamAssassin(content_filter 方式)
送信 対象外(受信専用)
認証 Dovecot 認証(IMAP・Roundcube ログイン)
メールボックス形式 Maildir
ユーザー管理 バーチャルユーザー(OS ユーザーと分離)

非機能要件
#

項目 内容
OS Ubuntu 24.04 LTS
TLS 証明書 Postfix(port 25 STARTTLS)と Apache(HTTPS)のみ使用。Dovecot は localhost のみのため SSL 不要
パスワード保存 ARGON2ID ハッシュ
ホスティング OCI Free Tier(アウトバウンド port 25 はブロックのため送信不可)

スコープ外
#

  • メール送信(OCI Free Tier のためアウトバウンド port 25 が利用不可)
  • SPF / DKIM / DMARC 設定(送信しないため不要)

2. 環境・構成情報
#

ミドルウェア
#

ソフトウェア 役割
Postfix MTA(外部からの受信)
Dovecot MDA + MRA(メール保存・IMAP 提供)
SpamAssassin スパムフィルタ(content_filter 方式)
Roundcube WebUI(ブラウザでのメール閲覧)
Apache2 Roundcube のリバースプロキシ

ポート構成
#

ポート プロトコル 用途 接続元
25 SMTP 外部メールサーバーからの受信 外部(OCI Security List + UFW で開放)
143 IMAP Roundcube → Dovecot(メール取得) localhost のみ
443 HTTPS Roundcube WebUI 外部

port 110 / 465 / 587 / 993 / 995 は無効化。

ディレクトリ構成
#

/etc/postfix/
  ├── main.cf                    # メイン設定
  ├── master.cf                  # デーモン・ポート設定
  ├── virtual_mailbox_domains    # 受け付けるドメイン一覧
  └── virtual_mailbox_maps       # メールアドレス → Maildir パスのマッピング

/etc/dovecot/
  ├── dovecot.conf               # メイン(include のみ)
  ├── users                      # バーチャルユーザー管理ファイル
  └── conf.d/
        ├── 10-auth.conf         # 認証方式設定
        ├── 10-mail.conf         # Maildir パス設定・INBOX 自動作成
        ├── 10-master.conf       # LMTP / IMAP ポート定義
        ├── 10-ssl.conf          # SSL 無効(ssl = no、localhost IMAP のため不要)
        └── auth-passwdfile.conf.ext  # passdb / userdb 定義

/var/mail/vmail/                 # OS ユーザー vmail が所有
  └── blackratel.com/
        └── <user>/              # Maildir
            ├── cur/
            ├── new/
            └── tmp/

/var/www/blackratel.com/
  └── xxxxxx/                 # Roundcube インストール先
        ├── config/config.inc.php
        └── temp/roundcube.db    # SQLite データベース

DNS 設定
#

レコード
blackratel.com. MX 10 blackratel.com.

MX の向き先を blackratel.com. にすることで、
Web で使用している Let’s Encrypt 証明書をそのまま共用する。


3. コンポーネント間の連携
#

Postfix

  • port 25:外部メールサーバーからの受信
  • 受信メールを content_filter = spamassassin で SpamAssassin に転送
  • SpamAssassin 処理後のメールを LMTP(Unix Socket)経由で Dovecot へ引き渡す
  • pickup サービスに -o content_filter= を設定しループを防止

Dovecot

  • port 143(localhost のみ・SSL なし):Roundcube へ IMAP 提供
  • 受け取ったメールを Maildir 形式で /var/mail/vmail/blackratel.com/ に保存
  • auth-worker が /etc/dovecot/users を参照し IMAP 認証を管理
  • INBOX が存在しない場合は初回ログイン時に自動作成
  • Postfix との auth 連携なし(受信専用のため SMTP AUTH 不要)

Roundcube

  • https://blackratel.com/xxxxxx/ で WebUI を提供
  • localhost:143 経由で Dovecot に IMAP 接続(メール閲覧のみ・送信不可)
  • データベース:SQLite(/var/www/blackratel.com/xxxxxx/temp/roundcube.db

SpamAssassin

  • spamd デーモンが port 783 でリッスン(localhost のみ)
  • spamc pipe 経由で Postfix から呼び出し
  • スコア 5.0 以上で件名に [SPAM] を付加
  • Spamhaus ZEN は OCI 環境でクエリ過多ブロックのため無効化

コンポーネント間インターフェース(Unix Socket・内部通信)

  • LMTP:/var/spool/postfix/private/dovecot-lmtp(Postfix → Dovecot メール引き渡し)

4. 認証フロー
#

IMAP 認証(Roundcube → Dovecot)

  • Roundcube が localhost:143 へ IMAP 接続し認証情報を送信
  • Dovecot が直接 /etc/dovecot/users を照合(ARGON2ID ハッシュ)
  • OK → /var/mail/vmail/blackratel.com/<user>/ へのアクセスを許可

Roundcube ログイン

  • ブラウザから https://blackratel.com/xxxxxx/ にアクセス
  • メールアドレスとパスワードを入力
  • Roundcube が Dovecot IMAP 認証を経由してログイン成功

5. メール受信フロー
#

外部メールサーバー
    │  (1) SMTP (port 25) で接続
Postfix
    │  (2) virtual_mailbox_domains で blackratel.com を確認
    │  (3) virtual_mailbox_maps で宛先ユーザーを確認
    │  (4) content_filter で SpamAssassin (spamc pipe) へ転送
SpamAssassin (spamd)
    │  (5) スパムスコア算出・ヘッダー付加
    │  (6) spamc -e sendmail で Postfix へ再投入(pickup 経由)
Postfix (pickup・content_filter なし)
    │  (7) LMTP (Unix Socket) で Dovecot へ引き渡し
Dovecot (LMTP)
    │  (8) Maildir 形式で保存
    │      /var/mail/vmail/blackratel.com/<user>/new/
Roundcube
    │  (9) IMAP (localhost:143) で接続
    │  (10) ブラウザでメールを閲覧
閲覧完了

6. ユーザー管理方針
#

OS ユーザーとの分離
#

メールボックスの所有者となる専用 OS ユーザー vmail を1つだけ作成し、
すべてのメールボックスをこのユーザーが所有する構成にする。

種別 内容
OS ユーザー vmail 1つのみ(uid: 5000 / gid: 5000)
シェル なし(SSH ログイン不可)
メールユーザー /etc/dovecot/users で仮想的に管理

ユーザーファイルの形式
#

# /etc/dovecot/users
<user1>@blackratel.com:{ARGON2ID}xxxxxxxx:5000:5000::/var/mail/vmail/blackratel.com/<user1>::
<user2>@blackratel.com:{ARGON2ID}xxxxxxxx:5000:5000::/var/mail/vmail/blackratel.com/<user2>::

ユーザー追加の手順(運用時)
#

① doveadm pw -s ARGON2ID でパスワードハッシュ生成
② vault.yml に追記し、vars.yml の mail_users に追加
③ ansible-playbook site.yml を実行
   → Maildir ディレクトリ自動作成・Dovecot users ファイル更新

おまけ:ARGON2ID とは
#

ARGON2ID はパスワードハッシュ専用のアルゴリズムで、2015年の Password Hashing Competition で最優秀賞を受賞した。

特徴 内容
メモリハード 大量メモリを消費する設計のため、GPU による総当たり攻撃が困難
調整可能コスト メモリ量・反復回数・並列度をパラメータで調整できる
bcrypt との比較 bcrypt より強く、現時点で推奨されるパスワードハッシュ方式

Dovecot では doveadm pw -s ARGON2ID でハッシュを生成する。

$ doveadm pw -s ARGON2ID
Enter new password: ****
Retype new password: ****
{ARGON2ID}$argon2id$v=19$m=65536,t=3,p=1$xxxxxxxx$yyyyyyyy

この出力をそのまま /etc/dovecot/users に貼り付けて使用する。