论坛风格切换
正版合作和侵权请联系 sd173@foxmail.com
 
  • 帖子
  • 日志
  • 用户
  • 版块
  • 群组
帖子
购买邀请后未收到邀请联系sdbeta@qq.com
  • 1703阅读
  • 0回复

[求助-系统问题]自己动手打造企业垃圾邮件过滤系统 [复制链接]

上一主题 下一主题
离线ahyanglf
 
发帖
*
今日发帖
最后登录
1970-01-01
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-12-20 09:41:44
摘自:李洋 51CTO.com
【51CTO.com 独家特稿】电子邮件是整个互联网业务重要的组成部分。据相关报道统计,四分之三以上的用户上网的主要目的是收发邮件,每天有十数亿封电子邮件在全球传递,其应用频率已经超过了WWW服务,因此,电子邮件已成为网络用户不可或缺的需要。
然而,由于电子邮件的免费特性以及一些电子邮件服务器的开放性,使得电子邮件服务面临着垃圾邮件、病毒感染以及服务器滥用等严重的安全问题。基于这个背景,本专题对Linux系统中的著名邮件服务器(包括qmail邮件服务器、Postfix邮件服务器)的安全配置和使用作详细介绍。

1、电子邮件系统面临的安全威胁
一般说来,电子邮件系统面临如下两种安全威胁:
(1)电子邮件系统自身的安全问题:电子邮件系统自身作为一个网络服务器,存在着配置和误操作上的安全威胁和隐患,如没有合理配置服务器的相关配置文件中的重要选项等,极有可能造成潜在的安全隐患。另外,电子邮件系统版本的及时更新与否也影响到其安全;
(2)垃圾邮件问题:垃圾邮件问题是当今最让网络用户头疼的顽疾之一。许多不请自来的垃圾邮件不但占据网络带宽,也极大地消耗了邮件服务器的存储资源,给用户带来非常大的不便。如何应对该问题,是电子邮件系统面临的最大的挑战;
(3)开放性中继的安全问题:这就是大家经常所谈到的open relay的原理,如果设置不合理,将直接引起电子邮件系统的滥用,甚至会成为垃圾邮件的温床,它可以说是电子邮件系统中的“定时炸弹”。

