Linux/Postfix+MySQL+Postfix AdminによるバーチャルSMTPサーバの構築

Postfix+MySQL+PostfixAdminによるバーチャルSMTPサーバの構築

dokuwiki.fl8.jp掲載済

MySQLインストール

# yum install mysql-server 
# chkconfig mysqld on 
# service mysqld start 

Postfix用のデータベース作成

# mysql 
mysql> create database postfix; 
mysql> grant all privileges on postfix.* to postfix@localhost identified by 'xxpostfix'; 

Postfixインストール

・バーチャルに対応する為、パッチをあて再構築

# cd /usr/local/src 
# wget http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.4/os/SRPMS/postfix-2.3.3-2.1.el5_2.src.rpm 
# mkdir -p /usr/src/redhat/SOURCES 
# rpm -ivh postfix-2.3.3-2.1.el5_2.src.rpm 
# cd /usr/src/redhat/SOURCES 
# wget http://vda.sourceforge.net/VDA/postfix-2.3.3-vda.patch.gz 
# gunzip postfix-2.3.3-vda.patch.gz 
# wget http://k2net.hakuba.jp/pub/postfix-sleep.patch
# cd /usr/src/redhat/SPECS/ 
# cp postfix.spec postfix.spec.old 
# vi postfix.spec 
------- 変更と追加 ------- 
2 %define MYSQL 0 
     ↓ 
2 %define MYSQL 1 

84 Patch11: postfix-2.3.3-vda.patch 
85 Patch12: postfix-sleep.patch 

141 %patch11 -p1 -b .vda 
142 %patch12 -p1 -b .sleep 

# yum -y install pkgconfig rpm-build db4-devel zlib-devel openldap-devel cyrus-sasl-devel pcre-devel mysql-devel openssl-devel 
# mkdir -p /usr/src/redhat/BUILD 
# mkdir -p /usr/src/redhat/SRPMS 
# mkdir -p /usr/src/redhat/RPMS/x86_64 
# rpmbuild -ba postfix.spec 

・インストール

#rpm -Uhv /usr/src/redhat/RPMS/x86_64/postfix-2.3.3-2.1.x86_64.rpm 

・yumの設定でpostfixを除外しておく。

# vi /etc/yum.conf 
--------- 最後に追加 ------------- 
exclude=postfix* 

・chkconfig

# chkconfig postfix on 

・main.cfの作成

# vi /etc/postfix/main.cf 
    70 myhostname = test.flateight.com 
    92 myorigin = $myhostname 
   107 #inet_interfaces = all 
   109 inet_interfaces = $myhostname, localhost 
   155 #mydestination = $myhostname, localhost.$mydomain, localhost 
   158 mydestination = 
   288 relay_domains = $mydestination 
   256 mynetworks = 168.100.189.0/28, 127.0.0.0/8, 174.143.151.0/24 
   411 home_mailbox = Maildir/ 
   563 smtpd_banner = $myhostname ESMTP unknown 
   637 sendmail_path = /usr/sbin/sendmail 

---------- 追加 ---------- 
smtpd_sasl_auth_enable = yes 
smtpd_sasl_type = dovecot 
smtpd_sasl_path = private/auth 
smtpd_sasl_local_domain = $myhostname 
smtpd_recipient_restrictions = 
    permit_mynetworks 
    permit_sasl_authenticated 
    reject_unauth_destination 
 
message_size_limit = 10485760 
 
smtpd_use_tls = yes 
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem 
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem 
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache 
tls_daemon_random_source = dev:/dev/urandom 
 
#virtual_mailbox_domains = /etc/postfix/vdomain 
#virtual_mailbox_base = /home/mail/vhosts 
#virtual_mailbox_maps = hash:/etc/postfix/vmailbox 
#virtual_minimum_uid = 100 
#virtual_uid_maps = static:12000 
#virtual_gid_maps = static:12000 
#virtual_alias_maps = hash:/etc/postfix/virtual 
 
