一、前言:
這份文件是在說明如何去使用Trustix 3.0 來架設一個Mail Server ,其中使用者的帳號及密碼是放在MySQL的資料庫裡,而不是本機的使用者,跟系統的帳號是分開的,也使用了Cyrus-SASL來提供SMTP的認證機制,發信的使用者必需要認證後才能發信,這樣可以避免一樣不必要的安全及管理上的問題。
二、事前準備:1、本篇是Trustix 3.0 裡的套件來架設的,所使用的套件有:
postfix-2.2.5-3tr
postfix-mysql-2.2.5-3tr
cyrus-sasl-2.1.20-14tr
cyrus-sasl-plain-2.1.20-14tr
courier-imap-4.0.4-1tr
courier-authlib-0.57-2tr
courier-authlib-mysql-0.57-2tr
mysql-4.1.14-1tr
所以要確認要先安裝以上這些套件。
2、DNS的設定及Postfix的domain設定要先設定好,能夠正常發信,然後進行下面的步驟。
三、設定:
設定MySQL:這裡是的設定是用來設定使用者的mailbox、網域名稱…。
建立資料庫:在命令列下照以下輸入:
# mysql -p
Enter password: <在此輸入root的密碼,預設是空白>
mysql> CREATE DATABASE postfix; 建立一個名叫postfix的資料庫
mysql> GRANT SELECT, INSERT, DELETE, UPDATE, USAGE ON postfix.* TO postfix@localhost IDENTIFIED BY 'password'; 設定資料庫的權限及密碼password
mysql> FLUSH PRIVILEGES;套用設定 建立三個table,alias、domain、mailbox:
mysql> \u postfixCREATE 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),KEY address (address)) TYPE=MyISAM COMMENT='Virtual Aliases';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',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), KEY domain (domain)) TYPE=MyISAM COMMENT=' Virtual Domains';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), KEY username (username)) TYPE=MyISAM COMMENT='Virtual Mailboxes';
好了之後,可以增加一些資料以供測試。
INSERT INTO domain (domain,description) VALUES ('domain.tld','Test Domain');INSERT INTO alias (address,goto) VALUES ('alias@domain.tld', 'user@domain.tld');INSERT INTO mailbox (username,password,name,maildir) VALUES('user@domain.tld',' JKvrm8/WaOc0U ','Mailbox User','user@domain.tld/');
(password 是 "123456") 如果要新增使用者或更改密碼就必需要使用MySQL的encrypt的功能,如果要變更user@domain.tld的密碼,可以使用下列的方法。
mysql> update mailbox set password=encrypt('7890123') where username='user@domain.tld'使用者的帳號可以加入網域的名稱,例如:'user@domain.tld 或 直接使用帳號不加網域名稱,例如 user, 這關於是否有架設多重網域的考量。
設定postfix建立mailbox的資料夾,及設定權限。
mkdir /var/mail
chown postfix.postfix /var/mail
chmod 700 /var/mail在./etc/postfix/main.cf 裡加入下列的設定:這是要讓postfix能夠知道mysql裡的使用者資料,而將信送到正確的位置。
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:102
virtual_mailbox_base = /var/mail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit = 51200000
virtual_minimum_uid = 102
virtual_transport = virtual
virtual_uid_maps = static:102在/etc/postfix/ 下建立這三個檔案,是讓postfix存取MySQL時的一些必要資訊,如MySQL Server的位置,MySQL的帳號、密碼及要存取那些tables。
mysql_virtual_alias_maps.cf
mysql_virtual_domains_maps.cf
mysql_virtual_mailbox_maps.cf
以下是三個檔的內容:
mysql_virtual_alias_maps.cf user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
如果是postfix2.2版之前就修改成下列的設定
user = postfix
password = password
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = addressmysql_virtual_domains_maps.cf
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s'
如果是postfix2.2版之前就修改成下列的設定
user = postfix
password = password
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domainmysql_virtual_mailbox_maps.cf
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
如果是postfix2.2版之前就修改成下列的設定
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username設定couier-imapd使用MySQL在trustix3.0裡所使用的courier-imap是4.04版,還必需要安裝courier-authlib及courier-authlib-mysql這兩個套件,如果你是用之前的courier-imap 3.xx版,courier-authlib是內建在裡面的。
編輯/etc/authlib/authmysqlrc ,將檔案的內容改成下面這樣。要注意的是每行後面不要多的空白,不然會有問題。
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD 123456
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD '102'
MYSQL_GID_FIELD '102'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/var/mail'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir再編緝/etc/authlib/authdaemonrc 改成下列的設定。
authmodulelist="authmysql authpam"
version="authdaemond.mysql"更改好了之後重新啟動courier-imapd、courier-authd,如果要使用pop3就啟動courier-pop3d。
使用telnet來測試。
root@tsl3 ~# telnet 127.0.0.1 110
+OK Hello there.
user user@test.com.tw 輸入帳號
+OK Password required.
pass 123456 輸入密碼
+OK logged in. 看到OK logged in. 就代表成功了!!設定SMTP AUTH 的部分在/etc/postfix/main.cf 內加入下列設定以啟動SASL
smtpd_recipient_restrictions = permit_mynetworkspermit_sasl_authenticated
在smtpd_recipient_restrictions 插入permit_sasl_authenticated 這項
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname在/etc/sasl/postfix.conf修改成
pwcheck_method: saslauthd及/etc/sysconfig/saslauthd
SASL_AUTHMECH=rimap
SASL_RIMAP_HOSTNAME=localhost 這裡是用localhost 因為imapd server 是在本機通常有兩種設定一種是讓sasl直接去存取資料庫,另一個是用rimp的認證,這裡是用rimp的認證方式,讓sasl使用imapd 伺服器來做認証的伺服器。
你可以使用saslauthd –v 來看看你的sasl是否有rimap的模組。
重新啟動postfix 及 saslauthd 之後就可以測試看看是否有類似下列的訊息:
root@tsl3 ~# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 tsl3.test.com.tw ESMTP Postfix (Trustix)
ehlo test.com
250-tsl3.test..com.tw
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 看看是否有這兩行,有的話代表有在運作了
250 8BITMIME 下一步可以用AUTH指令來來測試,可用下這個perl 寫的程式去產生出認證用的字串。(下面的測試的部分要待couier-impad 設定好之後才會有作用)
#!/usr/bin/perl
use strict;
use MIME::Base64;
if ( $#ARGV != 1 ) {
die "Usage: encode_sasl_plain.pl
\n";
}
print encode_base64("$ARGV[0]\0$ARGV[0]\0$ARGV[1]");
exit 0;
這裡用帳號test 密碼做示範
root@tsl3a ~# ./encode.pl test 123456
dGVzdAB0ZXN0ADEyMzQ1Ng==
用auth 命令再貼上認證用的字串,出現Authentication successful 就代表成功了。
root@tsl3 ~# telnet 127.0.0.1 25
220 tsl3.test.com.tw ESMTP Postfix (Trustix)
ehlo test.com
250-tsl3.test..com.tw
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
AUTH PLAIN dGVzdAB0ZXN0ADEyMzQ1Ng==
235 Authentication successful
如果你有所使用的帳號是有含網域名稱的例如 user@domain.tld,在做smtp 認證的時候會有問題,rimap模組是不支援多重網域的,他會把帳號的domain.tld 當作realm所以會發生下面的無法認證成功錯誤。
Oct 3 03:47:38 tsl3 saslauthd[1560]: do_auth : auth failure: [user=test] [service=postfix] [realm= domain.tld] [mech=rimap] [reason=remote server rejected your credentials]
我試著將smtp認證的帳號改為user@domain.tld@domain.tld就可以通過了,所以如果使用者是用outlook express寄信的話,smtp伺服器驗證的帳號就不能跟pop3的一樣了。
參考資料:
http://www.trustix.org/wiki/index.php/Main_Page#Mail_Services
http://www.postfix.org/docs.html