Debian+Postfix-SASL认证配置全解
 
目录
1
所需套件
2 Mail Relay
简介
3
Postfix 支援 Cyrus-SASL? V2 认证:(Debian Sarge
4
检测方式

所需套件
postfix-tls sasl2-bin libsasl2-modules
apt-get install  postfix-tls sasl2-bin libsasl2-modules

Mail Relay
简介
所谓的 Mail Relay,指的就是 Mail Server 会不会替使用者将信转寄到外部去。

比如说,我将信寄给 [email]tetralet@pchome.com.tw[/email],如果 [email]tetralet@pchome.com.tw[/email] 这个信箱并不是位于本机上,那么这封信将会转给PCHome Mail Server,而这个将邮件转寄的动作就是 Mail Relay

Open Relay
就是不设限地完全开放 Mail Relay 的功能,它会替所有的人进行邮件转寄。

架设 Mail Server 的第一件事,就是防止不速之客利用您的 Mail Server 来乱发邮件,也就是关掉 Open Relay 这个功能。(基本上,几乎所有的 Mail Server 预设上都已把 Open Relay 给关掉了)取而代之的,是使用 SMTP 认证 (SMTP AUTH) 来验证使用者可否进行 Mail Relay

在这里所要介绍的,是如何使用 Cyrus-SASL? V2 来实作 SMTP 认证的功能。其中的 SASL (Simple Authentication and Security Layer) 就是用来提供符合 RFC 2222 标准的各种认证机制的 Daemon

Postfix 支援 Cyrus-SASL? V2 认证:(Debian Sarge
修改 /etc/default/saslauthd,设定 START=yes
# This needs to be uncommented before saslauthd will be run automatically
START=yes

# You must specify the authentication mechanisms you wish to use.
# This defaults to "pam" for PAM support, but may also include
# "shadow" or "sasldb", like this:
# MECHANISMS="pam shadow"

MECHANISMS="pam"
修改 /etc/postfix/sasl/smtpd.conf,设定 PostFix 使用 Saslauthd
mkdir -p /etc/postfix/sasl
echo "pwcheck_method: saslauthd" > /etc/postfix/sasl/smtpd.conf
postfix 加入 sasl 群组中
addgroup postfix sasl
修改 /etc/postfix/main.cf,使其使用 SMTP AUTH SASL Authenticate
(上略)

# Enable SASL Auth

#
设定 Postfix 使用 SASL 认证。
smtpd_sasl_auth_enable = yes

#
设定 SASL 支持非标准 E-mail Client 的认证动作。
broken_sasl_auth_clients = yes

#
不使用 ANONYMOUS 这个认证。
smtpd_sasl_security_options = noanonymous

#
设定 SASL 的认证方法
# permit_sasl_authenticated
如果客户端可通过 SASL 认证则可 Relay Mail
# permit_mynetworks
如果客户端的地址为 $mynetworks 则可 Relay Mail
# check_relay_domains
# reject_unauth_destination
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_relay_domains, reject_unauth_destination

smtpd_client_restrictions = permit_sasl_authenticated
修改 /etc/postfix/master.cf,让 Postfix 不要以 chroot 启动。
后面的 -v 参数可以用来 Debug,但正式上线时最好拿掉,以免系统被 Log 塞爆了。
(上略)

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd -v

(下略)
或者是新增一个 listen smtps (port 465) 上的 service

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtps     inet  n       -       n       -       -       smtpd                                                     
        # 强迫 tls 联机 (?)
        -o smtpd_tls_wrappermode=yes
        # 使用 sasl auth (如果在 main.cf 已经设定了,这行可以省略)
        -o smtpd_sasl_auth_enable=yes
        # 所有联机到这里的都必须通过 sasl auth
        -o smtpd_client_restrictions=permit_sasl_authenticated,reject                                             
重新启动 SASL Daemon
/etc/init.d/saslauthd restart
跑起来后,可以用

testsaslauthd -u username -p password
来测试 saslauthd 是否有正常运作

重新启动 Postfix
/etc/init.d/postfix restart
[编辑]检测方式
首先把账号及密码转换成 base64 的编码:(可能需要安装 libmime-base64-perl 套件)

perl -MMIME::Base64 -e 'print encode_base64("\0username\0password");'
登入 Postfix

$ telnet 127.0.0.1 25(在该用户的环境变量下)
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 Virtual ESMTP Postfix (Debian/GNU)
EHLO qemu (这里要输入的是 HostName)
250-Virtual
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
auth plain AHXXXXXXXXXXXXXXXXXXXX8/ (刚才 perl 指令计算的结果)
235 Authentication successful
quit
221 Bye
Connection closed by foreign host.
如果认证成功即表示 SASL 已经正确启动了。