local_transport = virtual 
virtual_transport = virtual 
virtual_mailbox_base = /home/mail 
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf 
virtual_alias_domains = $virtual_alias_maps 
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf 
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf 
virtual_minimum_uid = 10000 
virtual_uid_maps = static:10000 
 
virtual_gid_maps = static:10000 
mailbox_size_limit = 51200000 
message_size_limit = 10240000 
virtual_mailbox_limit = 51200000 
virtual_mailbox_limit_maps = hash:/etc/postfix/vquota 
virtual_mailbox_limit_override = yes 
virtual_overquota_bounce = yes 
virtual_mailbox_limit_inbox = yes 

vquotaファイル作成

ユーザやドメイン毎のメールボックスのサイズを指定(virtual_mailbox_limit以下で指定)

# vi /etc/postfix/vquota 
test1@mail.flateight.com   51200000
@test2.flateight.com         25600000
@mail2.flateight.com        12800000

MySQL認証用ファイルを作成

# vi /etc/postfix/mysql_virtual_alias_maps.cf 
user = postfix 
password = xxpostfix 
hosts = localhost 
dbname = postfix 
table = alias 
select_field = goto 
where_field = address 
 
#vi /etc/postfix/mysql_virtual_domains_maps.cf 
user = postfix 
password = xxpostfix 
hosts = localhost 
dbname = postfix 
table = domain 
select_field = domain 
where_field = domain 
additional_conditions = and active = '1' 

# vi /etc/postfix/mysql_virtual_mailbox_maps.cf 
user = postfix 
password = xxpostfix 
hosts = localhost 
dbname = postfix 
table = mailbox 
select_field = maildir 
where_field = username 

MySQL用設定ファイル作成

# vi /etc/dovecot-mysql.conf 
driver = mysql 
default_pass_scheme = PLAIN 
connect = dbname=postfix user=postfix host=/var/lib/mysql/mysql.sock password=xxpostfix 
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1' 
user_query = SELECT concat('/home/mail/', maildir) as home, 10000 as uid, 10000 as gid FROM mailbox WHERE username = '%u' AND active = '1' 

・TLS セッションキャッシュマネージャの設定(master.cf の編集) コメントを外す。

# vi /etc/postfix/master.cf 
submission inet n - n - - smtpd 
 -o smtpd_enforce_tls=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtps inet n - n - - smtpd 
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject 

・証明書の作成、Dovecot の設定(dovecot.confの編集)

# yum install dovecot 
# cd /etc/pki/tls/certs/ 
# make mail.pem 
# openssl x509 -in mail.pem -outform DER -out mail.der 
# cp /etc/dovecot.conf /etc/dovecot.conf.save 
# vi /etc/dovecot.conf 
listen = [::]
log_path = /var/log/dovecot.log
ssl_disable = no
ssl_cert_file = /etc/pki/tls/certs/mail.pem
ssl_key_file = /etc/pki/tls/certs/mail.pem
verbose_ssl = yes
mail_location = maildir:/home/mail/%d/%u
last_valid_uid = 10000
first_valid_gid = 10000
protocol imap {
}
  
protocol pop3 {
}
protocol lda {
  postmaster_address = postmaster@example.com
}
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
auth default {
  mechanisms = plain login digest-md5 cram-md5 apop
  passdb sql {
   args = /etc/dovecot-mysql.conf
  }
 
  userdb sql {
   args = /etc/dovecot-mysql.conf
  }
 
 socket listen {
  client {
   path = /var/spool/postfix/private/auth
   mode = 0660
   user = postfix
   group = postfix
  }
 }
  user = root
}
dict {
}
plugin {
}

・認証ライブラリのインストール

# yum -y install cyrus-sasl-md5 cyrus_sasl_sql cyrus-sasl-plain 

Apacheなどなどのインストール

