📨 前の回を先に読んでください!
この記事は「Linuxでのメールサーバー構築」シリーズの第五回目です。
前回はDovecotの必須設定ファイル4つを分析しました。まだ読んでいない方は、ぜひ確認することをお勧めします。
👉 前の回: Dovecot必須設定ファイル分析


🔄 順序調整の案内
前回は「次の回でauth-sql.conf.ext設定を扱う」と予告しましたが、
実際に文章を書いていると、DBテーブル設計を先に説明する方がより論理的な順序だと判断しました。

したがって、今回はDovecotの仮想ユーザーの概念とPostgreSQLテーブル設計を扱い、
次回でDovecotとPostgreSQLを連動させるauth-sql.conf.ext設定を説明する予定です。


🎯 Dovecot仮想ユーザーとは?なぜ必要なのか?

Dovecotでユーザーを認証する方法は大きく分けて2つあります。

  1. システムアカウントベースの認証
  2. Linuxの/etc/passwdおよび/etc/shadowファイルを利用した認証
  3. 一般的なシステムユーザーアカウントを活用
  4. アカウント管理が煩雑で、メール専用アカウントを作成しづらい

  5. 仮想ユーザーに基づく認証 (Virtual Users)

  6. 別のデータベース(PostgreSQL, MySQLなど)を利用して認証
  7. システムアカウントから独立したメール専用ユーザー管理が可能
  8. セキュリティと拡張性に優れ、大規模メールサービスに適している

私たちはPostgreSQLを利用して仮想ユーザー環境を構築する予定です。
つまり、実際のLinuxアカウントを作成せずともデータベースからユーザー情報を取得して認証する方式です。

🔹 仮想ユーザー環境の利点

  • システムアカウントと分離されているためセキュリティが高い
  • ユーザーアカウントを簡単に追加、削除できる
  • 複数ドメインのサポートが可能(一つのサーバーで複数メールドメイン管理が可能)
  • 拡張性に優れ、管理が容易

Pigeon holding a letter near a database


🛠️ PostgreSQLでのテーブル設計

Dovecotで仮想ユーザーを適切に管理するには、最低でも3つのテーブルが必要です。

1️⃣ 必須テーブル構成

  1. mail_domain - メールサーバーで管理するドメインのリスト
  2. mail_users - 実際のメールユーザー情報
  3. mail_alias - メールエイリアス(フォワーディング)の管理

このように分離する理由は、拡張性メンテナンスの容易さのためです。
将来的に複数のメールドメインを運用したり、特定のメールを他のアドレスにフォワーディングする時に非常に便利です。


2️⃣ テーブルスキーマとSQLの例

📌 1. mail_domain (ドメインリスト管理)
メールサーバーで許可するドメインを管理するテーブルです。
つまり、example.com, mydomain.comなどのメールドメインを定義します。

CREATE TABLE mail_domain (
    id SERIAL PRIMARY KEY,
    domain_name VARCHAR(255) NOT NULL UNIQUE,
    active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 説明
- domain_name → メールドメイン(例: example.com
- active → 該当ドメインを使用するかどうか(非活性化可能)
- created_at → 作成日

サンプルデータ挿入の例

INSERT INTO mail_domain (domain_name) VALUES ('example.com');
INSERT INTO mail_domain (domain_name) VALUES ('mydomain.com');

📌 2. mail_users (メールユーザーアカウント)
実際にメールを使用するユーザーアカウント情報が保存されます。
各ユーザーは特定のドメインに属する必要があります。

CREATE TABLE mail_users (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password TEXT NOT NULL,
    home_directory TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 説明
- domain_idmail_domainテーブルのidと接続(メールユーザーが属するドメイン)
- email → ユーザーのメールアドレス(user@example.com
- password → 暗号化されたパスワードを保存
- home_directory → メール保存パス(/var/mail/vmail/user@example.com
- created_at → アカウント作成日

サンプルデータ挿入の例

INSERT INTO mail_users (domain_id, email, password, home_directory)
VALUES (1, 'user@example.com', 'hashed_password_here', '/var/mail/vmail/user@example.com');

📌 3. mail_alias (メールエイリアス / フォワーディング) メールアドレスを他のアドレスにフォワーディングしたり、一つのアドレスに複数のエイリアスを使用するために必要です。

CREATE TABLE mail_alias (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    source_email VARCHAR(255) NOT NULL,
    destination_email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 説明

  • source_email → 元のメールアドレス(例: contact@example.com)
  • destination_email → 転送先のメールアドレス(例: admin@example.com)
  • 特定のメールアドレスを自動的に他のアドレスに転送する機能を持つ

サンプルデータ挿入の例

INSERT INTO mail_alias (domain_id, source_email, destination_email)
VALUES (1, 'contact@example.com', 'admin@example.com');

これでcontact@example.com宛のメールは自動的にadmin@example.comに転送されます。

🔍 将来的な拡張のための推奨テーブル

基本的なメールサービスの運営の他にも追加機能を拡張することができます。
以下は将来的に拡張できるテーブルの例です。

テーブル名 役割
mail_quota ユーザー別メール容量制限
mail_blacklist ブロックするメールアドレスのリスト
mail_whitelist 許可するメールアドレスのリスト
mail_forwarding 外部メールアカウントへの転送
mail_autoresponder 自動応答メッセージ管理
mail_address_book 内部アドレス帳管理

🏁 整理と次のステップ

今回の記事で扱った内容
- Dovecot仮想ユーザーの概念と必要性
- PostgreSQLテーブル設計(mail_domain、mail_users、mail_alias)
- メール管理の拡張のための追加テーブル推奨

次回予告: auth-sql.conf.ext設定とパスワードハッシング方式
これでデータベーステーブルが準備されました。次回ではDovecotがPostgreSQLからユーザー情報を取得して認証する方法を説明し、
メールユーザーアカウントで使用するパスワードハッシング方式について扱う予定です。

特にMD5、SHA-256、BCRYPT方式の特徴とセキュリティの違いを比較し、
それぞれの方法をDovecotおよびPostgreSQLでどのように適用するか具体的に見ていきます。

👉 次回: auth-sql.conf.ext設定とパスワードハッシング方法(Coming Soon!)