postfixadmin」タグアーカイブ

約2億年ぶり

サーバー移転の勅

古いサーバーのままシコシコ運用してたんですが、流石にそろそろ更新するべえとなりまして、今どきの環境に引っ越してきました。

今回はこんな感じです。

  • 機能ごとにコンテナでシステム分割
  • IPv6対応
  • DKIM/DMARC対応

ホストについて

ubuntu 26.04をdigitaloceanのインスタンスで起動してます。

各コンテナについて

コンテナはincusを使ってます。

  • web – nginx(これとか、管理用とか)
  • mail – postfix / dovecot / rspamd
  • db – mariadb
nginx

nginxもphp-fpmもaptでさっくりでございます。php-fpmの起動ユーザがwww-dataなのはちょっと可愛くないのでblog専用ユーザを作って彼におまかせしております。

POSTFIX+DOVECOT+RSPAMD+POSTFIXADMIN

ここが今回の更新の肝で、イマドキの認証、SPF/DKIM/DMARCに対応させたいので、DNSの設定は外部のdigitaloceanのDNSとか使いました。

SPFは前から設定済みなんですが、DNSのTXTレコードで

@ TXT 3600 "v=spf1 +mx +a -all"

みたいな感じでMXレコードとAレコードのサーバー以外からは駄目ですよ、って教えておく感じですね。

DKIMですが、これは公開鍵認証でサーバー側に秘密鍵をおいて署名して、公開鍵で検証することで送信元がちゃんとしてまっせっていうやつです。

まずはrspamadmで鍵ペアを作成します。作成すると公開鍵が表示されてるのでそれをコピってペってDNSのTXTレコードに貼り付けます。

あとはrspamdがよしなにしてくれるように、どの鍵を使ったら良いのか設定します。

% sudo rspamadm dkim_keygen -d samai.net -s mail -k /var/lib/rspamd/dkim/samai.net.mail.key
mail._domainkey TXT 3600 "v=DKIM1; k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GN......"
# /etc/rspamd/local.d/dkim_signing.conf

enabled = true;
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;

postfixにrspamdをmilterとして呼び出せるように設定しておきます。

# /etc/postfix/main.cf

# Rspamd (Milter) 連携設定
smtpd_milters = inet:localhost:11332
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

ここまでいけたらあとは送受信のチェックでうまく動けばOKのはず。一旦ローカルで受けるようにしておいて、unixuser@yourdomain宛にメール送信テスト

# /etc/postfix/main.cf

home_mailbox = Maildir/
mydestination = $myhostname, yourdomain, mail, localhost.localdomain, localhost
%  echo "hello local user!" | mail -s "test"  you@yourdomain

次にdovecotをsmtp認証にも使いつつ、postfixadmin用にバーチャルドメインの設定をしてしまいます。

dovecot with mysql auth, postfixadmin

まずはpostfixにバーチャルドメインで受けられるようにmysql参照させます。

# mysql
CREATE DATABASE postfixadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'postfixadmin'@'localhost' IDENTIFIED BY '強固なパスワード';
GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixadmin'@'localhost';

-- Postfix / Dovecot 用(参照専用ユーザー)
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY '参照用パスワード';
GRANT SELECT ON postfixadmin.* TO 'mailuser'@'localhost';

FLUSH PRIVILEGES;
# /etc/postfix/sql/mysql_virtual_alias_maps.cf
user = mailuser
password = 参照用パスワード
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active='1'
# /etc/postfix/sql/mysql_virtual_domains.cf
user = mailuser
password = 参照用パスワード
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active='1'
# /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
user = mailuser
password = 参照用パスワード
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active='1'
# /etc/dovecot/conf.d/auth-sql.conf.ext
sql_driver = mysql
mysql localhost {
	 dbname=postfixadmin
	 user=mailuser
	 password=参照用パスワード
}
passdb sql {
	default_password_scheme = SHA512-CRYPT
	query = SELECT username AS user,password FROM mailbox WHERE username = '%{user}' AND active='1'
}
userdb sql {
	query = SELECT CONCAT('/var/mail/vmail/', maildir) AS home, CONCAT('maildir:/var/mail/vmail/', maildir) AS mail, 5000 AS uid, 5000 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%{user}' AND active='1'
}
# /etc/dovecot/conf.d/10-auth.conf
# commentを取って有効化
!include auth-sql.conf.ext
# /etc/dovecot/conf.d/10-mail.conf 

mail_driver = maildir
mail_path = %{home}

mail_uid = 5000
mail_gid = 5000

first_valid_uid = 5000
last_valid_uid = 5000
# /etc/dovecot/conf.d/10-master.conf

service auth {
...
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
...
}
# /etc/postfix/main.cf

# virtural domains
virtual_mailbox_base = /var/mail/vmail
virtual_mailbox_domains = mysql:/etc/postfix/sql/mysql_virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# sasl_auth by dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/private/auth
smtpd_sasl_auth_enable = yes
# 587 (submission) や 465 (smtps) 用の標準的な制限設定
smtpd_relay_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination
% sudo groupadd -g 5000 vmail
% sudo useradd -g 5000 -u 5000 -s /bin/false -d /var/mail/vmail -k /dev/null
% sudo chmod 755 /var/mail/vmail
% sudo chown vmail:vmail /var/mail/vmail

最後にpostfixadminを導入して、postfixadmin用のmysqlアカウントの設定してあげればきっと多分動くと思う。

# postfixadmin config.local.php

<?php
// values in here override what is in config.inc.php.
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = '強固なパスワード';
$CONF['database_name'] = 'postfixadmin';
$CONF['encrypt'] = 'dovecot:SHA512';
$CONF['configured'] = true;

// ドメイン別ディレクトリ構造 (Dovecotの %d/%n/ と合わせる)
$CONF['domain_path'] = 'YES';
$CONF['domain_in_filepath'] = 'NO';
$CONF['setup_password'] = 'yourencryptedpassword';
$CONF["admin_email"] = "Support Person <yourmailaddress>";
$CONF['password_expiration'] = 'NO';

$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';