目次
postfix + mysql + Dovecot + PostfixAdmin
この文章は
表題組み合わせのサーバ設定記録。
OS:FreeBSD
2017.07.07:Update
- 最新のファイル構成などに変更
- DB上のパスワードはSHA512で暗号化するよう変更
経緯
ちと、理由があって認証をMySQLにする。
- バーチャルドメイン
- imap対応
- smtp Auth
- パスワード暗号化(SHA512)
バーチャルドメインに対応するためメール保存ユーザを作成する。
# pw groupadd -n vir_mail -g 110 # pw useradd -n vir_mail -u 110 -g vir_mail -m
インストールするもの
DB作成
AdminerからDBを作成しました。
- DB名:postfix
ついでにユーザも
- ユーザ名:postfix
- パスワード:ぱすわーど
- 権限:All privileges
CREATE DATABASE postfix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'postfix'@'%' IDENTIFIED BY 'pa$$w0rd12345678'; GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'%'; FLUSH PRIVILEGES;
php.ini
# cat /usr/local/etc/php.ini date.timezone = Asia/Tokyo
これがないと、postfixadminのバックアップがエラーになります。
SPFレコードの登録
最近だとSPFレコードがないと大手のメールサーバ(gmailとか)はメールを受け取ってくれません。
設定については、SPF(Sender Policy Framework)を参照してください
/usr/local/etc/postfix/main.cf
mydestination = ## Virtual virtual_mailbox_base = /home/vir_mail virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_domains_maps.cf virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf #virtual_alias_domains = $virtual_alias_maps #デフォルト値 virtual_uid_maps = static:110 virtual_gid_maps = static:110 ### SMTP Auth smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination # broken_sasl_auth_clients = yes ### VDA # virtual_create_maildirsize = yes # unused parameter virtual_mailbox_limit = 0 #virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_quota_maps.cf # unused parameter #virtual_mailbox_limit_override = yes # unused parameter #virtual_mailbox_limit_inbox = no # unused parameter #virtual_maildir_extended = yes # unused parameter #virtual_maildir_suffix = Maildir/ #virtual_trash_count = yes #virtual_trash_name = ".Trash" #virtual_maildir_limit_message = "Sorry, maximum quota reached!" #virtual_overquota_bounce = yes # unused parameter ## soft quota settings #message_size_limit = 10240000 #default 10MB #mailbox_size_limit = 51200000 #default 50MB message_size_limit = 0 mailbox_size_limit = 0
今回はバーチャルのみで運用するので、mydestination は空にしておく。
廃止されたパラメータ
- virtual_create_maildirsize
- virtual_overquota_bounce
- virtual_mailbox_limit_maps
- virtual_maildir_extended
- virtual_mailbox_limit_override
- virtual_mailbox_limit_inbox
/usr/local/etc/postfix/master.cf
Outbound Port25 Blocking (OP25B)に対応するため、Submissionポートを利用できるようにする
#submission inet n - n - - smtpd ↓ submission inet n - n - - smtpd
バーチャル関連ファイル
/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix password = ******** hosts = localhost dbname = postfix table = alias select_field = goto where_field = address
/usr/local/etc/postfix/mysql_virtual_mailbox_domains_maps.cf
user = postfix password = ******** hosts = localhost dbname = postfix table = domain select_field = description where_field = domain
/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix password = ******** hosts = localhost dbname = postfix table = mailbox select_field = maildir where_field = username
postfixAdminのセットアップ
/usr/local/www/postfixadmin/config.local.phpを作成してここに設定する
# vi /usr/local/www/postfixadmin/config.local.php
<?php $CONF['configured'] = true; $CONF['default_language'] = 'ja'; $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'データベースパスワード'; $CONF['database_name'] = 'postfix'; $CONF['admin_email'] = 'サイト管理者メールアドレス'; $CONF['alias_domain'] = 'NO'; // PostfixAdmin管理画面のフッターメニューの非表示 $CONF['show_footer_text'] = 'NO'; // パスワード格納 // $CONF['encrypt'] = 'cleartext'; <= テストの時なら // $CONF['encrypt'] = 'dovecot:SHA512-CRYPT'; <= 古い // $CONF['encrypt'] = 'php_crypt'; // SHA512 <= deafult((2024-02-26現在)) // ドメイン、アカウント追加時にドメイン部分をDNSでチェックするかどうか。 // YESにするとMXレコードを参照できないドメインを登録できなくなる。 // defaultはYES // $CONF['emailcheck_resolve_domain']='YES'; // Dfault Quota 10MB $CONF['maxquota'] = '10'; // ユーザのmailbox容量を制限する場合 // $CONF['quota'] = 'YES'; // $CONF['quota_multiplier'] = '1024000'; // Welcome Message $CONF['welcome_text'] = <<<EOM ようこそ! メールボックスの作成が完了しました。 EOM; //セットアップパスワード。後述するhashを記述します $CONF['setup_password'] = ''; ?>
2017.07.07:
- 変更されているので注意:
- $CONF['database_type']='mysql'; → $CONF['database_type']='mysqli';
- オプションの「-s SHA512-CRYPT」を指定してるサイトもあるが、指定しなくてもOK
- $CONF['dovecotpw'] = “/usr/local/bin/doveadm pw”;
2024-02-26:
- 暗号化形式は以下がdefault
- # $CONF['encrypt'] = 'php_crypt';
- default設定されてるので不要になりました
- $CONF['dovecotpw'] = “/usr/local/bin/doveadm pw”;
- # メールボックスの格納形式。domain.tld/username に設定
- $CONF['domain_path'] = 'YES';
- $CONF['domain_in_mailbox'] = 'NO';
apache
<IfModule alias_module> Alias /postfixadmin/ "/usr/local/www/postfixadmin/" <Directory "/usr/local/www/postfixadmin"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from xxx.yyy.zzz </Directory> </IfModule>
初回パスワードのハッシュ値を生成する
# php -r "echo password_hash('pa$$w0rd1234', PASSWORD_DEFAULT);"
$CONF['setup_password'] = '1234567ab890cxxxxxxxxxxx:yyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzz';
または、コマンドラインで以下のように生成することもできます。
echo -n "{salt}:{password}" | openssl sha1 (stdin)= {hash文字列}
以下のように記述します
$CONF['setup_password'] = '{salt}:{hash文字列}';
この設定の後、このページでPostfix Adminの管理者を作成します。
※パスワードには最低2文字の数字を含む必要があります。
postfixadminにアクセス
LoginできたらOK
setup.php を削除
# rm /usr/local/www/postfixadmin/setup.php
※Ver 2.3以降削除の必要はなくなりました
Announcement
ドメイン管理とかユーザでLoginするとAnnouncementが表示されます。
ドメイン管理ならmotd.txt、ユーザはmotd-users.txtが表示されます。5)
邪魔なので表示されないようにします
# mv motd.txt motd.txt.org
# mv motd-users.txt motd-users.txt.org
2017.07.07:Announcementは廃止されている
Dovecot
/usr/local/docecot/dovecot.conf
最終行のあたりが以下のようになっていることを確認
!include conf.d/*.conf !include_try local.conf
/usr/local/docecot/local.conf
protocols = pop3 imap listen = *
10-auth.conf
disable_plaintext_auth = no # ここをyesにするとsslが必須になります auth_mechanisms = PLAIN LOGIN #!include auth-system.conf.ext !include auth-sql.conf.ext
10-mail.conf
mail_location = maildir:/home/vir_mail/%d/%n first_valid_uid = 110 first_valid_gid = 110
10-master.conf
service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 } }
10-ssl.conf
ssl = no
20-imap.conf
protocol imap { imap_client_workarounds = delay-newmail tb-extra-mailbox-sep mail_plugins = quota imap_quota }
20-pop3.conf
protocol pop3 { pop3_client_workarounds = outlook-no-nuls oe-ns-eoh mail_plugins = quota }
90-quota.conf
plugin { quota = maildir:User quota }
auth-sql.conf.ext
passdb { driver = sql args = /usr/local/etc/dovecot/dovecot-postfixadmin-mysql.conf } userdb { driver = sql args = /usr/local/etc/dovecot/dovecot-postfixadmin-mysql.conf }
dovecot-postfixadmin-mysql.conf
driver = mysql connect = host=/var/run/mysqld/mysqld.sock dbname=postfix user=postfix password=******** default_pass_scheme = PLAIN password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = 1 user_query = SELECT concat('/home/vir_mail/', maildir) AS home, 110 AS uid,\ 110 AS gid FROM mailbox WHERE username = '%u' AND active = '1'
※postfixadminでは”mysqli”ですがここでは”mysql”なので注意