PostfixAdminの導入

dovecot

postfixとdovecotで同じようなテーブルを持っているがこれらをメンテするのはちょっと大変かも。virtualmailbox化しているので、この機会にPostfixadminに移行してみる。

前提条件

postfix/dovecotでvirtualmailbox設定が終わっていること。

mariadb

postfixadmin用のデータベースを作成する。

CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfixpassword';
GRANT ALL PRIVILEGES ON postfix.* TO postfix@localhost identified by 'postfixpassword';
FLUSH PRIVILEGES;

php-fpm

/etc/php-fpm.d/www.conf

[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000

もし上記の修正を加える前にphp-fpmを起動した場合は以下のコマンドを実行してファイルのグループ所有者を変更しておく。

/var/lib/php

# cd /var/lib/php
# chgrp nginx session

/var/log/php-fpm

# cd /var/log/php-fpm
# chgrp nginx session

postfixadminのインストール

インストール

fedoraではパッケージ化されていないので本家からパッケージを持ってくる。

# cd /tmp
# wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.13.tar.gz
# cd /srv
# gzip -dc /tmp/postfixadmin-3.3.13.tar.gz | tar xvf -
# mv postfixadmin-postfixadmin-3.3.13 postfixadmin

定義体の作成

セットアップパスワードの生成

以下のコマンドを実行し、セットアップパスワードの生成を行う。ここで生成したパスワードは/srv/postfixadmin/config.local.phpで使用する。

# php -r "echo password_hash('セットアップパスワード', PASSWORD_DEFAULT);"

/srv/postfixadmin/config.local.phpの作成

/srv/postfixadmin/config.local.phpを以下の内容で作成する。

<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'databasepassword';
$CONF['database_name'] = 'postfix';
$CONF['configured'] = true;
$CONF['setup_password'] = '先ほど作成したパスワード';
$CONF['emailcheck_resolve_domain'] = 'NO';
$CONF['password_validation'] = array(
    '/.{3}/' => 'password_too_short 3',
    '/([a-zA-Z].*){0}/' => 'password_no_characters 0',
    '/([0-9].*){0}/'  => 'password_no_digits 0',
);
?>

nginxの設定

以下の内容を追加する。

    server {
        listen  80;
        listen  [::]:80;
        server_name     postfixadmin.example.com;

        rewrite ^(.*)$ https://postfixadmin.example.com$1 permanent;
    }

    server {
         listen       443 ssl http2;
         listen       [::]:443 ssl http2;
         server_name     postfixadmin.example.com;
         root   /srv;
            ssl_certificate "/etc/letsencrypt/live/example.com/fullchain.pem";
            ssl_certificate_key "/etc/letsencrypt/live/example.com/privkey.pem";
            ssl_session_cache shared:SSL:1m;
            ssl_session_timeout  10m;
            ssl_ciphers PROFILE=SYSTEM;
            ssl_prefer_server_ciphers on;

         fastcgi_read_timeout 480;

         error_page 404 /?error=404;
         client_max_body_size 100M;
         location /postfixadmin {
             alias   /srv/postfixadmin/public;
             index  index.php index.html;
             try_files $uri $uri/ =404;

             proxy_read_timeout 300;

             location ~ \.php$ {
                     fastcgi_pass   127.0.0.1:9000;
                     fastcgi_index  index.php;
                     fastcgi_param  SCRIPT_FILENAME  $request_filename;
                     include         fastcgi_params;
             }
         }
    }

SELinux

以下のコマンドを実行しておく。

# semanage fcontext -a -t httpd_sys_content_t "/srv/postfixadmin(/.*)?"
# semanage fcontext -a -t httpd_sys_rw_content_t "/srv/postfixadmin/templates_c(/.*)?"
# restorecon -R /srv/postfixadmin
# semanage boolean -m --on httpd_can_network_connect_db

postfixadminの初期設定とドメインの作成

初期設定

ここまでの設定で、postfixadminのセットアップ画面に接続できるはずである。

接続には上記で設定したセットアップパスワードを使用する。

https://postfixadmin.example.com/postfixadmin/setup.phpに接続して初期設定を行う。

管理者IDはメール形式で作成する必要がある。そのIDにメールが到達する必要はない。

パスワードは3文字以上ならなんでも通るようにしてある。

ドメイン登録

初期設定が終わったら、https://postfixadmin.example.com/postfixadmin/login.phpに接続してドメイン作成を行っておく。

メールアドレスの登録

当サイトではこのタイミングでアドレスの登録まで実施した。が、登録時にメールを発信するようなので、postfix/dovecotの設定が終わったタイミングで行うのがいいのかもしれない。

dovecotとpostfixの設定

データのバックアップと定義体のバックアップ

メールスプールのバックアップと/etc/postfixと/etc/dovecotのバックアップを取っておく。

postfixおよびdovedotの停止

ここからの作業で心配なのは、設定のミス・誤りでテスト中に外部からのメールをロストする可能性があるということである。設定作業はpostfixおよびdovecotを停止して行うことを推奨する。必要であればfirewall等でアクセス制限を行っておく。

必要なパッケージのインストール

メモによると以下のようなパッケージをインストールしている。

# dnf -y install mariadb mariadb-server mariadb-devel
# dnf -y install postfix-mysql dovecot-mysql
# dnf -y install php-fpm php php-fedora-autoloader php-pecl-zip php-pecl-xmlrpc php-common php-cli php-pdo php-xml php-nikic-php-parser4 php-fpm php-mbstring php-opcache php-process php-sodium php-pear php-devel php-mysqlnd php-odbc php-pgsql php-bcmath php-dba php-dbg php-embedded php-enchant php-gd php-gmp php-intl php-ldap php-snmp php-soap

dovecotの設定

以下のファイルの修正を行う。

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

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ext
!include auth-static.conf.ext

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

connect = host=localhost dbname=postfix user=postfix password=(postfixpassword)
driver = mysql

password_query = \
    SELECT \
      username AS user, \
      password \
    FROM \
      mailbox \
    WHERE username = '%u' AND active='1'

user_query = \
    SELECT \
      CONCAT('/var/mail/vmailbox/', maildir) AS home \
    FROM \
      mailbox \
    WHERE username = '%u' AND active='1'

iterate_query = SELECT username as user FROM mailbox WHERE active = '1'

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

mail_location = maildir:/var/mail/vmailbox/%d/%n
namespace inbox {
}
mail_uid = vmailbox
mail_gid = vmailbox
protocol !indexer-worker {
}
mbox_write_locks = fcntl

postfixの設定

main.cfの修正と新規ファイルの作成を行う。

/etc/postfix/main.cf

主な定義部分。

myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination =
mynetworks_style = subnet
mynetworks = 192.168.0.0/16, 127.0.0.0/8, [::1]/128
relay_domains = $mydestination
relayhost = [smtp.gmail.com]:587
mail_spool_directory =
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_use_tls = yes
smtp_use_tls = yes
tls_server_sni_maps = hash:/etc/postfix/sni
disable_vrfy_command = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
virtual_mailbox_domains =
        mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps =
        mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf,
        mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_mailbox_base = /var/mail/vmailbox
virtual_alias_maps =
        mysql:/etc/postfix/mysql_virtual_alias_maps.cf,
        mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf,
        mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
virtual_transport = lmtp:inet:127.0.0.1:24

/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf

user = postfix
password = postfixpassword
hosts = localhost
dbname = postfix
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'

/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf

user = postfix
password = postfixpassword
hosts = localhost
dbname = postfix
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/mysql_virtual_alias_domain_maps.cf

user = postfix
password = postfixpassword
hosts = localhost
dbname = postfix
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/mysql_virtual_alias_maps.cf

user = postfix
password = postfixpassword
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

/etc/postfix/mysql_virtual_domains_maps.cf

user = postfix
password = postfixpassword
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'

/etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfix
password = postfixpassword
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

dovecotおよびpostfixの再起動

定義体のチェックを行い、dovecotおよびpostfixの再起動を行う。定義に自信がない場合は、firewall等でメール関連のポートを制限しておこう。

postfixadminでアドレスの登録

アドレスの登録をどのタイミングで行うといいのかよくわからなかったというのを先ほど記述したが、ここがいいのかもしれない。

動作確認~運用開始

メール送信受信、postfixadminのユーザ登録・削除、ドメイン登録・削除などのテストを行う。

ユーザ削除とメールスプール

postfixadminでユーザ削除を行ってみたが、メールスプールは削除されなかった。

コメント

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