第一部分:简述
一个完整的邮件系统包括三大部分:操作系统,邮件服务程序,用户代理软件
操作系统作为整个邮件服务器的底层支持,安全是至关重要的。在这方面,linux操作系统先天要比windows健壮的多。Windows下的安全问题,一直以来是管理员的最大敌人。至于有关如何搭建一个足够安全,足够健壮的linux操作系统,请参考另一篇文章关于如何《构建安全的linux服务平台》,你会从中得到一些帮助,或者是获取相关的意见和建议。
下面主要是着重讲述有关qmail的安全问题。庆幸的是,qmail自身的代码到目前为止,尚未发现什么漏洞。也许你不相信,但是Dan Bernstein(qmail的作者)的确做到了。Qmail默认支持以下安全和可靠必特征:
l qmail程序使用了几个独立的用户ID运行,而且不需要任何shell支持。
l qmail限制root的setuid的使用到最小的程序,迄今为止,其拥有setuid的程序无任何代码漏洞。
l qmail支持SMTP发信认证和SASL认证机制。
l 使用先进快速的信息队列及子目录循环来存储邮件消息。并使用了比mailbox更安全可靠的Maildir目录结构,保证即使在突然断电状态下,仍保存用户的信息不丢失。
l qmail使用详细的信息递送日志,提供更多的信息供管理员分析。
虽然qmail不需要管理员过多的配置就可以保证一个安全的邮件服务器环境,但是作为网络上的主机服务器,安全问题总是随时随地存在,最大程序上的保护主机安全,仅仅靠缺省配置还是不够的。下面就让我们深入到内部,了解一下qmail还提供了怎样的安全防范措施。
第二部分:深入研究MTA----qmail
我们从邮件传输的过程开始分析:
1. SMTP认证
有效的SMTP认证可以防止垃圾者利用我们的主机发送垃圾邮件,除非它已经破解了主机上合法用户的用户名/密码,冒充合法用户进行大量的垃圾邮件发送行为。针对这种情况,我们的工作:
l 定期检查合法用户的口令对,是否为弱口令,如果是,则需要提醒用户更改他们的密码,防患于未燃。
l 一旦合法用户的口令被破解并被利用发送大量邮件时,我们可以通过后台的邮件传输监视程序进行流量分析,如果发现该用户在短时间内通过服务器发送大量的邮件,则认为该用户的行为不正常,在第一时间内限制用户发信的合法权限,并通知管理员处理异常情况。
如果是使用outlook来收发邮件,需要做一些设置。
2. SASL认证机制
SASL(简单认证和安全层协议),是一个运行在网络应用层的插件程序。它的作用和SSL安全套接层类似,但是由于SSL认证需要会话两端必须都支持SSL,而且响应时间比正常会话要高一个数量级,因此,目前,该技术并没有得到广泛应用。SASL认证机制可以使用很多不同的机制来认证用户:如
l KERBEROS_V4
l GSSAPI
l SKEY
l CRAM-MD5
l DIGEST-MD5
l PLAIN
l LOGIN(最常用的机制,使用基于64位的密钥加密用户ID和口令,但安全性较低),但是outlook却使用login机制来加密信息。
如果在第3步中,验证没有通过,则MTA拒绝客户端的请求。
3. 互联网出现的早期,接收发往你的邮件服务器的所有邮件被认为是一种礼貌的行为。如果某一封信不是发往本地用户的,邮件服务器将会试着按照它的地址进行发送,这种功能称之为“开放式转发”。这样做的好处,他们就不需要总是连接每一个特定的邮件服务器来递送邮件,给管理员带来巨大的便利。但是随着网络的发展,很多商业营销人员发出大量的非索要商业邮件(UCE),未经用户的同意,就直接投递给了用户,使其邮件服务器成为垃圾邮件的源头。甚至,在网络上还出现了公开搜集和出售邮件地址的信息。因此,QVImail使用了限制式转发。不再转发所有客户的邮件,而只转发预先定义的一组客户的邮件。
QVImail是通过使用ESMTP协议的SMTP认证功能(SMTP AUTH)来控制发信者,只有通了认证的用户才可以通过服务器发送电子邮件。通过建立你的/etc/tcp.smtp文件,编写其中的内容为
127.0.0.1:allow,RELAYCLIENT=""
192.168.0.:allow,RELAYCLIENT=””
并且成功生成了tcp.smtp.cdb文件,生成方法如下:
/usr/local/bin/tcprules etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
同时确认你的服务器启动脚本为
/usr/local/bin/tcpserver -H -R -l 0 -t 1 -v -p -x \
/home/vpopmail/etc/tcp.smtp.cdb -u qmaild -g nofiles 0 smtp \
/var/qmail/bin/qmail-smtpd your.host.name /home/vpopmail/bin/vchkpw \
/bin/true 2>&1 | /var/qmail/bin/splogger smtpd 3 &
这样,邮件服务器就完全关闭了OPEN-RELAY。
4. 如果前面顺利的话,现在邮件服务器就可以响应客户端的请求了,当然,这个时候我们还不清楚客户端是垃圾者还是合法用户,因此,我们可以通过以下手段检测:
l 使用第三方RBL
RBL(Realtime Blackhole List)是实时黑洞列表,是国际上比较流行的反垃圾邮件技术,可以采用RBL来使邮件服务器拒收在列表中已知的垃圾邮件发送服务器所发送的垃圾邮件。
QVImail默认安装完后已经支持RBL扫描。
通过修改你的SMTP启动脚本,加上/usr/local/bin/rblsmtpd。如:
/usr/local/bin/tcpserver -H -R -l 0 -t 1 -v -p -x \
/home/vpopmail/etc/tcp.smtp.cdb -u qmaild -g nofiles 0 \
smtp /usr/local/bin/rblsmtpd \
/var/qmail/bin/qmail-smtpd your.host.name \
/home/vpopmail/bin/vchkpw /bin/true 2>&1 | \
/var/qmail/bin/splogger smtpd 3 &
如果你想使用第三方的RBL列表,只要加上-r选项就可以了,比如:
-r blackholes.mail-abuse.org
-r cbl.anti-spam.org.cn
这样如果连接主机出现在RBL列表中,就拒绝连接。
l 创建垃圾邮件主机列表,拒收垃圾邮件的发件人
如果邮件系统管理员在对日志进行统计分析,可以发现一些比较集中的收发件人的邮件地址,对于比较集中的发件人,我们可以根据他所发送到的邮件地址来判断,是否是垃圾邮件。如果收件人地址大量是不存在的地址,可以肯定,这是以用户名猜测方式来发送垃圾邮件的手段(这也是比较常见的垃圾邮件发送方式),需要对此发信地址进行拒收。或者是对同一个帐号发送大量的邮件,也需要对此发信地址进行拒收。
拒收的方法:
编辑/var/qmail/control/badmailfrom文件(如果没有可以新建一个)将要拒收的邮件地址写入,每条记录为一行如:
123@123.com 这样所有FROM来自
123@123.com的邮件都会被邮件服务器拒收。
同样也可以对一个域进行拒收,在badmailfrom文件中加入
@test.com
这样所有来自test.com的任何地址的电子邮件都会被服务器拒收。
l 拒收垃圾邮件的发送IP
如果利用一些工具来发送垃圾邮件,可以使发件人的邮件地址变成随机地址,可能发到你的服务器的每一封垃圾邮件的发件人地址都不一样,这样怎么办?拒收发件人的方法,就起不到应有的做用了。
我们可以通过查看邮件日志和网络的SMTP(25)端口的连接情况,找出发件数目比较高的IP和连接数比较高的IP,用防火墙来对这些IP进行拒收,从网络层就拒收这些垃圾邮件,同时也有相当高的效率。
如果是Linux系统就可以直接的用ipchains或iptables来拒收。
iptables –A INPUT –p tcp –s 你要拒收的IP –d 你的服务器IP --dport 25 –j \ DROP
l 正确的设置.qmail-default
.qmail-default文件在/var/qmail/alias目录下,相关的.qmail-文件是为了实现qmail的转发功能的,而.qmail-default是qmail-local进程找不到合适的转发规则时而要匹配的最后一个文件,如果是默认的设置,qmail默认为所有的Mailbox都是合法存在的。这样是有隐患的,可以设置它的内容为
/home/vpopmail/bin/vdelivermail '' bounce-no-mailbox
这样不存在的邮箱都会bounce掉并且返回no-mailbox信息。
5. 相信通过以上的一些措施,有相当一部分的垃圾邮件会被阻止连接,但是我们只是从发送邮件服务器的特征,如主机地址,IP,连接数量等来杜绝垃圾源,还没有去仔细检查邮件本身是否包含有垃圾内容。所以,我们需要在应用层上做内容过滤。
l 使用spamassassin软件来分析邮件是否为垃圾邮件。
l 使用maildrop过滤及分类投递邮件。
l 使用qmail-qfilter过滤带有特定词语的邮件。