Study notes

星期日, 10月 09, 2005

使用Trustix 3.0 架設郵件伺服器(Postfix + SASL SMTP認證 + MYSQL+Courier-imapd)

一、前言:
這份文件是在說明如何去使用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 postfix
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),
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 = address


mysql_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 = domain


mysql_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_mynetworks
permit_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

0 Comments:

張貼留言

<< Home