/ 中存储网

被誉为反垃圾邮件最好的Postfix邮件服务器上反垃圾邮件的方法

2014-09-02 02:26:32 来源:中存储网

在介绍如何配置Postfix的smtp配置之前有必要首先介绍一下它的背景和特点。Postfix是一个由IBM资助下由Wietse Venema 负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。Postfix力图做到快速、易于管理、提供尽可能的安全性 ,同时尽量做到和sendmail邮件服务器保持兼容性以满足用户的使用习惯。起初,Postfix是以VMailer这个名字发布的,后来由于商标上的原因改名为Postfix。

Postfix是一个非常优秀的MTA,她素以高效、安全的特点而著称。Postfix是作者在UNIX上所见过的MTA中在反垃圾邮件(Anti-Spam或Anti-UCE)方面做得最好的一个,甚至有很多公司在Postfix代码的基础上进行二次开发而推出反垃圾邮件网关产品。MTA的反垃圾邮件功能,实际上就是在MTA处理过程中对会话进行过滤。这个过滤不但过滤了发往自身的垃圾邮件,而且还防止了自身被恶意利用发送垃圾邮件。Postfix实现了目前所有主要的MTA过滤技术。postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。和Sendmail相比Postfix更快、更容易管理、更灵活、更安全,同时还与sendmail保持足够的兼容性。

在Postfix中反垃圾邮件大致有四个方法, smtp认证、逆向域名解析、黑名单过滤和内容过滤。

一、Smtp认证

1、在邮件传送代理(Mail Transport Agent,MTA)上对来自本地网络以外的互联网的发信用户进行SMTP认证,仅允许通过认证的用户(我的理解是登陆的用户)进行远程转发。这样既能够有效避免邮件传送代理服务器为垃圾邮件发送者所利用,又为出差在外或在家工作的员工提供了便利。

2、如果不采取SMTP认证,则在不牺牲安全的前提下,设立面向互联网的Web邮件网关也是可行的。

3、如果SMTP服务和POP3服务集成在同一服务器上,在用户试图发信之前对其进行POP3访问验证(POP before SMTP)就是一种更加安全的方法。

4、带smtp认证的postfix配置:Postfix能限制哪个主机允许通过自身转发邮件,并且支持限定什么邮件允许接进。Postfix实现通常的控制功能:黑名单列表、RBL查找、HELO/发送者DNS核实。基于内容过滤当前没有实现。 表查看: Postfix没有实现地址重写语言,而是使用了一种扩展的表查看来实现地址重写功能。表可以是本地 dbm或 db文件等格式。 
好,下面就来看看具体的配置过程: 
版本 
redhat 6.2 
cyrus-sasl-1.5.24 
snapshot-20010329 
下载:http://ftp.cnuol.com

步骤:

1). 安装sasl 
#./configure --enable-login --with-pwcheck;make;make install 
#echo /usr/local/lib>>/etc/ld.so.conf 
#echo /usr/local/lib/sasl >> /etc/ld.so.conf 
# ldconfig 
2).安装postfix 
# make tidy 
# make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include" / 
AUXLIBS="-L/usr/local/lib -lsasl" 
# make 
# adduser -s /bin/false postfix 
# make install 
3).修改postfix的cf文件使支持smtp认证 
在/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 
smtpd_client_restrictions = permit_sasl_authenticated 
broken_sasl_auth_clients = yes 
smtpd_sasl_security_options = noanonymous 
这样用户的postfix就支持smtp认证了。Postfix其余的配置请参考/etc/postfix/main.cf.default和sample-*文件,这里不多说了。 
现在telnet 25口应该有下面的提示 
telnet 127.0.0.1 25 
Trying 127.0.0.1... 
Connected to 127.0.0.1. 
Escape character is '^]'. 
220 mailx.bjcnuol.com ESMTP Postfix 
ehlo 127.0.0.1 
250-mailx.bjcnuol.com 
250-PIPELINING 
250-SIZE 10240000 
250-ETRN 
250-AUTH LOGIN PLAIN 
250-AUTH=LOGIN PLAIN 
如果有就差不多成功了。 
4).配置sasl使支持smtp认证 
# touch /usr/local/lib/sasl/smtpd.conf 
# echo pwcheck_method:shadow >> /usr/local/lib/sasl/smtpd.conf 
5).设置口令文件权限 
因为postfix用户无权读取/etc/shadow所以必须把shadow文件的权限改成postfix,这不能不说是一个缺陷,如果你觉得不安全,你可以将认证方式该为sasldb的方式,但是这样需要额外创建用户和口令不能和邮件用户的口令保持一致修改口令也不方便。此外还可以用pwcheck守护进程,但我没试出来感兴趣的朋友可以试试,如果成功了别忘了告诉我。 
6).配置OE5 
1.打开你的Outlook Express,修改你的账号属性,在服务器选项,选取我的smtp服务器需要认证选项, 然后进入配置。 
2.不要选取安全口令认证,sendmail并不支持这个选项。是选取使用pop3同样的口令还是选择另外输入用户密码,这就看你的爱好和设置了,这不是关键。如果你在服务器上有一个真实账号,不妨选取使用同样的口令,如果没有账号,选用其他的用户口令同样可以。 
7).启动和关闭postfix  
启动 
postfix start 
关闭 
postfix stop 
你可以把postfix start放到/etc/rc.d/rc.local文件的最后用来每次重起后自动启动postfix

