无论从使用的广泛程度,还是从代码的复杂程度来讲,sendmail都是一个非常优秀的软件。如果使用它来构建网站的电子邮件系统,基本上不必费心,因为几乎所有的Unix的缺省配置中都内置这个软件,只需要设置好操作系统,它就能立即运转起来。然而,Internet用户的要求更为苛刻,纷纷指出sendmail中包含的各个不足之处。
第一个重要的缺点是它的安全性较差,这是因为当其作者Eric Allman最初开始写作这个软件的时候,Internet的用户还很少,因而安全性并不没有得到大家的重视。由于邮件系统需要处理的是外部发送来的各种各样的信息,甚至包含一些恶意数据,然而sendmail在大多数系统中都是以root身份运行,一旦出现问题,就会对系统安全造成严重影响。在这种情况下,要防止出现安全问题,仅仅依赖程序本身是不可取的,应该从系统结构出发,使程序拥有的特殊权限限制到最小。
此外,也是由于其早期的Internet用户数量及邮件数量都相当小,Sendmail的系统结构并不适合较大的负载,对于高负载的邮件系统,需要对Sendmail进行复杂的调整。例如,通常情况下sendmail只启动一个进程顺序向外发送邮件,如果邮件较多时就要花费相当长的时间。
使用Sendmail还会遇到的另一个问题是它的设置相当复杂,对于使用缺省设置来收发电子邮件,问题并不存在。当管理员打算进行一些特殊设置,以便利用Sendmail提供的复杂邮件处理能力时,就不得不面对复杂的宏和正则表达式。虽然现在Sendmail使用了宏预处理程序m4使设置更易于理解一些,但是掌握Sendmail的设置仍然是对系统管理员的一大挑战。
使用Qmail替代Sendmail
为了解决sendmail的安全问题,整个系统结构需要重新设计。基本的原则是将系统划分为不同的模块,有负责接收外部邮件的,有管理缓冲目录中待发送的邮件队列的,有将邮件发送到远程服务器或本地用户的。Qmail就是按照这个原则进行的设计,它由多个不同功能的小程序组成,只有必要的程序才是setuid程序(即以root用户权限执行),这样就减少了安全隐患,并且由于这些程序都比较简单一些,因此就可以达到较高的安全性。
这种按照Unix思路的模块化设计方法也使得Qmail具备较高的性能,因为如果需要,Qmail可以启动某个模块的多个实例来完成同一个任务,例如启动多个发送程序同时向外发送邮件,这对于提供邮件列表服务的邮件系统是非常有益的。这种方式也使得Qmail要占用较大的网络带宽,如果带宽有限,效果反而不好,但在当前网络性能大幅度提高的情况下,这种方式是非常合适的。
Qmail还提供一些非常有用的特色来增强系统的可靠性,例如,它提出了Maildir格式的邮件存储方式,这使得通过网络文件系统NFS存取邮件成为可能。此外,Qmail还具备一些非常别致的特色,它不仅仅提供了与Sendmail兼容的方式来处理转发、别名等能力,还可以用以Sendmail完全不同的方式来提供这些功能。从它的编译安装方式、提供的扩展功能和源代码的风格,可以看出其作者Dan Bernstein是一个极具个性化的程序员。正因为如此,对于Qmail的某些方面,有着一些争论,例如有些人认为Qmail的安装设置并不易于理解,很容易让人糊涂,而另一些人的看法则相反。基本上这是因为Qmail提供解决问题的方式,和Sendmail不大相同的缘故,这样对那些不太熟悉Sendmail的邮件系统管理员,反而更容易接受Qmail一些。
另一种替换软件:Postfix
Postfix同样也是采用了模块化的方式,但与Qmail不同的是,Postfix使用了一个主控进程进行监控。Postfix在很多方面都考虑到了安全问题,它甚至不向root分发电子邮件,以避免以root身份读写文件或启动外部程序。考虑到它的作者Wietse Venema曾编写了著名的安全软件TcpWrapper,并是SATAN程序的合作人员之一,Postfix的安全性是非常值得信赖的。
同样,Postfix的性能也非常不错,甚至在Qmail作者自己进行的测试中也表明,Postfix的性能和Qmail基本相当。但Postfix占用的内存要大一些,这主要是由于Postfix和Qmail在系统结构上的差异造成的。
与Qmail不同,Postfix更着眼于作为Sendmail的直接替换,使用Postfix替换Sendmail却相当简单,因为Postfix使用的很多文件和Sendmail一致,只需要在配置文件中指明原有Sendmail配置文件的位置就可以了,Postfix甚至还提供了sendmail和mailq程序,以保持兼容性。基本上,可以直接从Sendmail转换为使用Postfix,而不需要额外的设置。Postfix提供的安装配置方式也相当简单,它使用中心化的配置文件和非常易理解的配置指令。
Postfix提供的一些强大的功能主要在于多种数据库表查询方式,例如它支持DB、DBM、passwd文件、正则表达式、MySQL数据库以及LDAP方式的查询,用于支持系统级的别名、虚拟主机等。虽然在Qmail中也能支持这些功能,但没有象Postfix那样统一、简洁。此外,更改Postfix的设置之后,也不需要重新启动整个系统,只需要使用postfix reload就能完全刷新配置,这也避免了丢失邮件的可能性。
事实上,除了Qmail和Postfix之外,还有很多种邮件系统,例如Smail、Exim等,然而毫无疑问Qmail和Postfix是其中最优秀的,也是Sendmail最有力的竞争者。此外,还有一些商业邮件服务器产品,但一般情况下,购买商业邮件服务器软件大部分是冲着其提供的服务或者是附加功能来的,例如群件产品通常带有很多额外功能用于办公环境等。
至于在Sendmail、Postfix和Qmail之间进行选择,基本上依赖于用户自己的偏好。有些人喜欢Qmail提供的复杂特色,而有的人希望对Sendmail的替换能简单一些,也有人不打算更换,而坚持使用Sendmail的最新版本。对于一个熟悉Unix系统而又愿意改善邮件系统性能和安全性的管理员,应该转换为使用Postfix或Qmail,除非对Sendmail非常熟悉而保持了特殊的感情。在Postfix和Qmail之间,它们各自有一批忠心拥护者,选择哪个都是可行的。不管选择哪种邮件系统核心,都需要选择过硬的专业电子邮件系统厂商提供完善的技术支持服务,除非您本身有强大过硬的技术力量,否则,您将面对的是一场恶梦.
Sendmail作为免费的邮件服务器软件,已被广泛应用于Internet各种操作系统的服务器中。如:Solaris,HPUX,AIX,IRIX,Linux等等。随着互连网的普及,邮件服务器受攻击的机会也大大增加。目前互连网上的邮件服务器所受攻击有两类:一类就是中继利用(Relay),即远程机器通过你的服务器来发信,这样任何人都可以利用你的服务器向任何地址发邮件,久而久之,你的机器不仅成为发送垃圾邮件的帮凶,也会使你的网络国际流量激增,同时将可能被网上的很多邮件服务器所拒绝。另一类攻击称为垃圾邮件(Spam),即人们常说的邮件炸弹,是指在很短时间内服务器可能接收大量无用的邮件,从而使邮件服务器不堪负载而出现瘫痪。这两种攻击都可能使邮件服务器无法正常工作。因此作为一个校园网邮件服务器防止邮件攻击将不可缺少。
目前对于sendmail邮件服务器,阻止邮件攻击的方法有两种。
一种是升级高版本的服务器软件,利用软件自身的安全功能。
第二种就是采用第三方软件利用其诸如动态中继验证控制功能来实现。下面就以sendmail V8.9.3为例,介绍这些方法。
1.服务器自身安全功能
(1)编译sendmail时的安全考虑
要利用sendmail 8.9.3的阻止邮件攻击功能,就必须在系统编译时对相关参数进行设置,并借助相关的软件包。目前主要就是利用Berkeley DB数据库的功能,Berkeley DB包可以从相关站点上下载,并需要预先编译好。然后将Berkeley DB的相关参数写进sendmail的有关文件中。
a.修改site.config.m4文件
将编译好的Berkeley DB有关库文件路径加入到site.config.m4文件中,使sendmail编译后能够使用Berkeley DB数据库。
例如:
#cd $/sendmail-8.9.3/BuidTools/Site 修改site.config.m4文件 define (confINCDIRS, -I/usr/local/BerkeleyDB/include) define (confLIBDIRS, L/usr/local/BerkeleyDB/lib)
b.修改sendmail.mc文件
sendmail.mc是生成sendmail.cf的模板文件之一,要使sendmail具有抗邮件攻击功能还需在该文件中进行相关定义。
主要包括以下几项: ......
FEATURE(relay_entire_domain)
FEATURE(ACCESS_DB)dn1
FEATURE(blacklist_recipients) ......
(2)相关文件的配置
正确编译好sendmail是邮件服务器安全控制的基础,而真正的安全设置主要还是利用相关文件进行的。这种包含控制语句的文件主要是access和relay-domains。 access是邮件安全控制的主要数据库文件,在该文件中可以按照特定的格式将需控制的域名、IP地址或目标邮件地址,以及相应的动作值写入,然后使用makmap命令生成access.db文件(#makemap hash access.db spam.com REJECT edu.cn OK hotmail.com DISCARD 其中reject动作是拒绝接受从指定地址发来的邮件;ok是允许特定地址用户任意访问;relay允许通过本邮件服务器进行中转邮件;discard是将收到的邮件交给特定命令进行处理,例如:可以设定将收到的邮件丢弃,或者设定收到邮件后返回给使用者一条出错信息等等。 Relay-domains文件是设定哪些域是该服务器可以中继的域,其格式为每个域占一行。如: ...... CN EDU JP ...... 在服务器开始使用时建议将所有顶级域名加入其中,以后再根据安全需要对其进行修改,否则将会使pop3用户发送邮件时出现relay reject错误,而无法向没有加入的域名目标邮件地址发送邮件。3)版本号的修改 对于一台邮件服务器,可以通过远程的25端口telnet命令来获取服务器的版本信息。如:“telnet sendmail服务器主机25”就可以查看sendmail的当前版本。为了防止一些恶意的查看版本信息操作,sendmail提供了可以对显示的版本进行修改的操作。 在sendmail.cf文件中有一句“SmtpGreetingMessage=$j sendmail $V/$Z; $b”的语句,其中$V/$Z就是版本信息,正常情况下由该参数显示的版本信息为sendmail本身的版本。如果要设定成管理员给定的版本信息,只需将该参数改掉,然后加入你所希望的信息即可。例如:当把这句改成“SmtpGreeting Message=$j sendmail 0.0/0.0; $b”,重启sendmail服务,则sendmail的版本就会变成“sendmail 0.0”。从而达到隐蔽版本信息的目的。 以上是sendmail 8.9.3本身带有的安全功能设置,通过这些安全设置可以大大加强服务器安全性能。但是在防止邮件中继和邮件炸弹的设置时,如何确定哪些目标地址是需阻止中继的,哪些又是允许中转的,似乎只能通过管理员对日志文件的分析和观测,或者待发现了安全问题后才能确定。因此这种安全控制还仅是事后控制,并且对相关文件修改后还必须重新启动服务器。如要实现事先动态安全控制还需要采用其他方法。 2.动态中继验证控制 DRAC(Dynamic Relay Authorization Control)动态中继验证控制是专门为邮件服务器设计的一个服务器端软件(http://mail.cc.umanitoba.ca/drac/index.html),它可以安装在一台SMTP服务器上,并同时为多个邮件服务器提供动态中继验证服务。DRAC主要通过自动获取和动态更新中继验证数据库中的信息来允许合法pop3或IMAP用户使用邮件服务器,从而有效地控制邮件炸弹和非法的邮件中继。DRAC的原理就是利用pop3或imap服务器固有的功能来获取用户名、密码和客户机IP地址等信息,并将这些信息及时映象到验证数据库中,供smtp服务器调用,同时在经过一段时间以后(缺省为30分种),其验证信息将自动失效,需要用户重新输入验证信息。这样不仅可以保证合法的pop3或imap用户能够正常使用邮件服务器,也可以阻止任何非注册用户(包括本地)利用邮件服务器来发送邮件。这种邮件安全控制常常被称为:“邮件服务之前的pop验证”(POP-before-SMTP)。 (1)DRAC的编译 在编译DRAC之前,系统的sendmail服务器应该已经正确编译安装了。首先在DRAC源程序目录中编辑Makefile文件,在Solaris 2.x操作系统中其Makefile改成: INSTALL=/usr/ucb/install EBIN=/usr/local/sbin MAN=/usr/local/man/man DEFS=-DTI_RPC -DFCNTL_LOCK -DSYSINFO CC= (编译器) RANLIB= : CFLAGS=$(DFES) -g -I/path/to/db/include LDLIBS=-L/path/to/db/library -lns1 -1db TSTLIBS=-L. -ldrac -lns1 MANLIB=3 MANADM=1m 然后编译并安装即可。 如果存在多个pop/IMAP服务器,则还需要将这些服务器的IP地址加到文件/etc/mail/dracd.allow中,其文件书写格式与/var/yp/securenets文件格式一样。如: 255.255.255.255 202.139.244.23 255.255.255.255 127.0.0.1 (2)修改sendmail.mc文件重新生成sendmail.cf 在使用DRAC验证功能之前,还需要将DRAC的验证信息加到sendmail.cf文件中。首先要修改sendmail.mc文件,然后重新生成sendmail.cf。sendmail.mc文件中相关语句修改如下:在LOCAL_CONFIG行下增加 kdrac btree /etc/mail/dracd 在LOCAL_RULESETS下增加 Slocal_check_rcpt R$* $: $%26amp;{client_addr} R$+ $: $(drac $1 $: ? $) R? $@ ? R$+ $@ $#OK 重新生成sendmail.cf文件后,再重启sendmail进程。,