ユーザ用ツール

サイト用ツール


サイドバー

Index

はじめてのおつかい






DokuWiki整形記法


PlayGround



serverapps:postfix:postfix-mysql-dovecot

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

インストールするもの

  • postfix1)
  • dovecot22)
  • mysql
  • apache
  • php5
  • php5-imap3)
  • postfixadmin4)
  • Adminer おまけ

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”なので注意

参考

1)
mysqlをONにした。指定はてきとー
2) , 4)
mysqlをON
3)
postfixadminでimap管理に必要
5)
ファイルはないけど特権管理者の場合はmotd-admin.txt
serverapps/postfix/postfix-mysql-dovecot.txt · 最終更新: 2024/02/26 17:17 by hayashi