二、逆向域名解析

无论哪一种认证,其目的都是避免邮件传送代理服务器被垃圾邮件发送者所利用,但对于发送到本地的垃圾邮件仍然无可奈何。要解决这个问题,最简单有效的方法是对发送者的IP地址进行逆向名字解析。

1、  通过DNS查询来判断发送者的IP与其声称的名字是否一致。例如,其声称的名字为mx.hotmail.com,而其连接地址为20.200.200.200,与其DNS记录(我的理解:这个记录是否在MX中)不符,则予以拒收。这种方法可以有效过滤掉来自动态IP的垃圾邮件,对于某些使用动态域名的发送者,也可以根据实际情况进行屏蔽。

2、  但是上面这种方法对于借助Open Relay的垃圾邮件依然无效。对此,更进一步的技术是假设合法的用户只使用本域具有合法互联网名称的邮件传送代理服务器发送电子邮件。例如,若发件人的邮件地址为someone@yahoo.com,则其使用的邮件传送代理服务器的Internet名字应具有yahoo.com 的后缀。这种限制并不符合SMTP协议,但在多数情况下是切实有效的。需要指出的是,逆向名字解析需要进行大量的DNS查询。(即对发件人的邮件地址后缀进行检查)。

三、黑名单过滤

以上介绍的防范措施对使用自身合法域名的垃圾邮件仍然无效。对此比较有效的方法就是使用黑名单服务了。黑名单服务是基于用户投诉和采样积累而建立的、由域名或IP组成的数据库,最著名的是RBL、DCC和Razor等,这些数据库保存了频繁发送垃圾邮件的主机名字或IP地址,供MTA进行实时查询以决定是否拒收相应的邮件。但是,目前各种黑名单数据库难以保证其正确性和及时性。例如,北美的RBL和DCC包含了我国大量的主机名字和IP地址,其中有些是早期的Open Relay造成的,有些则是由于误报造成的。但这些迟迟得不到纠正,在一定程度上阻碍了我国与北美地区的邮件联系,也妨碍了我国的用户使用这些黑名单服务。

Postfix 邮件服务器中应用 RBL 的设置方法:

RBL-采用的是DNS方式的实时黑名单技术,在Postfix中都使用RBL参数来配置。Postfix1.x和Postfix 2.x在使用RBL的 配置上是不同的。

Postfix 1.x: 
要先用maps_rbl_domains来定义RBL表: maps_rbl_domains = rbl.anti-spam.cn 
然后在过滤条件中(如smtpd_recipient_restrictions )使用reject_maps_rbl来拒绝黑名单连接: 
smtpd_recipient_restrictions = ... reject_maps_rbl,...

Postfix 2.x:

直接在过滤条件中(如smtpd_recipient_restrictions )使用reject_rbl_client来拒绝黑名单连接: 
smtpd_recipient_restrictions =... 
reject_rbl_client rbl.anti-spam.cn,... 
如果您想先测试一下RBL服务是否工作正常,可以在reject_maps_rbl指令和reject_rbl_client指令前加上 warning_if_reject来改变默认的拒绝动作为警告(警告信息会在邮件日志中看到)。等确认工作正常后再去掉警告指令。

四、内容过滤

