📨 前の回を先に読んでください!
この記事は「Linuxでのメールサーバー構築」シリーズの第五回目です。
前回はDovecotの必須設定ファイル4つを分析しました。まだ読んでいない方は、ぜひ確認することをお勧めします。
👉 前の回: Dovecot必須設定ファイル分析
🔄 順序調整の案内
前回は「次の回でauth-sql.conf.ext
設定を扱う」と予告しましたが、
実際に文章を書いていると、DBテーブル設計を先に説明する方がより論理的な順序だと判断しました。
したがって、今回はDovecotの仮想ユーザーの概念とPostgreSQLテーブル設計を扱い、
次回でDovecotとPostgreSQLを連動させるauth-sql.conf.ext
設定を説明する予定です。
🎯 Dovecot仮想ユーザーとは?なぜ必要なのか?
Dovecotでユーザーを認証する方法は大きく分けて2つあります。
- システムアカウントベースの認証
- Linuxの
/etc/passwd
および/etc/shadow
ファイルを利用した認証 - 一般的なシステムユーザーアカウントを活用
-
アカウント管理が煩雑で、メール専用アカウントを作成しづらい
-
仮想ユーザーに基づく認証 (Virtual Users)
- 別のデータベース(PostgreSQL, MySQLなど)を利用して認証
- システムアカウントから独立したメール専用ユーザー管理が可能
- セキュリティと拡張性に優れ、大規模メールサービスに適している
私たちはPostgreSQLを利用して仮想ユーザー環境を構築する予定です。
つまり、実際のLinuxアカウントを作成せずともデータベースからユーザー情報を取得して認証する方式です。
🔹 仮想ユーザー環境の利点
- システムアカウントと分離されているためセキュリティが高い
- ユーザーアカウントを簡単に追加、削除できる
- 複数ドメインのサポートが可能(一つのサーバーで複数メールドメイン管理が可能)
- 拡張性に優れ、管理が容易
🛠️ PostgreSQLでのテーブル設計
Dovecotで仮想ユーザーを適切に管理するには、最低でも3つのテーブルが必要です。
1️⃣ 必須テーブル構成
mail_domain
- メールサーバーで管理するドメインのリストmail_users
- 実際のメールユーザー情報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_id
→ mail_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!)
Add a New Comment