前回は、OS実ユーザ向けのメールサーバセットアップを行いました。
今回はバーチャルホストと管理用のPostfixAdminのセットアップを進めていきます。
今回のコンポーネント
今回はコンポーネントが山盛りですね。
| コンポーネント | 利用しているもの | 
|---|---|
| MTA | Postfix 3.4.13 | 
| POP/IMAPサーバ | Dovecot 2.3.7 | 
| メールボックス管理 | PostfixAdmin 3.2.1 | 
| SSL証明書 | Let's Encrypt | 
| DNS | Bind 9.16.1 | 
| データベース | MariaDB 10.3.25 | 
| DKIM | OpenDKIM 2.11.0 | 
| DMARC | OpenDMARC 1.3.2 | 
| グレーリスト管理 | postgrey 1.36 | 
| Log Report | Pflogsumm 1.1.5 | 
| SPAM管理 | 
			 SpamAssassin 3.4.4  | 
		
| ウィルススキャン (当初導入するも、メモリ不足で無効化)  | 
			Amavis 2.11.0 ClamAV 0.103.2  | 
		
当初、ウィルススキャンとしてAmavis/ClamAVを導入しました。
メモリが2GBでは足りなかったため最終的には無効化していますが、導入手順はメモとして記載しています。
 
今回は、メールサーバ構築に関して理解しながら進めるために、段階的にステップを踏みながら構築を進めていきます。
- Postfixサーバの基本セットアップ
 - TLS暗号化とDovecot IMAP/POP3サーバセットアップ
 - PostfixAdminを使ってバーチャルメールボックス作成
 - 信頼度向上のためのSPF/DKIMレコード作成
 - ドメイン信頼性向上のためのDMARCセットアップ
 - Postfixでのスパム受信ブロック
 
1ページでの記載には大きすぎたので記事を分割します
今回の記事では、バーチャルホストと管理用のPostfixAdminであるSTEP3を記載します。
STEP3.PostfixAdminを使ってバーチャルメールボックス作成
PostfixAdminインストール
dbconfig-no-thanksインストール
PostfixAdminのインストール前にdbconfig-no-thanksをインストールし、postfixadminパッケージがDB Configウィザードをランチするのを阻止します
# apt install dbconfig-no-thanks
PostfixAdminのインストール
# apt install postfixadmin
dbconfig-no-thanksアンインストール
# apt remove dbconfig-no-thanks
MariaDBにデータベースpostfixadminを作成
コマンドライン、またはphpMyAdmin経由でPostfixAdmin用データベースを作成します
| 項目 | パラメータ | 
|---|---|
| DB名 | postfixadmin | 
| ID | postfixadmin | 
| Password | Str0ngDrupaLP@SS 適宜変更ください | 
コマンドラインで作成する際は以下となります
# mysql -u root -p
CREATE DATABASE postfixadmin;
GRANT ALL ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'Str0ngDrupaLP@SS';
FLUSH PRIVILEGES;
\q
PostfixAdmin各種設定
/etc/dbconfig-common/postfixadmin.confを編集
# vim /etc/dbconfig-common/postfixadmin.conf
dbc_dbtypeをmysqliに変更
| # dbc_dbtype: type of underlying database to use # this exists primarily to let dbconfig-common know what database # type to use when a package supports multiple database types. # don't change this value unless you know for certain that this # package supports multiple database types #dbc_dbtype='mysql' dbc_dbtype='mysqli'  | 
		
/etc/postfix/config.inc.phpを編集
# vim /etc/postfix/config.inc.php
セットアップ用のパスワードと管理者メールアドレス、管理者名を設定します
| 
			 // In order to setup Postfixadmin, you MUST specify a hashed password here. // Site Admin  | 
		
赤字部分を環境に応じて変更します
setup_passwordはGUIでのセットアップ時に利用します。変更して記録しておきます。
/etc/postfix/dbconfig.inc.phpを編集
# vim /etc/postfix/dbconfig.inc.php
dbtypeを変更します
| #$dbtype='mysql'; $dbtype='mysqli';  | 
		