即使使用了前面诸多环节中的技术,仍然会有相当一部分垃圾邮件漏网。对此情况,目前最有效的方法是基于邮件标题或正文的内容过滤。其中比较简单的方法是,结合内容扫描引擎,根据垃圾邮件的常用标题语、垃圾邮件受益者的姓名、电话号码、Web地址等信息进行过滤。

更加复杂但同时更具智能性的方法是,基于贝叶斯概率理论的统计方法所进行的内容过滤,该算法最早由Paul Graham提出(http://www.paulgraham.com/spam.html),并使用他自己设计的Arc语言实现。这种方法的理论基础是通过对大量垃圾邮件中常见关键词进行分析后得出其分布的统计模型,并由此推算目标邮件是垃圾邮件的可能性。这种方法具有一定的自适应、自学习能力,目前已经得到了广泛的应用。最有名的垃圾邮件内容过滤是Spamassassin,它使用Perl语言实现,集成了以上两种过滤方法,可以与当前各种主流的MTA集成使用。内容过滤是以上所有各种方法中耗费计算资源最多的,在邮件流量较大的场合,需要配合高性能服务器使用。

反垃圾邮件中,内容过滤是非常重要的部分,在Postfix中有两种内容过滤:邮件头过滤和邮件内容过滤。

1)邮件头过滤

邮件头包括邮件头部信息和MIME头信息,要使邮件头过滤生效需要在main.cf中加入:

header_checks = regexp:/etc/postfix/checks/header_checks

mime_header_checks = regexp:/etc/postfix/checks/mime_header_checks

在这里我们使用的是标准正规表示式过滤规则,规则文件中的第一行都类似于如下行:

/^HEADER: .*content_to_act_on/ ACTION MESSAGE

/^HEADER: .*content_to_act_on/是正规表示式,ACTION是对满足正规表示式时所采取的动作,MESSAGE是该规则的说明,一般用于向客户端反回信息或用户邮件日志。常用的ACTION有:

REJECT  通知Postfix弹回邮件,这样邮件在进入你的邮件服务器前便被禁止 IGNORE  通知Postfix删除满足过滤条件的那部分内容 HOLD  通知Postfix将邮件保存在邮件队列中,以便管理对之进一步处理DISCARD  通知Postfix直接删除邮件,在这种情况下,服务器不对发送者返回任何信息,以便让发送端感觉邮件已经正常发送

下面是一些有用的例子:

/^Subject: .* / REJECT Spam Header Many Spaces

/^Subject: Free Money/ REJECT Spam Free Money Mails

/^Date: 19[0-9][0-9]/ REJECT Spam past date

/name=[^>]*/.(bat|com|exe)/ REJECT Spam Executable Attachements

2)邮件内容过滤

邮件内容过滤是指邮件的正文内容过滤,它是针对邮件正文中的文字进行过滤,其规则的用法和邮件头过滤一样,为了使用邮件内容过滤需要在main.cf中加入:

body_checks = regexp:/etc/postfix/checks/body_checks

下面是几个有用的规则:

/Free Money/ REJECT Spam Free Money in Body mails

/www.disallowdsites.com/ REJECT Disallowed Sites

/Real Bad Words/ REJECT Bad Words

需要提醒的是,与邮件头过滤规则不同的,邮件内容过滤规则中的正则表示式不区分大小写。

附:访问控制列表

访问控制列表可以限制客户端对邮件服务器的访问,main.cf中常用的访问控制如下:

smtpd_client_restrictions  SMTPD客户端限制 smtpd_helo_restrictions  SMTPD标识限制 smtpd_sender_restrictions  SMTPD发送者限制 smtpd_recipient_restrictions  SMTPD接收都限制

以下是访问控制列表使用的示例:

smtpd_client_restrictions = check_client_access hash:/etc/postfix/checks/access_client

smtpd_helo_restrictions = check_client_access hash:/etc/postfix/checks/helo_client

smtpd_sender_restrictions = check_client_access hash:/etc/postfix/checks/sender_client

smtpd_recipient_restrictions = check_client_access hash:/etc/postfix/checks/recipient_client

访问控制表是一个hash表,其中每一行就是一条控制项,如下:

spammer.com  550 You can't sends mail from my server.

hacker@  550 You aren't allowed to send mail.

规则中,第一项是规则内容,第二项是对满足规则时所采取的行动,第三项是返回给客户端的信息。

其中第一条表示禁止任何spammer.com上的用户发送邮件,第二条表示禁止任何用户名为hacker的用户发送邮件。