前言:
postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。下面一段话摘自postfix的官方站点(http://www.postfix.org):“postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真实一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。”
全世界范围内的SMTP服务器与日俱增,但是这些SMTP服务器都有一个与生俱来的缺点,那就是没有任何的认证机制。因为在设计这些SMTP服务器时,全世界范围的Internet主机还不是很多,彼此间都有很高的可信任级别,所以没有全面考虑安全性问题。这种现象也可以在别的Internet协议中看到。
正是因为SMTP通讯过程缺乏认证机制,以及ip欺骗的容易实现,导致了以下两个方面的问题:SMTP服务器无法确认SMTP客户机的合法性;SMTP客户机也无法确认SMTP服务器的合法性。从而也就导致了用户可以不经过认证就发送邮件,用户可以冒名发送邮件,以及垃圾邮件的泛滥。
Postfix设置了好多选项让网络管理员来限制服务器资源的使用,以及确定用户的合法性。但遗憾的是,这些认证机制都是基于ip地址或者客户DNS信息。在客户ip地址固定的情况下,这些方法或许有一定的作用(虽然还是无法解决冒名发送邮件),但是在客户ip地址不固定的情况下,就很难通过这种机制来进行限制了。当然,现在也有一些其他的技术,比如POP-before-SMTP(在发信前收信)来解决这个问题,但是这需要运行额外的服务程序。并且用户在发行之前一定要先收信,这或多或少都会带来一些不方便。
好在有简单认证安全层(SASL),它提供了模块化的SMTP认证扩展,因此SMTP就可以在SASL之上构建自己的SMTP认证,因为可以通过开放式的机制和协议来建立认证会话。另外,SASL在实现了对PLAIN以及CRAM-MD5加密等协议的基础上,还提供了多种认证方法,比如通过Kerberos、用户数据库、passwd文件、PAM等。这样,SMTP程序不需要支持这些认证方法就可以实现多种认证方式。并且,SMTP在用户经过成功认证以后同样可以定义自己的访问策略来对用户访问进行控制。
当然,首先我们必须保证该SMTP服务器能够提供对SASL的支持
要求:
首先要保证您的postfix版本是snapshot-20000507及其以上的版本,从而保证postfix对SASL的支持。强烈建议您升级至postfix-20010228及其以上版本。可以从www.postfix.org下载postfix的源代码包,在测试过程中我使用的是postfix-2.3.-20060517-milter.tar.gz
然后,要保证您的SASL的版本是1.5.5及其以上版本,因为已经有报告称这些版本的SASL可以和postfix工作得很好。可以从ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/下载SASL,在测试过程中我使用的是cyrus-sasl-1.5.28.
整个测试过程是在FC3中进行的.
什么是sasl呢?
SASL(即Simple Authentication and Security Layer)是为基于连接协议提供辅助认证支持的一种方法。使用SASL认证库时,应用层协议通过插入相关的认证命令来获取服务器的访问授权,同时也可以协商协议交互时的增强保护措施。当使用协商的安全措施时,一个安全协议层会被插入到应用协议层与连接层之间。
步骤:
1.首先检查系统中是否装了Cyrus-sasl
rpm -qa |grep cyrus
检查结果是未安装,那么我接下来先安装Cyrus-sasl
a.tar -zxvf cyrus-sasl-1.5.28.tar.gz
b.cd cyrus-sasl-1.5.28
c../configure --prefix=/usr/local /
--sysconfdir=/usr/local/etc /
--with-plugindir=/usr/local/lib/sasl /
--with-dbpath=/usr/local/etc/sasldb /
--includedir=/usr/local/include/sasl /
--enable-static /
--enable-login /
--disable-plain /
--disable-krb4 /
--disable-anon /
--with-pwcheck=/var/pwcheck /
--with-rc4=openssl /
--disable-gssapi /
--with-dblib=ndbm
各个选项的含义请运行./configure --help获取。--disable-plain在测试时可以不要,--enable-login是必需的,否则Outlook/Outlook Express客户端不能实现SMTP认证。SASL除了支持DB3、ndbm数据库外,还支持MySQL、LDAP1和LDAP2等。
d.编译
make
e.安装
make install
cyrus-sasl安装完毕后下面我们将编译postfix
a.tar xvzf postfix-postfix-2.3.-20060517-milter.tar.gz
b.cd postfix-2.3.-20060517-milter
c.make tidy
d. make makefiles CCARGS='-DUSE_SASL_AUTH -I/usr/include' AUXLIBS='-L/usr/lib -lsasl'
e.make
f. adduser -s /bin/false postfix
g. make install
接着为了告诉postfix采用sasl来进行SMTP的用户认证,我们必须用vi命令在/etc/postfix/目录下的main.cf文件的最后添加以下几行:
smtpd_sasl_auth_enable = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworks
permit_sasl_authenticated = permit_auth_destination reject
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
然后保存并退出,添加以上几行的详细说明如下:
smtpd_sasl_auth_enable:告诉SMTP客户,该SMTP服务器需要进行用户认证。
smtpd_recipient_restrictions = permit_sasl_authenticated permit_auth_destination
reject:仅仅中继通过SMTP认证的客户端邮件,以及接收本postfix为最后一站的邮件。
broken_sasl_auth_clients = yes:有一些Microsoft 的SMTP客户端,比如Outlook Express 4.X采用的是非标准的SMTP认证协议,将该选项设置为yes可以解决这类不兼容问题。
smtpd_sasl_security_options = noanonymous:控制本地SMTP认证所采用的机制,这里是允许任何非匿名认证方法。这样用户的postfix就支持smtp认证.
配置SASL:
a.cd /usr/lib/sasl/
b.touch smtpd.conf
c.more smtpd.conf
d.vi smtpd.conf插入pwcheck_method:pam(也就是通过PAM来进行用户认证)
什么是PAM呢?
PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些
动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理
员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于
向系 统中添加新的认证手段。说白了就是一种可插入模块,是一个用于认证用户的灵活机制.配置PAM
a.cd /etc/pam.d
b.touch smtp
c.more smtp
d.more pop
要将pop和smtp的内容设置相同:
auth required /lib/security/pam_stack.so service=system-auth
account required /lib/security/pam_stack.so service=system-auth修改/etc/shadow文件权限
因为PAM最终要去读取/etc/shadow文件的内容来进行用户认证,但是/etc/shadow文件
权限是设置为只有root用户可以读写,而我们的postfix是运行在postfix用户权限之下,所以我们要合理的设置/etc/shadow文件权限,以便让pam可以读取其内容。执行以下命令,让root组也可以读取shadow
a.chmod 640 /etc/shadow
然后再将postfix用户加入root组,采用以下命令:
b.usermod -G root postfix
最后启动postfix
c.postfix start
这样,一个支持SMTP认证的postfix就开始工作了.
然后telnet本机的 25端口
a.telnet 127.0.0.1
b.ehlo 127.0.0.1
ok大功告成,要是哪里有不对之处希望大家给予点拨斧正.