Taifuh.com

阿部のFacebookからの転載ブログ

雑記

ラズパイ4でサーバ構築 その3

投稿日:2021年5月20日 更新日:

さて、お次は最も面倒だったメールサーバの設定だ。本当はクラウド上へ引っ越ししたいのだが、先延ばしになり、またもや自前のサーバに構築してしまった・・・・。

Postfixのインストールと設定

単に taifuh.com のドメインのメールを処理するだけなら比較的に容易なのだが、訳あってメーリングリストや複数ドメインのメールサーバとして動作しなければならない。また postfix.admin を活用して各種メールアカウントの設定を行う訳だが、それらは全て SQL データベースである MariaDB 経由でやり取りが行われる。これらを実現するためバーチャル・メールボックスの設定や SQL のスクリプト等々かなり煩雑になっている。

今回のサーバ構築はゼロからではなく、既存サーバからの引っ越しのため、アカウント設定については MariaDB のデータの引っ越しとなる。phpMyAdmin を利用して事前にデータベースを作成しデータを移行しておく。

インストールするのは以下のパッケージだ。今回は postfix と postfixadmin の説明に留めるが、dobecot や mailman も一緒にインストールしておく。

$ apt-get -y install postfix postfixadmin libsasl2-modules dovecot-core dovecot-imapd dovecot-pop3d mailman 

Postfixの設定 – バーチャル・メールボックス系

バーチャル・メールボックス用のユーザを作成し、ディレクトリを作成する。仮にグループID (gid) も ユーザID (uid) も 5000 としておく。

$ groupadd -g 5000 vmailuser
$ useradd -u 5000 -g vmailuser -s /sbin/nologin vmailuser
$ mkdir -p /var/spool/virtual
$ chown -R vmailuser:vmailuser /var/spool/virtual

postfixにバーチャルメールボックスの設定を行う。
postfix.adminでの設定は全てMariaDBのpostfixテーブルに保存される。各種設定値を読み込むため、各所でproxy:mysql指定を行う。

/etc/postfix/main.cf

virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf

なお、上記で指定されるsqlの設定は以下である。

/etc/postfix/sql/mysql_virtual_domains_maps.cf

user = postfixadmin
password = PASSWORD
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and active = '1'

メールを保存するためのベースとなるディレクトリ、メールボックス、エイリアスを指定。これらは全てMariaDBのpostfixテーブルより読み込む。それらのsql設定も以下に列挙しておく。

/etc/postfix/main.cf

virtual_mailbox_base = /var/spool/virtual

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,
   hash:/var/lib/mailman/data/virtual-mailman

/etc/postfix/sql/mysql_virtual_mailbox_maps.cf

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

/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

user = postfixadmin
password = PASSWORD
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/sql/mysql_virtual_alias_maps.cf

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

/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf

user = postfixadmin
password = PASSWORD
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/sql/mysql_virtual_alias_domain_catchall_maps.cf

user = postfixadmin
password = PASSWORD
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'

その他、ユーザーIDやメールの受信にlmtp経由のdovecotを利用するなどの基本的な設定を行う。

/etc/postfix/main.cf

virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

virtual_transport = lmtp:unix:private/dovecot-lmtp

Postfixの設定 – セキュリティ系

メールサーバの穴を突いた不正中継で大量のスパムメールを巻き散らかすことのないよう、セキュリティ対策を施す。また、TLSを有効にしてSTARTTLSをサポートさせるほか、smtpd_client_restrictionではスパムメールの抑制を行う設定も行う。

/etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $mydomain

smtpd_tls_security_level = may
smtpd_tls_cert_file=/etc/letsencrypt/live/taifuh.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/taifuh.com/privkey.pem
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_sasl_authenticated_header = yes

smtpd_helo_required = yes

smtpd_relay_restrictions = 
        permit_mynetworks,
        permit_sasl_authenticated,
        defer_unauth_destination

smtpd_client_restrictions =
        permit_mynetworks,
        reject_rbl_client bl.spamcop.net,
        reject_rbl_client cbl.abuseat.org,
        reject_rbl_client zen.spamhaus.org,
        permit

smtpd_sender_restrictions =
        permit_sasl_authenticated,
        permit

smtpd_recipient_restrictions =
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        permit_mynetworks,
        permit_sasl_authenticated,
        permit

証明書や秘密鍵の設定はletsencryptで生成されたものを使用している。

Postfixの設定 – MTA間通信にTLSを使用

外部のMTA,例えばGmailのメールサーバへメールを投げる際、TLSによる暗号化がなされていないと、メールに赤い錠マークが表示されてしまう。よりセキュアなメール配信のため、メールの暗号化を行うTLSの設定を行う。

/etc/postfix/main.cf

smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_security_level = may
smtp_tls_CAfile = /etc/letsencrypt/live/taifuh.com/fullchain.pem

証明書はSASL同様にletsencryptで生成したものを使用する。

最後にmaster.cfを修正して終わりだ。submission (port587)を有効化するのと、dovecotとmailmanの設定を追加しておく。

/etc/postfix/master.cf

submission inet n - y - - smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_helo_restrictions=$mua_helo_restrictions

dovecot unix - n n - - pipe 
  flags=DRhu user=vmailuser:vmailuser argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

mailman unix - n n - - pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}

ふぅ、やっとpostfixの設定は終わりだ。