# yum install httpd 
# yum install php-mysql php-xml php-devel php-mbstring php-gd php-pear php-xmlrpc php-soap php-imap 

・chkconfig

# chkconfig httpd on 

・スタート

# service httpd start 

ファイアウォールの設定

このポートを開ける

 25
110
143
465 番  SMTP over SSL 
993 番  IMAP over SSL 
995 番  POP3 over SSL 

メールディレクトリを用意しておく

# mkdir /home/mail 
# chown 10000 /home/mail 

PostfixAdminインストール

・ダウンロードURL http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin_2.3.tar.gz?use_mirror=jaist

# cd /usr/local/src 
# wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin_2.3.tar.gz?use_mirror=jaist 
# tar zxvf postfixadmin_2.3.tar.gz 
# mv postfixadmin_2.3 /var/www/html/postfixadmin 
# cd /var/www/html/postfixadmin 
# vi config.inc.php 
    26 $CONF['configured'] = true; 
    43 $CONF['default_language'] = 'ja'; 
    49 $CONF['database_type'] = 'mysqli'; 
    50 $CONF['database_host'] = 'localhost'; 
    51 $CONF['database_user'] = 'postfixadmin'; 
    52 $CONF['database_password'] = '01shop01'; 
    53 $CONF['database_name'] = 'postfix'; 
   100 // $CONF['encrypt'] = 'md5crypt'; 
   101 $CONF['encrypt'] = 'cleartext'; 
   130 $CONF['page_size'] = '100'; 
   158 $CONF['mailboxes'] = '100'; 
   159 $CONF['maxquota'] = '300'; 

・URLからアクセス

http://[アドレス]/postfixadmin/setup.php 

全部OKになっていればOKです。

setupパスワードを入力し、表示されたsetup_passwordを
config.inc.phpに入力する。
    ↓
管理者IDを作成する。

・setup.phpを削除

# rm /var/www/html/postfixadmin/setup.php 

・URLからアクセス

http://[アドレス]/postfixadmin

・Web上からpostmaster宛とroot宛を転送するように設定。

エラー

user unknown

Info: auth(default): passwd(hogehoge@flateight.com,::ffff:59.106.13.38): unknown user
  • 対処

これがあると、passwd認証をしようとするが、当然無いのでunknown userとなってしまう。
dovecot.confの「auth default」内のpassdb passudをコメントアウトしてやる。

# vi /etc/dovecot.conf 
auth default {
 #userdb passwd {
 #}
}

pam_authenticate() failed:

auth(default): pam(hogehoge@flateight.com,::ffff:59.106.13.38): pam_authenticate() failed: User not known to the underlying authentication module
}
  • 対処

これがあると、まずpam認証を行ってうが当然認証できないので、エラーになってしまう。
dovecot.confの「auth default」内のpassdb pamをコメントアウトしてやる。

# vi /etc/dovecot.conf 
auth default {
 #passdb pam {
 #}
}

postfix master.cfの説明

smtpd_enforce_tls=yes 

デフォルト: no
SMTP クライアントに TLS 暗号化を強制する。

smtpd_sasl_auth_enable=yes 

デフォルト: no
SMTP Auth (SASL による) を有効にする。

smtpd_client_restrictions= 

デフォルト: empty
SMTP クライアントが smtpd デーモンにアクセスするときの、アクセス制限設定。
記述順にパラメータ値(アクセス制限)が評価される。最後は permit (許可) になる。
基本的な書き方としては、 permit_ を書き、最後に reject を書く。
(全部ふさいで一部分開くポリシー)
パラメータ値は、カンマかスペースで区切る。

長くなる場合は、次の行の先頭にスペースを入れることで、行が継続される。
例えば

smtpd_client_restrictions=permit_sasl_authenticated,reject 

SMTP Auth で認証が確認された接続を許可。 それ以外は接続を拒否する。(デフォルト: 554)