1 引言
sendmail是由Berkeley大学开发的电子邮件收发程序,属于免费软件,大家可以从因特网上下载自由安装。经过维护开发人员多年的努力,sendmail的平台适应性大幅度提高,可以运行在大多数UNIX和类UNIX主机上面,包括SunOS,HP-UX,IRIX,AIX,LINUX等。 对于一般通信量的用户来说,sendmail在不考虑宿主服务器性能的前提下,可以支持高达数万个用户的电子邮件通信服务,所以,sendmail对于一般站点的邮件通信是完全可以胜任的。目前,它承当着大部分因特网上电子邮件的收发工作。
除了sendmail之外,当前使用中的邮件收发程序还有Netscape Messaging Server, Microsoft Exchange Server, Lotus Domino Notes等,但是它们大多数都是商业程序软件,应用范围和影响都还远没有sendmail大。
电子邮件服务在WWW出现之前,一直是因特网上最为繁忙的服务,当前电子邮件的信息流量仍然是因特网上最重要的来源之一。作为电子邮件服务的承当者,sendmail的配置和安全运行直接关系到系统服务的提供和安全。
SMTP是因特网上计算机间传送电子邮件的协议,而sendmail则实现了该协议中的服务器和客户端两部分的功能。它最简单的功能就是将一台主机上某个用户的邮件传送到同一台主机上某个用户的邮箱中,此时sendmail的功能看上去几乎过于简陋了。但是随着主机接入Internet,通信双方的距离以及通信的内容等都开始变得千变万化,此时sendmail需要查询域名服务器来得到对方的IP地址,同时为了满足用户对电子邮件收发过程中的不同需求,配置文件也变得非常复杂,这些功能的增加使得sendmail程序很快地复杂起来,它的程序源码变得很长。这种功能过于集成的软件设计成为以后sendmail无穷无尽的漏洞的隐患。
作为系统安全防御的一种手段,当发现某个超级用户身份运行的程序存在安全漏洞,并且暂时没有相应的补丁时,可以临时去掉该程序的超级用户身份置位。但是,sendmail却不同,它必须以超级用户的身份运行才能提供服务,因此,上面这种办法对sendmail行不通。同时其程序源码在因特网上是公开的,对于研究sendmail,寻找其中的安全漏洞并加以利用提供了巨大的方便。sendmail的配置也是系统应用软件的配置中最为复杂的一例,它的运行还与域名系统的配置密切相关。上述各种因素都使得sendmail经常成为系统安全链条中的最为薄弱的一环,也是黑客攻击的重要目标。针对sendmail的防守和攻击也是一个长期的、高级的技术过程。
本文在后面部分将介绍讨论sendmail最近的版本升级情况以及版本升级直接解决的网络安全问题,通过分析与sendmail有关的文件系统的安全和sendmail的安全特性,为系统管理员提出了一些安全配置方面的建议。
2 sendmail的版本升级
sendmail的版本升级非常频繁。最近的几次连续的版本升级分别是1997年10月24日发表8.8.8,1998年5月19日发表8.9.0,同年7月2日发表8.9.1,12月30日发表8.9.2,今年2月4日发表了8.9.3。每次sendmail版本的升级,不仅仅是功能上的提高,更重要的是新版本中改正了以前版本中的某些安全漏洞。例如,最新版的8.9不仅提供了用于控制垃圾邮件和匿名转发等的功能,还修改了对MIME内容的处理模块,避免某些邮件客户端在处理邮件时可能会出现的由于分段错而允许远程攻击者运行任意命令的安全漏洞。
对于系统管理员来说,加强sendmail安全的最有效的办法就是勤奋地工作,保持自己管理的系统中运行的是最新的版本,并参照有关文档进行合理的配置。
通常情况下,可以通过telnet到主机的25号端口来判断该主机使用的sendmail版本号。例如,
%telnet localhost 25
Connected to localhost.
Escape character is ^].
220 localhost.localdomain ESMTP Sendmail 8.9.2/8.9.2; Tue, 30 Mar 1999 12:26:10 +0800 (CST)
上述信息表明该主机运行的是sendmail8.9.2。版本号一般由被两个圆点分开的三个数字组成。当前运行的绝大多数是sendmail 8.x.x,第三个数字的提高表示只有轻微的改进,所以也可以将其视为一种软件补丁的等级。通常,"8.9"是指包括头两位数字是"8.9"的所有补丁等级,而"8.9.x"则只指某个特定的等级。
非常值得注意的是版本8.9对于8.8的升级。1998年5月19日发表的sendmail 8.9.0比以前的版本(8.8.8或者更以前)在各个方面都有了很大的改进,尤其是安全相关方面的特性有了大幅度的增强。主要表现在以下几个方面:
新版本中,按照缺省配置,sendmail8.9.0关闭了邮件转发功能。在这里,转发的意思是:服务程序接收来自本域外的邮件并将其转发至本域外某主机。随意的转发功能增加了邮件服务器的运行负担,同时纵容和方便了垃圾邮件,骚扰邮件,邮件炸弹攻击等的散发者和发起者,为网络运行产生了许多不必要的投诉,增加了系统管理员的工作量。同时,通过对新版sendmail提供的多种功能特性的合理配置,管理员可以按照自己的需求和意愿来有选择地为某一部分用户提供转发服务,拒收已知的某些域,某一段ip,某些用户的邮件,保护正常用户不受邮件干扰。
新版本中增强了属性安全检查功能,缺省配置下拒绝对不安全目录(即允许组用户甚至所有用户可写的目录)中的forward文件以及:include:文件作任何操作,从而避免恶意用户通过上述文件运行权限以外的程序,保证了sendmail的安全运行。
新版本的sendmail改正了对不安全目录中的文件进行跟随链接操作的安全漏洞。
对HELO/EHLO参数的长度进行了限制,这样可以防止垃圾邮件或者恶意邮件散发者在邮件头"received:"域中隐藏其连接。
其中,邮件转发功能方面的改进非常重要。虽然在原来的8。8版本中,经过合理的配置(增加mail_check_relay,mail_check_rcpt等几个ruleset)也可以限制邮件的转发功能,并拒收黑名单上地址的邮件,但是对于普通管理员来说,操作过于复杂,不容易实现。因此,将sendmail升级到8.9.0以上版本是加强邮件管理、减少邮件干扰的最为有效的途径。
3 sendmail与文件系统安全
从版本8.6.5开始,sendmail引入了安全属性检查功能,并在以后的版本中不断增强,这表明了文件系统安全与sendmail安全运行的密切关系越来越受到大家的重视。所以,有些用户发现,本来在8.8版本中允许的目录和文件属性,在升级到8.9版本时,sendmail却拒绝运行。例如下面的操作:
#ls -al /etc/mail
drwxrwxr-x 2 root mail 512 1月 15 15:00 .
drwxr-xr-x 26 root sys 3072 3月 26 17:39 ..
-rw-r--r-- 1 bin bin 153 11月 25 11:36 Mail.rc
-rw-rw-r-- 1 root bin 1219 12月 25 10:39 aliases
-rw-r--r-- 1 root root 0 11月 25 13:02 aliases.dir
…
# newaliases
newaliases: cannot open /etc/mail/aliases: Group writable file
也就是说,对于组可写的/etc/mail目录或者aliases文件做别名库更新(#newaliases或者#/usr/lib/sendmail -bi)时,会被sendmail拒绝。
下面所列的一些目录、文件和sendmail安全直接相关,它们错误的文件属性可能会导致sendmail的启动失败或别名(aliases)库更新失败。它们的功能、属性分别是:
/ :根目录在安全的许多方面至关重要。它在许多系统中是root的主目录,允许其他普通用户可写会严重威胁系统的安全,例如可以通过创建.forward或者.rhosts等等轻易控制系统。因此root必须保持对该目录的绝对控制。它的属主应该是root,组也建议设为root,权限建议设置为755。
/etc :该目录中保存着系统的大多数配置。例如resolv.conf定义了域名服务器的位置,nsswitch.conf定义了主机名的查询次序等等,它们都与sendmail的运行直接相关。属主应该为root,组为sys,建议也设为root,权限设置为755。
/etc/mail :该目录中保存着sendmail的主要配置文件。属主应该为root,组缺省为mail,权限设置为755。
/etc/mail/aliases :该文件定义了主机邮件用户的假名,通过假名的设置,管理员可以实现邮件列表、邮件转发等功能。通过对假名设置的篡改,攻击者可以执行主机的命令、查阅其它用户的邮件等。该文件属主为root,权限设置为644。
/etc/mail/sendmail.cf :该文件是sendmail最重要、最直接的配置文件,内容包括sendmail运行所需的各种类、宏、选项、规则等的定义,非常复杂,往往只有经验非常丰富的管理员才能对其进行完整地配置。该文件的损坏常常会导致sendmail不能运行,某些情况下只能重新安装sendmail来产生该配置文件。该文件属主应该是root,权限为644。
/usr/lib/sendmail : 该文件是sendmail的执行程序,完成邮件的收发工作。如果该文件被攻击者控制,则表明系统已经被完全攻克。建议该文件属主设为root,权限设为4755。
/var :该目录保存着系统中随时间经常变化的文件和配置,例如,系统日志、用户的邮件队列等等。sendmail运行中报告的各种信息通常配置下都保存在目录下(一般是/var/adm,或者/var/log等)。属主应该是root,权限应该为755。
/var/spool和/var/spool/mqueue :它们在缺省配置下是保存邮件队列的目录,属主应该是root,权限应该为755。
~/.forward :该文件通常保存在用户的主目录下,定义了该用户邮件的转发操作。通过修改该文件,攻击者可以以该用户的身份执行主机上面的命令(前提是该用户在/etc/passwd文件定义的shell出现在/etc/shells中)。例如,某用户foo主目录下的.forward文件内容如下:
\foo,"|/bin/touch /tmp/anyfile"
通过给该用户发送一封电子邮件,达到了创建文件/tmp/anyfile的目的。系统管理员应该定期地检查用户所设的.forward的文件内容,或者通过配置/etc/shells文件和用户的shell来达到禁止该用户运行主机命令的目的。
4 sendmail的特性与配置
sendmail提供了许多在编译期间选择的功能特性。通常情况下,按照其缺省配置,即可满足一般用户的需要。但是,了解研究其提供的特性,可以实现对sendmail许多功能的更为准确的配置使用。从网络安全的角度考虑,通过合理地配置有关特性,可以在提供服务和保证安全之间找到更为准确的平衡点(配置特性的方法是将需要的特性加入到相应系统的.mc文件中,然后利用工具m4生成最终的sendmail.cf文件,具体操作详见源程序包附带的说明文件)。
和网络安全相关的重要特性(FEATURE)有:
· FEATURE(promiscuous_relay):该特性打开任意转发功能,也即关闭8.9带来的邮件转发方面的安全增强控制。此特性的使用会对电子邮件服务的滥用留下许多隐患,建议除非特别情况,不要使用此特性。
· FEATURE(accept_unqualified_senders):缺省情况下,该特性被关闭,即当MAIL FROM:参数中的地址表明属于网络连接,但是却不包含合法的主机地址时,sendmail将拒绝继续通信。打开此特性则不再根据MAIL FROM:参数拒绝接收邮件。建议不可轻易使用该特性。
· FEATURE(loose_relay_check) :通常情况下,当邮件使用了源路由功能,例如user%site@othersite,如果othersite属于转发邮件的范围,则sendmail将分离othersite,继续检查site是否属于转发范围.使用该特性将改变上述缺省操作.建议不要轻易使用该特性.
· FEATURE(accept_unresolvable_domains) :通常情况下,当MAIL FROM:参数中的主机地址部分无法解析,即无法判定为合法主机地址时,sendmail将拒绝连接.使用该特性将改变上述操作. 在某些情况下,例如,邮件服务器位于防火墙后面,无法正常解析外部主机地址,但是仍然希望能够正常接收邮件时,可能需要利用该特性.
· FEATURE(blacklist_recipients) :打开接收黑名单功能。接收黑名单可以包括用户名、主机名、或其它地址。
· FEATURE(relay_entire_domain) :缺省配置下,sendmail只为在转发控制数据库(access db)中定义为RELAY的主机提供转发邮件服务. 该特性的使用,将使sendmail为本地域内(由 $=m类定义)的所有主机上面的用户提供转发功能。
5 结论
sendmail邮件程序是目前因特网上面应用最为广泛的软件之一. 由于其程序设计上面的缺憾,其功能配置非常复杂,往往成为系统安全的隐患.正确合理地配置sendmail可以加强系统安全,减少系统管理员因为电子邮件服务带来的不必要的工作量.及时地升级sendmail的版本并正确配置是减少sendmail安全漏洞的最为有效的方法.本文简要分析了对sendmail进行及时升级的必要性, 介绍了最近版本升级在安全方面带来的益处,以及在安装配置sendmail过程中几个重要特性的使用. 希望能够为使用sendmail的管理员带来一些帮助.其中不当之处,也希望大家能够批评指正.