PostfixAdminの構成保管用ディレクトリを作成
PostfixAdmin用に/usr/share/postfixadmin/以下にtemplates_cディレクトリを作成し、NGINX用ユーザwww-dataに権限を付与します
# mkdir /usr/share/postfixadmin/templates_c
# setfacl -R -m u:www-data:rwx /usr/share/postfixadmin/templatex_c/
NGINXにPostfixAdmin用設定追加
管理サーバ(manage.your-domain.com)用の設定ファイルにpostfixadminに関する記述を追加
# vim /etc/nginx/sites-available/manage
/phpmyadmin向けにAliasを作成します
管理用のため、アクセス元が限定される場合はアクセス元制限(赤字)をかけたり、BASIC認証(青字)をかけることをお勧めします。
| 
			     location ^~ /postfixadmin {         alias /usr/share/postfixadmin/public;         auth_basic "Restricted";         location ~ ^/postfixadmin(.+\.php)(.*)$ {  | 
		
Dovecotパスワードスキーム強化
Dovecotを利用可能なパスワードスキーム確認
まずは、Dovecotで利用可能なパスワードスキームを確認します
# doveadm pw -l
今回の環境では以下が表示されました
| SHA1 SSHA512 BLF-CRYPT PLAIN HMAC-MD5 OTP SHA512 SHA RPA DES-CRYPT CRYPT SSHA MD5-CRYPT SKEY PLAIN-MD4 PLAIN-MD5 SCRAM-SHA-1 LANMAN SHA512-CRYPT CLEAR CLEARTEXT ARGON2I ARGON2ID SSHA256 NTLM MD5 PBKDF2 SHA256 CRAM-MD5 PLAIN-TRUNC SHA256-CRYPT SMD5 DIGEST-MD5 LDAP-MD5 | 
標準ではDovecotやPostfixAdminはMD5-CRYPTが利用されますが、今回は強力なパスワードスキームとしてArgon2を利用したいと思います
Argon2
Argon2は2015/7のパスワードハッシュコンペで優勝したハッシュ関数です
Argon2iはサイドチャネル攻撃に、Argon2dはGPU攻撃に耐性があるよう設計されており、Argon2idはハイブリッド構成となります
今回はArgon2iを利用します
PostfixAdminの設定変更
PostfixAdminでは、個別設定に関してはconfig.local.phpに記述を行います
パスワード暗号化にdovecotでArgon2iを利用するよう、encryptパラメータに'dovecot:ARGON2I'を記載します
# vim /usr/share/postfixadmin/config.local.php
下記を記載します
| 
			 <?php  | 
		
作成したコンフィグファイルを/etc/postfixadmin/以下にシンボリックリンクを作成します
# ln -s /usr/share/postfixadmin/config.local.php /etc/postfixadmin/config.local.php
NGINX再起動
コンフィグをチェックし、問題なければ再起動します
# nginx -t
# systemctl restart nginx
これで、ブラウザ経由でセットアップを続ける準備ができました
Postfix Adminのセットアップ
ブラウザ経由でセットアップを起動します
https://manage.your-domain.com/postfixadmin/setup.php
環境チェックを行い問題なければSetup passwordの入力が求められます。
先ほど/etc/postfix/config.inc.phpに記載したものを入力すると、新たなセットアップパスワードが表示されますのでメモして/etc/postfix/config.inc.phpを更新します。
画面に表示されるパスワードを確認し、/etc/postfix/config.inc.phpまたは/etc/postfix/config.local.phpに記載します。
# vim /etc/postfixadmin/config.inc.php
更新を行った後、再度ブラウザでセットアップにアクセスします
https://manage.your-domain.com/postfixadmin/setup.php

セットアップパスワードは更新後のパスワードを入力し、管理ユーザの追加を行います
管理者には管理者といて登録予定のメールアドレスとパスワードを入力します

登録できた際は、追加が成功した旨表示がされます
Postfixの構成変更を続けます
PostfixがMariaDBを利用するよう構成変更
postfix-mysqlをインストール
パッケージ(apt)を利用してインストールします
# apt install postfix-mysql
Postfix構成変更
/etc/postfix/main.cfを編集します
# vim /etc/postfix/main.cf
末尾にVirtual Mailboxに関する設定を追加します
| 
			 virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf virtual_transport = lmtp:unix:private/dovecot-lmtp  | 
		
各パラメータの説明は次の通りです
| パラメータ | 説明 | 
| virtual_mailbox_domains | Postfixのドメイン情報参照先を指定 | 
| virtual_mailbox_maps | PostfixのEメールアドレス情報の参照先を指定 | 
| virtual_alias_map | Postfixのエイリアス参照先を指定 | 
| virtual_transport | 
			 バーチャルユーザの受信メール配送手段を指定  | 
		
SQL利用のためのConfig保管フォルダを作成
/etc/postfix/sqlにSQL利用のためのConfigを保管します
# mkdir /etc/postfix/sql
SQL利用のためのコンフィグ作成
先ほど作成したデータベースを利用します。参照する際は、環境に応じて適宜修正ください。
| 項目 | パラメータ | 
|---|---|
| DB名 | postfixadmin | 
| ID | postfixadmin | 
| Password | Str0ngDrupaLP@SS 適宜変更ください | 
/etc/postfix/sql/mysql_virtual_domains_maps.cf
| user = postfixadmin password = Str0ngDrupaLP@SS hosts = localhost dbname = postfixadmin query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'  | 
		
/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
| user = postfixadmin password = Str0ngDrupaLP@SS hosts = localhost dbname = postfixadmin query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1' #expansion_limit = 100  | 
		
/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
| user = postfixadmin password = Str0ngDrupaLP@SS hosts = localhost dbname = postfixadmin query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'  | 
		
/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
| user = postfixadmin password = Str0ngDrupaLP@SS hosts = localhost dbname = postfixadmin query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = '1' AND alias_domain.active='1'  | 
		
/etc/postfix/sql/mysql_virtual_alias_maps.cf
| user = postfixadmin password = Str0ngDrupaLP@SS hosts = localhost dbname = postfixadmin query = SELECT goto FROM alias WHERE address='%s' AND active = '1' #expansion_limit = 100  | 
		
/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps
| # handles catch-all settings of target-domain user = postfixadmin password = Str0ngDrupaLP@SS hosts = localhost dbname = postfixadmin query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = '1' AND alias_domain.active='1'  | 
		
ファイルの権限修正
DBのパスワード情報が記載されいるため、一般ユーザの権限を制限するとともに、Postfixのプロセスから参照するためにユーザpostfixに閲覧権限を付与します。
# chmod 750 /etc/postfix/sql
# chmod 640 /etc/postfix/sql/*
# setfacl -m u:postfix:rx /etc/postfix/sql
# setfacl -m u:postfix:r /etc/postfix/sql/*
個別の権限付与については次のコマンドで確認します
# getfacl -R /etc/postfix/sql
下記のような権限が確認できればOKです
| # file: etc/postfix/sql                                                                # owner: root # group: root user::rwx user:postfix:r-x #effective:--- group::r-x #effective:--- mask::--- other::--- # file: etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf # owner: root # group: root user::rw- user:postfix:r-- group::r-- mask::r-- other::---  | 
		
Postfix設定修正
/etc/postfix/main.cfを修正します
# vim /etc/postfix/main.cf
mydestinationを修正
| 
			 mydestination = $myhostname, localhost.$mydomain, localhost  | 
		
以下を末尾に追加
| virtual_mailbox_base = /var/vmail virtual_minimum_uid = 3000 virtual_uid_maps = static:3000 virtual_gid_maps = static:3000  | 
		
Virtual Mailbox用の設定追加
ユーザ追加
# adduser vmail --system --group --uid 3000 --disabled-login --no-create-home
ディレクトリ追加
# mkdir /var/vmail
# chown vmail.vmail /var/vmail -R
DovecotがMariaDBを利用するよう構成変更
dovecot-mysqlをインストール
# apt install dovecot-mysql
Dovecot設定変更(STEP2の設定を修正)
/etc/dovecot/conf.d/10-mail.confを編集
# vim /etc/dovecot/conf.d/10-mail.conf
バーチャルユーザ用のディレクトリを追加
| mail_location = mbox:~/mail                                                                                                        mail_home = /var/vmail/%d/%n  | 
		
/etc/dovecot/conf.d/10-auth.confを編集
# vim /etc/dovecot/conf.d/10-auth.conf
OSリアルユーザのみの利用時はドメイン名を落としていたが、今回は仮想メールボックスのためドメイン名をドロップしないよう変更
| # auth_username_format = %n auth_username_format = %u  | 
		
SQLで認証を行うため、以下のコメントアウトを外す
| #!include auth-sql.conf.ext !include auth-sql.conf.ext  | 
		
ローカルユーザ認証を止めたい場合は以下をコメントアウト
| #!include auth-system.conf.ext | 
認証をデバッグする際は以下を追加
| auth_debug = yes auth_debug_passwords = yes  | 
		
(注意)auth_debug_passwordはユーザが認証をかけたパスワードがログに記載されるため、トラブルのデバック時以外は止めるべきです
/etc/dovecot/dovecot-sql.conf.extを編集
# vim /etc/dovecot/dovecot-sql.conf.ext
利用するDBタイプをmysqlに設定
| 
			 driver = mysql  | 
		
DB接続情報は、PostfixAdmin用のDBパラメータを指定
| 
			 connect = host=localhost dbname=postfixadmin user=postfixadmin passwod=Str0ngDrupaLP@SS  | 
		
パスワードスキームはARGON2Iを利用
| 
			 default_pass_schem = ARGION2I  | 
		
各種クエリを指定
ユーザクエリのUID/GIDはvmailユーザ作成時のものを指定
| 
			 password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1' user_query = SELECT maildir, 3000 AS uid, 3000 AS gid FROM mailbox WHERE username = '%u' AND active='1' iterate_query = SELECT username AS user FROM mailbox  | 
		
以上で設定が完了です
Postfix/Dovecot再起動
# systemctl restart postfix dovecot
PostfixAdmin利用方法
詳細マニュアルを参照いただければと思いますが、初期設定だけ説明します
ログイン
まずブラウザでPostfixAdminにアクセスします
https://manage.your-domain.com/postfixadmin/

セットアップ時に作成した管理者のID/Passwordでログインを行います。
ドメイン追加
ログインすると、メニュー画面が表示されます。メニューから「ドメイン一覧」-「新しいドメイン」を選択します。

「新しいドメインの追加」ページでドメイン情報を追加します

ドメイン名、転送数、アドレス数など入力し、「ドメインを追加」をクリックすると管理対象ドメインが追加されます。
メールボックス追加
新しくメールボックスを作成する際はメニューにて、「アドレス一覧」-「メールアドレスの追加」を選択します。

メールアドレス、パスワード、名前などを入力し「メールアドレスの追加」をクリックするとメールボックスが作成されます。
メール転送
特定アドレス宛てのメールを指定アドレスに転送が可能です。
転送元に「*@your-domain.com」を入力すると、メールボックスや転送指定されていない「your-domain.com」ドメイン宛のメールがすべて転送されます。

とりあえず、自ドメイン宛のメールを全部受信したい場合は重宝します。
以上で、簡単ですがPostfixAdminの利用方法でした。
次回はSPF/DKIMレコードの設定、DMARCのセットアップに進みます
         