前回は、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のセットアップに進みます