メールサーバの構築 #3

Tech (Old)

今回は PostfixAdmin を使えるようにする。Virtual Mailbox での扱いになるので、設定等は MySQL に保存されるようにする。PostfixAdmin を使う=Apache を使う、なのでそのあたりの整備も。
とりあえず、MySQL のインストール・設定から。
その前に…

OS のタイムゾーンを JST に変更する。
端末で sudo timedatectl set-timezone Asia/Tokyo を実行。

MySQL のインストール・設定

PostfixAdmin が使う MySQL をインストール・設定する。
MySQL については、このところ認証プラグインの変更とか root でのアクセス等の変更で、いろいろあったのでちょっと面倒。

$ sudo apt install -y mysql-server-8.0

インストール自体はこれで終了。

/etc/mysql/mysql.conf.d/mysqld.cnf


 ↓
character-set-server=utf8mb4
collation-server=utf8mb4_bin

デフォルトで utf8mb4 を使うようにする。実際のところ、照合順についてはあまり理解できていない。

/etc/mysql/mysql.conf.d/mysql.cnf

 ↓
default-character-set = utf8mb4

クライアントがデフォルトで使う文字コードを utf8mb4 にする。

$ sudo mysql -u root

MySQL に root で接続する。普通に考えると sudo しないで -p オプション付けてパスワード入力というのがこれまでだったが、auth_socket プラグインを使って特権管理者だったら接続できるようにしている。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '<パスワード>';
mysql> quit;

ユーザ root の認証を mysql_native_password を使って行うように変更。同時にパスワードを設定する。

$ mysql_secure_installation

いろいろセキュリティ関連の簡単な調整をしてもらう。

  • VALIDATE PASSWORD COMPONENT は使わない
  • root のパスワードは変更しない
  • anonymous users を削除する
  • リモートからの root の接続を拒否する
  • テストデータベースの削除
  • privilege tables をリロードする
$ sudo mysql -u root -p

再度 MySQL に root で接続。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH 'auth_socket';
mysql> quit;

元に戻しておく。

Apache の調整

https を使えるようにして、PHP の準備。

/etc/apache2/sites-available/mail.hoge.com-ssl.conf


 ↓
<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerName mail.hoge.com
                ServerAdmin webmaster@hoge.com
                DocumentRoot /var/www/html/

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on
                SSLCertificateFile      /etc/letsencrypt/live/mail.hoge.com/cert.pem
                SSLCertificateKeyFile   /etc/letsencrypt/live/mail.hoge.com/privkey.pem
                SSLCertificateChainFile /etc/letsencrypt/live/mail.hoge.com/chain.pem

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
        </VirtualHost>
</IfModule>

/etc/apache2/sites-available/elrond.e-town.gr.jp-ssl.conf を作成。

$ sudo a2ensite mail.hoge.com-ssl
$ sudo a2enmod ssl
$ sudo systemctl restart apache2

サイト設定を有効にして、ssl を有効にする。Apache 再起動。

$ sudo apt install -y php8.1-fpm php8.1-imap php8.1-mbstring php8.1-mysql php8.1-curl php8.1-zip php8.1-xml php8.1-bz2 php8.1-intl php8.1-gmp php8.1-redis
$ sudo apt install -y libapache2-mod-php

PHP モジュール等のインストール。

PostfixAdmin の取得・インストール・設定

ファイルのダウンロードで必要な wget と、アクセス制御リストのユーティリティ acl を入れておく。端末で、sudo apt install -y wget acl を実行。

$ wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.13.tar.gz
$ sudo tar xvf postfixadmin-3.3.13.tar.gz -C /var/www/
$ sudo ln -s /var/www/postfixadmin-postfixadmin-3.3.13 /var/www/postfixadmin
$ sudo mkdir -p /var/www/postfixadmin/templates_c
$ sudo setfacl -R -m u:www-data:rwx /var/www/postfixadmin/templates_c/
$ sudo setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/

GitHub の PostfixAdmin のページで Releases を確認。最新版をダウンロードして /var/www/ に展開。シンボリックリンクをつくって、ディレクトリをつくって、アクセス制御リストを調整しておく。

$ sudo mysql -u root

MySQL で PostfixAdmin 用のデータベースをつくる。

mysql> create database postfixadmin;
mysql> create user 'postfixadmin'@'localhost' identified by '<パスワード>';
mysql> grant all privileges on postfixadmin.* to 'postfixadmin'@'localhost';
mysql> flush privileges;
mysql> quit;

データベース postfixadmin をつくって、ユーザ postfixadmin をつくる。
ユーザ postfixadmin にデータベース postfixadmin への権限を与える。
権限の変更を有効にして、おわり。

/var/www/postfixadmin/config.local.php

<?php
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_port'] = '3306';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = '<パスワード>';
$CONF['database_name'] = 'postfixadmin';
$CONF['encrypt'] = 'dovecot:ARGON2I';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5";
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
}
$CONF['password_expiration_enable'] = 'NO';
$CONF['password_expiration'] = 'NO';

PostfixAdmin の設定。

/etc/apache2/sites-available/mail.hoge.com.conf


 ↓
        Alias /pfadm "/var/www/postfixadmin/public"
        <Directory "/var/www/postfixadmin/public">
            Options FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>