2、安全使用Qmail邮件服务器
Qmail 的配置文件是由多个文件组成的,不是集中在一个文件中。每个文件控制相应部分的功能和属性,一个可执行程序可能有多个配置文件控制,所有的配置文件共同决定了 qmail 运行的实现和模式。这些配置文件都在qmail的control目录中,即位于 /var/qmail/control 目录中。合理设定如下选项,可以有效地增强Qmail服务器的安全性能。
(1)badmailfrom
这个配置文件是控制邮件系统拒绝接收的邮件地址和邮件域,主要是为了防止垃圾邮件。如果一个邮件地址或者邮件域被列入到这个文件中,系统就会拒绝接收这个邮件地址发来的邮件,或者拒绝邮件域下所有邮件地址发来的邮件。不过这个配置文件只是一般的垃圾邮件防范手段,对于比较全面的垃圾邮件过滤技术还要靠第三方软件来实现。该文件的格式如下:
example@deny.com //拒绝这个地址发来的邮件
@deny.com //拒绝这个邮件域下的所有帐号发来的邮件
(2)concurrencylocal
这个文件定义了 qmail 可以同时投递的本地邮件的个数。这个参数的缺省值是 10,也就是说系统允许同时有 10 个邮件在本地投递。 concurrencylocal 这个参数的最大值是由编译时的conf-spawn参数来决定的,缺省值是120,最大值是255。该值应该设置恰当,设得过大或者过小会浪费或者损失Qmail服务器的性能。
(3)concurrencyremote
这个参数定义了 qmail 可以同时投递的远端邮件的个数,这个参数的缺省值是 20。这个参数的最大值也是由 conf-spawn 来决定的。设置的重要性如同选项(2)所示。
(4)databyes
它定义了 qmail-smtpd 所允许接收的邮件的最大字节数。
这个参数的缺省值为 0,表示对接收邮件的字节数没有限制。如果要限制最大的接收为 10M,操作如下:
echo 10485760 > /var/qmail/control/databytes
这是任何大于 10M 的邮件都会被拒绝。这个参数最好合理设置,以避免恶意的对你服务器发送大量的超大邮件,产生邮件服务器负荷过大,甚至系统崩溃的危险。
(5)me
这个配置文件是 qmail 系统十分重要的一个文件,如果这个文件不存在,qmail 系统将无法运行。 me 是用来定义本地邮件服务器的主机名的。有多个配置文件是和 me 有关联的。如果那些配置文件不存在,系统默认会从 me 中读取参数值的。me 这个配置文件一般都是在 qmail 系统安装时使用 configure-fast 来创建的。
(6)queuelifetime
这个配置文件是定义一个邮件在邮件队列中存活的时间。
缺省值为 7 天(604800s),这个期限掉了以后 qmail-send 将会进行最后一次的投递尝试,如果投递失败,该邮件将会从邮件队列中删除。
(7)rcphosts
这个配置文件也是 qmail 一个十分重要的文件,这个文件是定义系统允许转发邮件的邮件域。 如果这个文件不存在或者为空,你的系统将会接收 Internet 上所有的域的邮件转发,即你的系统是 Open relay(存在被恶意用户作为垃圾邮件发送服务器的危险!!!)。配置文件 rcpthosts 最多可以支持 50 个主机名和域名。如果超个这个数字,就需要保存到他的扩充配置文件 morercphosts 中,然后使用 qmail 的命令程序 qmail-newmrh (该文件一般在 /var/qmail/bin 目录下)来生成二进制的 morercpthosts.cdb 文件,这样 qmail-smtpd 才可以从这个二进制文件中读取信息。
(8)virtualdomains
这也是 qmail 的一个非常重要的配置文件,它定义了 qmail 的虚拟邮件域,qmail 结合 vpopmail 的虚拟域管理功能可以定义多个虚拟邮件域。

