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 のみ)spamcpipe 経由で 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 に貼り付けて使用する。