ディレクトリをマウントする。

$ sudo systemctl reload apache2

Apache 再起動。
http://mail.hoge.com/pfadm/ にアクセスして PostfixAdmin の画面が表示されることを確認。

/etc/dovecot/conf.d/10-master.conf

service stats {
    unix_listener stats-reader {
    user = www-data
    group = www-data
    mode = 0660
}

unix_listener stats-writer {
    user = www-data
    group = www-data
    mode = 0660
  }
}

Dovecot のステータス等の取得をする設定。

$ sudo vi /etc/group
$ sudo systemctl restart dovecot
$ sudo setfacl -R -m u:www-data:rwx /var/run/dovecot/stats-reader /var/run/dovecot/stats-writer

www-data を dovecot グループに追加。/etc/group の修正内容は下記。
Dovecot を再起動して、アクセス制御の設定。

/etc/group

dovecot:x:122:www-data

ここまで出来たらブラウザで設定を行っていく。
https://mail.hoge.com/pfadm/setup.php をブラウザで開き、setup_password を設定する。

PostfixAdmin: Generate setup_password
$ sudo vi /var/www/postfixadmin/config.local.php

パスワードを入力して Generate… ボタンをクリックしたら「If you want to use the password…」のあとに「$CONF[‘setup_password’] = ‘<hash>‘;」のような内容が表示されるので、/var/www/postfixadmin/config.local.php に追加する。

Setup password を入力してログインする。
続いて、Add Superadmin Account を作成しておく。

Postfix が MySQL 上の設定を見るようにする

ここから Postfix が MySQL 上の設定を見るようにしていく。

$ sudo apt install -y postfix-mysql

postfix-mysql をインストール。

$ sudo vi /etc/postfix/main.cf

/etc/postfix/main.cf の修正。
以下の内容を ファイル末尾に追加。

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_domain_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
   virtual_transport = lmtp:unix:private/dovecot-lmtp

virtual_mailbox_domains はこのホストで扱うドメインを保存する。
virtual_mailbox_maps はメールボックスの場所を保存する。
virtual_alias_maps はエイリアスを保存する。
「proxy:mysql:」→MySQL を経由してデータを取得、「/etc/postfix/sql/mysql_virtual_alias_maps.cf」→接続方法やテーブルの読み方とかはこのファイルを参照、という感じ。
ローカル配送の設定も追加する。

$ sudo mkdir /etc/postfix/sql/

前記の設定ファイルの保存場所を作成。

/etc/postfix/sql/mysql_virtual_domains_maps.cf

user = postfixadmin
password = <パスワード>
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
#query = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
#expansion_limit = 100
/etc/postfix/sql/mysql_virtual_mailbox_maps.cf

user = postfixadmin
password = <パスワード>
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 = rnE8DujeWnLB
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_maps.cf

user = postfixadmin
password = rnE8DujeWnLB
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_maps.cf

user = postfixadmin
password = rnE8DujeWnLB
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_domain_catchall_maps.cf

# handles catch-all settings of target-domain
user = postfixadmin
password = rnE8DujeWnLB
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'
$ sudo chmod 0640 /etc/postfix/sql/*
$ sudo setfacl -R -m u:postfix:rx /etc/postfix/sql/

パスワード等の記載もあるので、アクセス権を変更しておく。
postconf mydestination して出力に hoge.com が含まれていたら削除する必要がある。sudo postconf -e "mydestination = \$myhostname, localhost.\$mydomain, localhost" を実行しておく。

$ sudo adduser vmail --system --group --uid 2000 --disabled-login --no-create-home
$ sudo mkdir /var/vmail/
$ sudo mkdir /var/vmail/
$ sudo chown vmail:vmail /var/vmail/ -R

メールボックスのオーナーになったりするユーザ vmail を作成する。
メールボックスのディレクトリを作成。

/etc/postfix/main.cf

 ↓
virtual_mailbox_base = /var/vmail
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000

Postfix にバーチャルメールボックスの設定を行う。

$ sudo systemctl restart postfix

Postfix を再起動。

Dovecot が MySQL 上の設定を見るようにする

Dovecot も MySQL 上の設定を見る必要がある。

/etc/dovecot/conf.d/10-mail.conf

mail_home = /var/vmail/%d/%n/

バーチャルメールボックスを使用=ホームディレクトリがない、なので、/etc/dovecot/conf.d/10-mail.conf に mail_home を設定。

/etc/dovecot/conf.d/10-auth.conf

auth_username_format = %u
auth_default_realm = hoge.com
#!include auth-system.conf.ext
!include auth-sql.conf.ext
auth_debug = yes
auth_debug_passwords = yes

/etc/dovecot/conf.d/10-auth.conf に記載のあるパラメタは修正、記載がないものは追加。

/etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=<パスワード>
default_pass_scheme = ARGON2I
password_query = \
  SELECT username AS user,password \
  FROM mailbox WHERE username = '%u' AND active = 1
user_query = \
  SELECT maildir, 2000 AS uid, 2000 AS gid \
  FROM mailbox WHERE username = '%u' AND active = 1
iterate_query = SELECT username AS user FROM mailbox

/etc/dovecot/dovecot-sql.conf.ext を修正。

$ sudo systemctl restart dovecot

コメント

タイトルとURLをコピーしました