postfix,courier-imap,cyrus-sasl2,mysql,pam-mysql-虛擬主機

Mail Server 安裝
先裝Mysql(這邊是裝mysql5)
裝mysql來做認証管理和帳戶管理
建postfix資料庫

create database postfix
然後建資料表
CREATE TABLE `admin` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(4) NOT NULL default '1',
PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `alias` (
`address` varchar(255) NOT NULL default '',
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(4) NOT NULL default '1',
PRIMARY KEY (`address`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`description` varchar(255) NOT NULL default '',
`aliases` int(10) NOT NULL default '-1',
`mailboxes` int(10) NOT NULL default '-1',
`maxquota` int(10) NOT NULL default '-1',
`transport` varchar(255) default NULL,
`backupmx` tinyint(1) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(4) NOT NULL default '1',
PRIMARY KEY (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `domain_admins` (
`username` varchar(255) NOT NULL default '',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(4) NOT NULL default '1'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `log` (
`timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
`username` varchar(255) NOT NULL default '',
`domain` varchar(255) NOT NULL default '',
`action` varchar(255) NOT NULL default '',
`data` varchar(255) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `mailbox` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`name` varchar(255) NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '-1',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(4) NOT NULL default '1',
PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `vacation` (
`email` varchar(255) NOT NULL default '',
`subject` varchar(255) NOT NULL default '',
`body` text NOT NULL,
`cache` text NOT NULL,
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(4) NOT NULL default '1'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
開postfix權限

GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "secret"; (密碼可以改你爽的)

GRANT ALL ON discuz.* TO postfix@localhost IDENTIFIED BY "密碼";

postfix 使用者有discuz 資料庫的權限

ps 也可以用匯入的方式。


—————————————————————————————-
實作:資料庫的備份
使用Putty連線到主機。
執行以下的指令,將資料匯出到 Script檔:
mysqldump -p lib13 > db_backup.sql
輸入你的密碼後,完成匯出。


實作:刪除 Guestbook 資料表
使用Putty連線到主機。
在 Linux Shell 執行以下的指令:
mysql -p
輸入你的密碼後,進入 mysql 提示。
在mysql 提示下,輸入以下的命令,選用匯入的資料庫。
use lib13;
在mysql 提示下,輸入以下的命令,刪除 Guestbook 資料表。
drop table Guestbook;
在mysql 提示下,輸入以下的命令,秀出資料庫中所有的資料表。
show tables;

實作:資料庫的還原
使用Putty連線到主機。
在 Linux Shell 執行以下的指令:
mysql -p lib13 < db_backup.sql
輸入你的密碼後,完成還原。
—————————————————————————————


接下來安裝pam-mysql(主要是要做courier 和mysql間的認証)
安裝 pam_mysql
# cd /usr/ports/security/pam-mysql;make install clean
這兒有一些 pam_mysql 文件 /usr/local/share/doc/pam_mysql

建立捷徑
# ln -s /usr/local/lib/pam_mysql.so /usr/lib/pam_mysql.so

然後到cd /etc/pam.d/
加入一個smtp
內容:
auth optional pam_mysql.so user=postfix passwd=secret host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0
account required pam_mysql.so user=postfix passwd=secret host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0

(
方才 pam 的設定,其中
※ crypt=0 表示儲存的密碼為明碼,這對人類而言,是易讀易懂,但是不安全。
※ crypt=1 表示儲存的密碼為經由 UNIX系統中的 DES 所編碼過的密碼,據悉,它這有兩種加密方式;一種為普通的 DES 加密方式,也叫 crypt(),加密後的密碼有 13 位元長,另一種則為使用 MD5 演算法加密的,也叫 md5 crypt(),可說是 DES 的加強版,特點是以 $1$ 為開頭,加密後的密碼長度不定。
※ crypt=2 表示是用 MySQL 內建的函數 password() 所加密的密碼。)

安裝 cyrus-sasl2-saslauthd
安裝 cyrus-sasl2-saslauthd 時,會自動一併安裝 cyrus-sasl2
先編輯它的 Makefile
# cd /usr/ports/security/cyrus-sasl2-saslauthd/ ; ee Makefile
在 CONFIGURE_ARGS 這段新增那三個參數
## CONFIGURE_ARGS=
–enable-sql=mysql
–with-mysql=/var/db/
–with-dblib=none
開始安裝 Cyrus-sasl2-saslauthd
# make install clean

設定啟動 FreeBSD 時執行 saslauthd,在 /etc/rc.conf 新增此行 saslauthd_enable="YES"

請認有無此檔,並且連結到正確路徑
# ls -l /usr/local/lib/sasl2/libsql.so.2
libsql.so.2 -> /usr/local/lib/mysql/libmysqlclient.so.12
如果沒有 libsql.so.2 此檔,或者連到非以上路徑,請下此指令(到/usr/local/lib/mysql/看一下libmysqlclient.so是多少把他連結過來)
# ln -s /usr/local/lib/mysql/libmysqlclient.so.12 /usr/local/lib/sasl2/libsql.so.2

啟動 saslauth daemon,注意,saslauthd 必需在 IMAP or POSTFIX 前啟動
# /usr/local/etc/rc.d/saslauthd.sh start

為了要讓 saslauth daemon 支援 PAM,saslauthd 必須隨著 -a pam 參數一同啟動,檢驗看看
# ps ax|grep sasl
10174 ?? Is 0:00.10 /usr/local/sbin/saslauthd -a pam ##後面有 -a pam

安裝與設定 postfix

# cd /usr/ports/mail/postfix ; make install clean ; rehash
選擇這些選項
[X] SASL2
[X] MySQL

安裝完記得看他的資訊
如下
# vim /etc/rc.conf
加入下列資訊
## Postfix
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"

# vim /etc/periodic.conf
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

安裝完後執行
# /usr/local/sbin/postalias /etc/aliases
# /usr/local/sbin/postmap /usr/local/etc/postfix/transport

設置開機時啟動 postfix,新建一個捷徑
# ln -s /usr/local/sbin/postfix /usr/local/etc/rc.d/postfix.sh

然後修改postfix 的main.cf設定檔
#vim /usr/local/etc/postfix/main.cf

myhostname = 改成你的主機名
mydomain = 改成你的domain
myorigin = $mydomain
inet_interfaces = all
unknown_local_recipient_reject_code = 450
mynetworks_style = subnet
mynetworks = 127.0.0.0/8, 再加入你ip的網段(那個8的意思是你的子網路遮罩的位元數)
alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
home_mailbox = Maildir/
mailbox_transport = virtual
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:125
virtual_mailbox_base = /home/mbox
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit = 512000000
virtual_minimum_uid = 125
virtual_transport = virtual
virtual_uid_maps = static:125
virtual_mailbox_limit_inbox = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_vquota_maps.cf
virtual_mailbox_limit_override = yes

virtual_maildir_extended = yes
virtual_create_maildirsize = yes
message_size_limit = 50000000
maximal_queue_lifetime = 2d
bounce_queue_lifetime = 1d

broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, reject_rbl_client opm.blitzed.org, reject_rbl_client list.dsbl.org, reject_rbl_client relays.ordb.org, reject_rbl_client bl.spamcop.net, reject_rbl_client sbl.spamhaus.org, check_client_access regexp:/usr/local/etc/postfix/regexp-access.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_delay_reject = no

然後在postfix 目錄下加入這五個檔案

#vim /usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = (mysql中postfix的密碼)
hotst = localhost
dbname = postfix
table = alias
select_field is NULL goto'
where_field = address

#vim /usr/local/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = (mysql中postfix的密碼)
hotst = localhost
dbname = postfix
table = domain
select_field is NULL description'
where_field = domain

#vim /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = (mysql中postfix的密碼)
hotst = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

#vim /usr/local/etc/postfix/mysql_virtual_vquota_maps.cf
user = postfix
password = (mysql中postfix的密碼)
hotst = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username

#vim /usr/local/etc/postfix/regexp-access.cf
/[a-z0-9].dynamic.*/ 554 Service unavailable,Please see http://www.twia.org.tw/SPAM-930412(news).htm

安裝courier-imap
#cd /usr/port/mail/courier-imap
#make install clean
#vim /etc/rc.conf

## Courier Authd
courier_authdaemond_enable="YES"

## Courier IMAPD
courier_imap_imapd_enable="YES"
courier_imap_pop3d_enable="YES"

編輯authmysqlrc
#vim /usr/local/etc/authlib/authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME postfix (就是剛剛你在開mysql postfix這個user)
MYSQL_PASSWORD secret (就是剛剛你在開mysql postfix這個user的密碼)
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
DEFAULT_DOMAIN 你的domain
MYSQL_UID_FIELD 125(POSTFIX 的uid)
MYSQL_GID_FIELD 125(POSTFIX 的gid)
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/home/mbox'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir

編輯smtp.conf
#vim /usr/local/lib/sasl2/smtp.conf
pwcheck_method: saslauthd

編輯smtpd.conf

#vim /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login

最後再去home裡面建mbox這個目錄
#cd /home
#mkdir mbox
#chown postfix:postfix mbox

這樣就大功告成了~~
重開機~~測試你的mailserver吧

修改於2005/9.7

在〈postfix,courier-imap,cyrus-sasl2,mysql,pam-mysql-虛擬主機〉中有 3 則留言

  1. 拜讀前輩的postfix整合mysql~以及proftpd整合mysql~覺得受益良多~不過請問有辦法做到由phpmyadmin統一建立帳號~然後此帳號可以同時使用於postfix和proftpd~甚至是openwebmail

    回覆
  2. 我的帳號是透過postfixadmin 來管的
    現在ftp 則是用smbftpd
    基本上你看看 你的 postfix是不是用mysql 管的呀
    若是的話~~應該都還滿好整合的

    回覆

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料