メインコンテンツに移動
vps eye catch
VPSサーバ構築

 前回は、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
spamass-milter 0.4.0
postfix-pcre 3.4.13

ウィルススキャン
(当初導入するも、メモリ不足で無効化)
Amavis 2.11.0
ClamAV 0.103.2

当初、ウィルススキャンとしてAmavis/ClamAVを導入しました。

メモリが2GBでは足りなかったため最終的には無効化していますが、導入手順はメモとして記載しています。
 

今回は、メールサーバ構築に関して理解しながら進めるために、段階的にステップを踏みながら構築を進めていきます。

  1. Postfixサーバの基本セットアップ
  2. TLS暗号化とDovecot IMAP/POP3サーバセットアップ
  3. PostfixAdminを使ってバーチャルメールボックス作成
  4. 信頼度向上のためのSPF/DKIMレコード作成
  5. ドメイン信頼性向上のためのDMARCセットアップ
  6. 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.
// To create the hash, visit setup.php in a browser and type a password into the field,
// on submission it will be echoed out to you as a hashed value.
$CONF['setup_password'] = 'changeme';

// Site Admin
// Define the Site Admin's email address below.
// This will be used to send emails from to create mailboxes and
// from Send Email / Broadcast message pages.
// Leave blank to send email from the logged-in Admin's Email address.
$CONF['admin_email'] = 'admin@your-domain.com';
                                                                                                                                  
// Site admin name
// This will be used as signature in notification messages
$CONF['admin_name'] = 'Administrator of your-domain';

赤字部分を環境に応じて変更します

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 {
        allow 127.0.0.1;
        allow 11.22.33.44;
        allow 12.34.56.0/24;
        deny all;

        alias /usr/share/postfixadmin/public;
        index index.php;

        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;

        location ~ ^/postfixadmin(.+\.php)(.*)$ {
            fastcgi_split_path_info ^/postfixadmin(.+\.php)(.*)$;
            if (!-f $document_root$fastcgi_script_name) {
                return 404;
            }
            include fastcgi_params;
            fastcgi_pass unix:/run/php/php-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }

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
$CONF['encrypt'] = 'dovecot:ARGON2I';

if(@file_exists('/usr/bin/doveadm')) { // @ to silence openbase_dir stuff; see https://github.com/postfixadmin/postfixadmin/issues/171
    $CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5"; # debian
}

作成したコンフィグファイルを/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を更新します。

Image
Postfix Adin setup password

画面に表示されるパスワードを確認し、/etc/postfix/config.inc.phpまたは/etc/postfix/config.local.phpに記載します。

# vim /etc/postfixadmin/config.inc.php

更新を行った後、再度ブラウザでセットアップにアクセスします

https://manage.your-domain.com/postfixadmin/setup.php

 

Image
Postfix Admin 01

セットアップパスワードは更新後のパスワードを入力し、管理ユーザの追加を行います

管理者には管理者といて登録予定のメールアドレスとパスワードを入力します

Image
Postfix Adin setup 03

登録できた際は、追加が成功した旨表示がされます

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_mailbox_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domains_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf

virtual_transport = lmtp:unix:private/dovecot-lmtp

各パラメータの説明は次の通りです

パラメータ 説明
virtual_mailbox_domains Postfixのドメイン情報参照先を指定
virtual_mailbox_maps PostfixのEメールアドレス情報の参照先を指定
virtual_alias_map Postfixのエイリアス参照先を指定
virtual_transport

バーチャルユーザの受信メール配送手段を指定
今回はDovecot-LMTPを利用

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/

Image
PostfixAdmin Login

セットアップ時に作成した管理者のID/Passwordでログインを行います。

ドメイン追加

ログインすると、メニュー画面が表示されます。メニューから「ドメイン一覧」-「新しいドメイン」を選択します。

Image
PostfixAdmin Menu

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

Image
PostfixAdmin Add Domain

ドメイン名、転送数、アドレス数など入力し、「ドメインを追加」をクリックすると管理対象ドメインが追加されます。

メールボックス追加

新しくメールボックスを作成する際はメニューにて、「アドレス一覧」-「メールアドレスの追加」を選択します。

Image
PostfixAdmin Add Mailbox

メールアドレス、パスワード、名前などを入力し「メールアドレスの追加」をクリックするとメールボックスが作成されます。

メール転送

特定アドレス宛てのメールを指定アドレスに転送が可能です。

転送元に「*@your-domain.com」を入力すると、メールボックスや転送指定されていない「your-domain.com」ドメイン宛のメールがすべて転送されます。

Image
PostfixAdmin Forward

 

とりあえず、自ドメイン宛のメールを全部受信したい場合は重宝します。

以上で、簡単ですがPostfixAdminの利用方法でした。

 

次回はSPF/DKIMレコードの設定、DMARCのセットアップに進みます