3、安全Postfix电子邮件服务器
Postfix是一个由IBM资助、由Wietse Venema负责开发的自由软件工程产物,它的目的就是为用户提供除Qmail之外的邮件服务器选择。Postfix在快速、易于管理和提供尽可能的安全性方面都进行了较好的考虑。Postfix是基于半驻留、互操作的进程的体系结构,每个进程完成特定的任务,没有任何特定的进程衍生关系,使整个系统进程得到很好的保护。同时Postfix也可以和Qmail邮件服务器保持兼容性以满足用户的使用习惯。
(1)安全配置Postfix邮件服务器
与Qmail相比,Postfix最被人称道的地方就在于其配置文件的可读性很高。Postfix的主配置文件是/etc/postfix/main.cf。虽然该配置文件的内容比较多,但其中大部分内容都是注释(“#”号开头的行),真正需要自行定义的参数并不多。然而,为了对其进行安全配置,还是需要针对某些选项进行细心的设置。
在main.cf文件中,参数都是以类似变量的设置方法来设置的,这些参数的使用主要包含两部分的内容:
(1)定义和声明变量:例如definename = good-better-best。等号左边是变量的名称,等号右边是变量的值。
(2)引用变量:可以在变量的前面加上符号“$”来引用该变量,如:myname = $ definename(相当于definename = good-better-best)。
需要注意的是:等号两边需要有空格字符。此外,如果变量有两个以上的设置值,就必须用逗号“,”或者空格符“ ”将它们分开。
在熟悉了上述变量的定义和引用方法后,下面详细介绍如何安全、高效地配置Postfix服务器的相关选项。
1.设置Postfix服务监听的网络接口
默认情况下,inet_interfaces参数的值被设置为localhost,这表明只能在本地邮件主机上寄信。如果邮件主机上有多个网络接口,而又不想使全部的网络接口都开放Postfix服务,就可以用主机名指定需要开放的网络接口。不过,通常是将所有的网络接口都开放,以便接收从任何网络接口来的邮件,即将inet_interfaces参数的值设置为“all”,如下所示:
inet_interfaces = all
2.安全设置可接收邮件的主机名称或域名
mydestination参数非常重要,因为只有当发来的邮件的收件人地址与该参数值相匹配时,Postfix才会将该邮件接收下来。通过该选项的设置可以过滤掉许多没有经过认证和授权的邮件,从而节省服务器的存储空间,以及节省用户的邮件处理时间。
举一个简单的例子,用户可以将该参数值设置为如下:
accept_domain = test.net
mydestination = $accept_domain
这就表明无论来信的收件人地址是X@test.net(其中X表示某用户在test.net域中的邮件账户名),Postfix都会接收这些邮件。而除此之外的邮件,Postfix都不会接受。
3.安全设置可转发邮件的网络(IP设置)
有关安全设置可转发邮件的网络可以使用mynetworks参数来设置。可将该参数值设置为所信任的某台主机的IP地址,也可设置为所信任的某个IP子网或多个IP子网(采用“,”或者“ ”分隔)。
比如,用户可以将mynetworks参数值设置为172.168.96.0/24,则表示这台邮件主机只转发子网172.168.96.0/24中的客户端所发来的邮件,而拒绝为其他子网转发邮件:
mynetworks = 172.168.96.0/24
除了mynetworks参数外,还有一个用于控制网络邮件转发的参数是mynetworks-style,它主要用来设置可转发邮件网络的方式。通常有以下三种方式:
(1)class:在这种方式下,Postfix会自动根据邮件主机的IP地址得知它所在的IP网络类型(即A类、B类或是C类),从而开放的它所在的IP网段。
(2)subnet:这是postfix的默认值,postfix会根据邮件主机的网络接口上所设置的IP地址、子网掩码来得知所要开放的IP网段。
(3)host:在这种方式下,postfix只会开放本机。
通常,用户一般不需要设置mynetworks-style参数,而直接设置mynetworks参数。如果这两个参数都进行了设置,那么mynetworks参数的设置有效。
4.设置可转发邮件的网络(域名设置)
上面介绍的mynetworks参数是针对邮件来源的IP来设置的,而relay_domains参数则是针对邮件来源的域名或主机名来设置的,其实从原理上来说是一致的,不过是区分了IP地址和域名而已,不过,relay_domains还需要依赖DNS这个基础设施。
例如,用户可以将relay_domains参数值设置为test.net,则表示任何由域test.net发来的邮件都会被认为是信任的,Postfix会自动对这些邮件进行转发,如下所示:
relay_domains = test.net
那么,要使它能在实际网络中更好地转发邮件,还必须进行相应的DNS设置。那么,需要在该网络的DNS服务器上定义了一个主区域test.net,并在该区域配置文件中定义了以下记录:
//定义邮件服务器的IP地址
patterson.test.net. IN  A  172.168.96.254
//定义邮件服务器的别名
mail.test.net. IN CNAME  patterson.test.net.
//定义优先级别
test.net.  IN MX  10 mail.test.net.
上述记录只对邮件服务器进行了定义,还有诸如SOA、NS等的定义,在这里就不再赘述。
(2)Postfix使用SMTP安全认证
如同前面所述的qmail服务器面临的邮件转发的问题,在Postfix服务器中同样也存在。为了避免这种情况的出现,Postfix默认不会对外开放转发功能,而仅对本机(localhost)开放转发功能。但是,在实际应用中,必须在Postfix主配置文件中通过设置mynetworks、relay_domains参数来开放一些所信任的网段或网域,否则该邮件服务器几乎没有什么用处。在开放了这些所信任的网段或网域后,还可以通过设置SMTP认证,对要求转发邮件的客户端进行用户身份(用户账户名与密码)验证。只有通过了验证,才能接收该用户寄来的邮件并帮助转发。同样,Postfix中目前比较常用的SMTP认证机制是通过Cyrus SASL包来实现的。
默认情况下,Postfix并没有启用SMTP认证机制。要让Postfix启用SMTP认证,就必须对Postfix的主配置文件/etc/postfix/main.cf进行修改。用户需要在main.cf文件中添加如下有关SMTP认证的设置部分:
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = ''
smtpd_recipient_restrictions = permit_mynetworks
permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients=yes
smtpd_client_restrictions = permit_sasl_authenticated
smtpd_sasl_security_options = noanonymous
其中,每个选项的具体含义如下:
(1)smtpd_sasl_auth_enable:指定是否要启用SASL作为SMTP认证方式。默认不启用,这里必须将它启用,所以要将该参数值设置为yes。
(2)smtpd_sasl_local_domain:如果采用Cyrus-SASL版进行认证,那么这里不做设置。
(3)smtpd_recipient_restrictions:表示通过收件人地址对客户端发来的邮件进行过滤。通常有以下几种限制规则:
permit_mynetworks:表示只要是收件人地址位于mynetworks参数中指定的网段就可以被转发邮件。
permit_sasl_authenticated:表示允许转发通过SASL认证的邮件。
reject_unauth_destination:表示拒绝转发含未信任的目标地址的邮件。
(4)broken_sasl_auth_clients:表示是否兼容非标准的SMTP认证。有一些Microsoft的SMTP客户端采用非标准的SMTP认证协议,只需将该参数设置为yes就可解决这类不兼容问题。
(5)smtpd_client_restrictions:表示限制可以向Postfix发起SMTP连接的客户端。如果要禁止未经过认证的客户端向Postfix发起SMTP连接,则可将该参数值设置为permit_sasl_authenticated。
(6)smtpd_sasl_security_options:用来限制某些登录的方式。如果将该参数值设置为noanonymous,则表示禁止采用匿名登录方式。
在完成上述设置后,必须使用命令/etc/init.d/postfix reload重新载入配置文件,或使用命令/etc/init.d/postfix restart重新启动Postfix服务,以使该配置生效。当然,这两个命令的具体使用需要根据不同的Linux版本来选用。
此外,由于当Postfix要使用SMTP认证时,会读取/usr/lib/sasl2/smtpd.conf文件中的内容,以确定所采用的认证方式,因此如果要使用saslauthd这个守护进程来进行密码认证,就必须确保/usr/lib/sasl2/smtpd.conf文件中的内容为:
pwcheck_method: saslauthd
4、常用的垃圾邮件防范技术
电子邮件的廉价和操作简便在给人们带来巨大便利的同时,也诱使有些人将它作为大量散发自己信息的工具,最终导致了互联网世界中垃圾邮件的泛滥。垃圾邮件问题已经极大地消耗了网络资源,并给人们带来了极大的不便。据中国互联网协会(ISC)2005年第一次反垃圾邮件状况调查显示,中国邮件用户2005年4月平均每人每天收到邮件16.8封,占收到邮件总数的60.87%。并且,从垃圾邮件的总数量来看,每年网民收到的垃圾邮件总量增长率均为40%左右,问题十分严重。
目前,垃圾电子邮件已成为人们最头疼的问题之一。在Linux操作系统平台中,反击和过滤垃圾电子邮件是一件很重要的工作。下面介绍一些在Linux中广泛使用的防垃圾邮件技术。
1.SMTP用户认证技术
目前常见并十分有效的方法是,在邮件传送代理MTA上对来自本地网络以外的互联网的发信用户进行SMTP认证,仅允许通过认证的用户进行远程转发。这样既能够有效避免邮件传送代理服务器为垃圾邮件发送者所利用,又为出差在外或在家工作的员工提供了便利。如果不采取SMTP认证,那么在不牺牲安全的前提下,设立面向互联网的Web邮件网关也是可行的。此外,如果SMTP服务和POP3服务集成在同一服务器上,在用户试图发信之前对其进行POP3访问验证(POP before SMTP)就是一种更加安全的方法,但在应用的时候要考虑到当前支持这种认证方式的邮件客户端程序还不多。
2.逆向DNS解析
无论哪一种认证,其目的都是避免邮件传送代理服务器被垃圾邮件发送者所利用,但对于发送到本地的垃圾邮件仍然无可奈何。要解决这个问题,最简单有效的方法是对发送者的IP地址进行逆向名字解析。通过DNS查询来判断发送者的IP与其声称的名字是否一致,例如,其声称的名字为mx.hotmail.com,而其连接地址为20.200.200.200,与其DNS记录不符,则予以拒收。这种方法可以有效过滤掉来自动态IP的垃圾邮件,对于某些使用动态域名的发送者,也可以根据实际情况进行屏蔽。但是上面这种方法对于借助Open Relay的垃圾邮件依然无效。对此,更进一步的技术是假设合法的用户只使用本域具有合法互联网名称的邮件传送代理服务器发送电子邮件。例如,若发件人的邮件地址为someone@yahoo.com,则其使用的邮件传送代理服务器的Internet名字应具有yahoo.com的后缀。这种限制并不符合SMTP协议,但在多数情况下是切实有效的。须要指出的是,逆向名字解析要进行大量的DNS查询。
3.实时黑名单过滤
以上介绍的防范措施对使用自身合法域名的垃圾邮件仍然无效。对此比较有效的方法就是使用黑名单服务了。黑名单服务是基于用户投诉和采样积累而建立的、由域名或IP组成的数据库,最著名的是RBL、DCC和Razor等,这些数据库保存了频繁发送垃圾邮件的主机名字或IP地址,供MTA进行实时查询以决定是否拒收相应的邮件。但是,目前各种黑名单数据库难以保证其正确性和及时性。例如,北美的RBL和DCC包含了我国大量的主机名字和IP地址,其中有些是早期的Open Relay造成的,有些则是由于误报造成的。但这些问题迟迟得不到纠正,在一定程度上阻碍了我国与北美地区的邮件联系,也妨碍了我国的用户使用这些黑名单服务。
4.白名单过滤
白名单过滤是相对于上述的黑名单过滤来说的。其建立的数据库的内容和黑名单的一样,但其性质是:库中存在的都是合法的,不应该被阻断。同样,该过滤方法存在的缺点与黑名单类似,也是更新和维护难以达到实时,一些正常的、不为系统白名单所收集的邮件有可能被阻断。从应用的角度来说,在小范围内使用白名单是比较成功的。
5.内容过滤
即使使用了前面诸多环节中的技术,仍然会有相当一部分垃圾邮件漏网。对此情况,目前最有效的方法是基于邮件标题或正文的内容过滤。其中比较简单的方法是,结合内容扫描引擎,根据垃圾邮件的常用标题语、垃圾邮件受益者的姓名、电话号码、Web地址等信息进行过滤。更加复杂但同时更具智能性的方法是,基于贝叶斯(Bayes)概率理论的统计方法所进行的内容过滤,该算法最早由Paul Graham提出(http://www.paulgraham.com/spam.html),并使用他自己设计的Arc语言实现。这种方法的理论基础是通过对大量垃圾邮件中常见关键词进行分析后得出其分布的统计模型,并由此推算目标邮件是垃圾邮件的可能性。这种方法具有一定的自适应、自学习能力,目前已经得到了广泛的应用。最有名的垃圾邮件内容过滤是Spamassassin,其使用Perl语言实现,集成了以上两种过滤方法,可以与当前各种主流的MTA集成使用。内容过滤是以上所有各种方法中耗费计算资源最多的,在邮件流量较大的场合,需要配合高性能服务器使用。另外,当前也有很多学者将人工神经网络、支持向量机、Winnow算法等及其学习的方法引入到内容过滤垃圾邮件的研究中来,并且取得了很好的效果。