Postfix.adminの設定

postfixのメールアカウント系の設定を全てWebで可能とするPostfix.adminを導入する。それにしても最新版だと色々と変更が入ったようで戸惑ってしまった。今まで /postfixadmin/ 直下からログインしていたのだが、/postfixadmin/public/ となったようだ。

apache2の設定だが、デフォルトでインストールされる postfixadmin のルートは /usr/share/postfixadmin なのだが、設定も過多となりどうにも使いづらい。postfixadmin のディレクトリを通常使っているルートディレクトリの下へ移動し、以下の設定のみを追加。

/etc/apache2/sites-enabled/default-ssl.conf

<VirtualHost *:80 *:443>
 .... 諸々略 ....
         <Directory "/home/www/top/postfixadmin/public">
                Options FollowSymLinks
                AllowOverride None
                Allow from all
                Order allow,deny
                Require local
                Require ip 192.168.0.0/24 125.199.204.70/32
        </Directory>
</VirtualHost>

早速アクセスしてみると、template_c 云々のエラーが出る。以前のバージョンでそんな事したっけかなぁ。色々と変わっている様である。ディレクトリを掘って、属性設定しておく。

$ mkdir /home/www/top/postfixadmin/templates_c
$ chown www-data:www-data /home/www/top/postfixadmin/templates_c

Postfix.admin の各種設定は従来では conf.ini.php に直接書いていたのだが、アップデートの際に色々と不整合を生じるとのことで、config.local.php でオーバーライドする方式に変わったようだ。/etc/postfixadmin/ の下に作成し、postfixadmin のルートディレクトリにリンクを張っておく。

$ touch /etc/postfixadmin/config.local.php
$ ln -s /etc/postfixadmin/config.local.php /home/www/top/postfixadmin/

/etc/postfixadmin/config.local.php

<?php

$CONF['default_language'] = 'ja';

$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'PASSWORD';
$CONF['database_name'] = 'postfix';

$CONF['admin_email'] = 'postmaster@taifuh.com';
$CONF['encrypt'] = 'dovecot:CRAM-MD5';

$CONF['default_aliases'] = array (
     'abuse' => 'abe@taifuh.com',
     'hostmaster' => 'abe@taifuh.com',
     'postmaster' => 'abe@taifuh.com',
     'webmaster' => 'abe@taifuh.com'
);

$CONF['vacation_domain'] = 'taifuh.com';

// バーチャルメールボックス処理関係のスクリプト
$CONF['mailbox_postcreation_script']=
    'sudo -u vmailuser /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postdeletion_script']=
    'sudo -u vmailuser /usr/local/bin/postfixadmin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script']=
    'sudo -u vmailuser /usr/local/bin/postfixadmin/postfixadmin-domain-postdeletion.sh';

?>

Postfix.admin でユーザー作成しても、デフォルトの状態では postfix のバーチャル・メールボックスを自動作成してくれるわけではないので、用意されているスクリプトを /usr/local/bin/postfixadmin に移してカスタマイズして利用する。

$ mkdir /usr/local/bin/postfixadmin
$ cp /usr/share/doc/postfixadmin/examples/postfixadmin-mailbox-postcreation.sh /usr/local/bin/postfixadmin
$ cp /usr/share/doc/postfixadmin/examples/postfixadmin-mailbox-postdeletion.sh /usr/local/bin/postfixadmin
$ cp /usr/share/doc/postfixadmin/examples/postfixadmin-domain-postdeletion.sh /usr/local/bin/postfixadmin
$ chmod 755 /usr/local/bin/postfixadmin/postfixadmin*

但し、このスクリプトだとバーチャル・メールボックスの生成の際にエラーが発生する。良く分からないのだが、ディレクトリ作成に mailmake という不明のコマンドが使われていたり、バーチャル・メールボックスのディレクトリが直に指定されていたりで、どうにもポータビリティの悪さが残っている。コンフィギュレーションを local にしろという割には色々と不備があるのが不満だが、以下の通り修正する。

/usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh

basedir=/var/spool/virtual
....中略....
mkdir "$maildir"

/usr/local/bin/postfixadmin/postfixadmin-mailbox-postdeletion.sh
/usr/local/bin/postfixadmin/postfixadmin-domain-postdeletion.sh

basedir=/var/spool/virtual

上記の削除系スクリプトは一気に消してしまうのではなく、deletion ディレクトリに mv する形なので、その先のディレクトリを作成しておく。

$ mkdir -p /home/vmail/deleted-maildirs
$ chmod -R 770 /home/vmail/deleted-maildirs
$ chown vmailuser:vmailuser /home/vmail/deleted-maildirs

このスクリプト群は vmailuser 権限で実行する必要があるため、/etc/sudors を以下の通り追加する。
具体的には apache2 は www-data ユーザで実行されているわけだが、ALL=(ALL:ALL) として、どんなユーザにでも sudo 出来るようにしておく。

/etc/sudoers

www-data ALL=(ALL:ALL) NOPASSWD: ALL

というところで、postfix系の設定は終了。メールとしては dovecot とメーリングリストの mailman がまだまだ残っているが、長くなってしまったので次回へ続くとする。

にしても、メール系は色々と面倒だ。


-雑記
-, , , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

2021年11月
1234567
891011121314
15161718192021
22232425262728
2930