企业开源电子邮件系统安全保障实战精要: 第 1 部分,原理及 Sendmail、Qmail 安全防护实战

电子邮件系统已成为现代企业必不可少的网络基础设施,开源电子邮件系统也逐渐成为企业构建应用时的首选。然而,如何确保电子邮件系统安全、抵御垃圾邮件、邮件病毒等安全威胁是企业在应用构建过程中需要着重解决的问题。作为本系列的第一部分,本文将详细介绍企业开源电子邮件系统的安全原理及 Sendmail、Qmail 邮件服务的安全防护实战。

李 洋, 信息安全顾问

李洋,博士,现任某大型金融公司信息安全顾问,多年来一直从事信息安全方面的研发和管理工作,具有丰富的互联网、电信网和金融行业信息安全管理、咨询和研发经验。目前关注开源系统安全、云安全、虚拟化安全等。



2013 年 4 月 15 日

企业开源电子邮件系统简介

企业开源电子邮件系统模型基本可分为邮件传递代理 MTA、邮件存储和获取代理 MSA 以及邮件客户代理 MUA 三大模块,下面就邮件系统的组成作介绍。

邮件传递代理(MTA)

企业 Linux 开源系统下的邮件传递代理(Mail Transfer Agent)通常使用 Sendmail,该系统几乎在任何 UNIX 平台上都有相应的版本。另外,还有 D.J. Bernstein 的 Qmail 以及 Wietse Venema 的 Postfix 系统。它们负责接收并转递邮件。这虽然看起来很简单,实际上设置可能相当复杂。在邮件策略管理时需要设置一系列的路由和伪装选项,而许多功能是由语言编程实现的,用以过滤或者修改中继消息的头信息。此外邮件路由和寻址邮件存储信箱的过程包含了复杂的与各种目录服务交互操作,这些目录服务可能包括 DNS、密码文件、NIS、LDAP 别名 / 数据库管理文件,以及各种的通用数据库系统。

如今的 MTA 还要实现反垃圾邮件功能,控制邮件头的 to 和 from 地址格式,达到允许或者限制特定域名或者地址范围目的,以上主要是通过修改存取控制表和规则实现的。这一过程通常包括查询数据表或者目录服务,例如 Paul Vixie 的实时黑洞列表程序 RBL,邮件滥用预防系统 MAPS,以及同类的 Dorkslayer/ORBS 系统。MTA 一直在不断增强之中,以实现加强的策略控制以及反病毒和反蠕虫等功能。

在大多数情况下,安装和设置 MTA 系统比较容易,不过强大功能的实现是以高度复杂性为代价的。如果用户所在的机构选择定制的 MTA 来满足特定的路由、体系、安全性和反垃圾邮件等要求,就需要更加复杂的设置选项,配置包括设计并处理 MTA 和各种子系统如 LDAP、DNS 服务器之间的复杂关系。

众多的 MTA 软件中,最为有影响的应该是 Sendmail、Qmail 和 Postfix。Sendmail 是最古老的 MTA 之一,也拥有一批固定的使用者;Qmail 是新生一代的 MTA 代表,其特点是速度快、体积小,并且容易配置安装。Postfix 起源于 1996 年,它采用模块化设计,使用了大量优秀的技术,以达到安全高效的目的。Postfix 发展到现在已经成为功能非常丰富、扩展性和安全性非常强的优秀 MTA 软件。

首先谈谈 Sendmail。MTA 软件的很多先进功能都是在 Sendmail 上最先实现的。但 Sendmail 也有典型的历史问题,主要是整个程序的没有实现良好的模块化,运行时需要 SID 权限,以及配置文件复杂难懂。这些是阻碍 Sendmail 更好普及应用的一些客观问题。

接着是 Qmail。Qmail 是新生一代的 MTA 代表,实现了模块化设计,避免了 SID 问题,基本功能齐全,配置较 Sendmail 简单,而且用户也很广泛。但 Qmail 最近几年的开发工作基本停止,补丁程序也相对零乱,这些都是长期使用 Qmail 的用户或者邮件服务提供商不得不认真考虑的问题。另外,Qmail 的扩展性并不是很好,经常需要补丁来完成功能的扩展。

最后介绍 Postfix。Postfix 是新生一代的 MTA 代表,它以速度快、体积小、易配置安装等特性而著称。Postfix 在设计上可以说是最为优美的,其实现了良好的模块化,邮件的处理流程是通过调用各个功能模块来完成,在效率、功能、可用性、扩展及安全等方面都考虑得比较充分。Postfix 以替代 Sendmail 为目的,并提供了一个更安全、更高性能的灵活的体系。它同样也采用模块化设计,使用了大量优秀的技术,以达到安全的目的。由于作者的设计理念独到,经过 7、8 年时间,Postfix 现今已发展成为功能非常丰富,扩展性和安全性强的优秀 MTA。

邮件存储和获取代理(MSA)

一旦安装并设置完成了 MTA,还要对 MSA 系统进行同样的配置过程。如今大多数机构并不直接将邮件传送到桌面客户系统,而是将邮件存储到服务器,让用户通过 POP 或者 IMAP 来读取各自的邮件。

邮件存储的管理有许多种协议,但如今最常用的是 POP3 和 IMAP4。对于 MTA 来说,由一些程序,或者称之为 Daemon(守护进程)来实现相应协议的服务。大多数 MSA(Mail Submission Agent)可以与通用的 MTA 交互,此外这些系统还包含加锁或者其他安全机制,使得多个 MSA 可以并行工作而不发生冲突。

这意味着一些用户可以通过 POP 协议获取邮件、同时其余一些用户可以使用 IMAP 协议,而另外一些用户可以登录系统,使用本地邮件客户代理例如 Pine、Mutt 或者 Elm 处理邮件。单独用户也可以从一种存取协议切换到另一种,而并不需要系统管理员的干预。在一个已经安装了 Linux 系统机器上设置 POP 服务相当容易,甚至不需要什么操作。通常 POP Daemon 在最初的 Linux 操作系统安装时已经设立,IMAP 也是如此。POP 将邮件转递到客户端并从服务器上移除,而 IMAP 允许用户将邮件存贮在服务器端的文件夹中,而客户端的拷贝是缓存或者工作副本,这样做需要更多的服务器存储空间,却可以让 IT 部门集中在服务器端进行备份和恢复,并让客户端保持相当的灵活性和安全性。IMAP 也可以设置成像 POP 那样在客户端读取后就删除服务器端的邮件,从操作上讲,两者并没有什么不同。

邮件客户代理(MUA)

邮件客户代理 MUA(Mail User Agent)种类繁多,而且层出不穷。这些代理大都符合 POP 和 IMAP 协议。这也包括微软的 Outlook 系列、Foxmail 等。在 Linux 下,许多人使用 Fetchmail 抓取邮件并保存在本地邮箱。然后使用任何一种邮件客户代理 MUA,比如 Elm、Pine、Mutt、MH/exmh、EMACS 的 Rmail,Vmail、Mh-e、Gnus 以及大量的带有 GUI 界面的如 Balsa、Mahogany 等来处理邮件。也有众多 Linux 用户选择使用 Netscape Communicator 内置的邮件客户端。

电子邮件传输协议原理

SMTP(Simple Mail Transfer Protocol)协议是为了保证电子邮件的可靠和高效传送。TCP/IP 协议的应用层中包含有 SMTP 协议,但事实上其与传输系统和机制无关,仅要求一个可靠的数据流通道。该协议可以工作在 TCP 上,也可以工作在 NCP、NITS 等协议上。在 TCP 上,其使用端口 25 进行传输。SMTP 的一个重要特点是可以在可交互的通信系统中转发邮件。

SMTP 提供了一种邮件传输的机制,当接收方和发送方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP 首先由发送方提出申请,要求与接收方 SMTP 建立双向的通信渠道,接收方可以是最终收件人也可以是中间转发的服务器。接收方服务器确认可以建立连接后,双发就可以开始通信。

发送方 SMTP 向接收方发出 MAIL 命令,告知发送方的身份;如果接收方接受,就会回答 OK。发送方再发出 RCPT 命令,告知收件人的身份,接收方 SMTP 确认是否接收或转发,如果同意就回答 OK;接下来就可以进行数据传输了。通信过程中,发送方 SMTP 与接收方 SMTP 采用对话式的交互方式,发送方提出要求,接收方进行确认,确认后才进行下一步的动作。整个过程由发送方控制,有时需要确认几次才可以(如图 1 所示)。

图 1. SMTP 协议工作流程
图 1. SMTP 协议工作流程

为了保证回复命令的有效,SMTP 要求发送方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由 ASCII 码组成。命令代码是大小写无关的,如 MAIL 和 mail、mAIL 都是等效的。

目前使用的 SMTP 协议是存储转发协议,意味着其允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如图 2 所示。如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。

图 2. SMTP 存储 - 转发工作流程
图 2. SMTP 存储 - 转发工作流程

SMTP 定义了 15 个命令,分别是:HELO、MAIL FROM、RCPT TO、DATA、RSET、SEND FROM、SOML FROM、SAML FROM、VRFY、EXPN、HELP、NOOP、QUIT、TURN。其中 SMTP 工作的基本的命令有 7 个:HELO、MAIL FROM、RCPT TO、DATA、REST、NOOP 和 QUIT。

下面分别对这些命令进行介绍。

  • HELO:发送方问候接收方,后面是发件人的服务器地址或标识。接收方回答 OK 时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。
  • MAIL FROM:这个命令用来开始传送邮件,其后面跟随发送方邮件地址(返回邮件地址)。也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发送方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。
  • RCPT TO:这个命令告诉接收方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,其必须报 550 错误代码通知发送方。如果服务器同意转发,其要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。
  • DATA:接收方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是“.”的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复 OK。
  • REST:这个命令用来通知接收方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收方必须回答 OK。
  • NOOP:这个命令不影响任何参数,只是要求接收放回答 OK,不会影响缓冲区的数据。
  • QUIT:SMTP 要求接收方必须回答 OK,然后中断传输;在收到这个命令并回答 OK 前,接收方不得中断连接,即使传输出现错误。发送方在发出这个命令并收到 OK 答复前,也不得中断连接。
  • VERY:用于确认接收用户。
  • SEND:使接收主机知道消息必须送到另一个终端,当前传输被取消。
  • HELP:查询服务器支持的命令集合。
  • EXPN:验证给定的邮箱列表是否存在,并扩充邮箱列表。
  • TURN:请求接收主机向发送主机返回消息。
  • SAML:发送并邮寄。通知接收主机消息必须发送到其他终端和邮箱。

企业开源电子邮件系统面临的安全威胁

一般说来,电子邮件系统面临如下三种安全威胁:

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

实战安全配置 Sendmail 电子邮件服务器

sendmail.cf 是 Sendmail 的配置文件。一般来说在安装了 Linux 系统之后,将自动生成一个适合本系统使用的 sendmail.cf 文件,而且在 sendmail.8.9.3/cf 目录下还有许多适应各种系统的 sendmail.cf 的文件样本,根据文件名也可以判断出它们所适用的场合。可以选择它们替换原有的 sendmail.cf 文件,也就是说,将它们复制到 /etc 目录中去,覆盖掉原来的 sendmail.cf 文件。而且 Sendmail 还提供了一个 sendmail.cf 的生成器 m4,其通过一系列的人机对话来生成一个用户定制的 sendmail.cf 文件。具体的用法可以阅读 m4 的帮助文档,在此就不再详述。

配置文件 sendmail.cf 中的信息仍旧是以行为单位。如果行首的第一个字符为“#”,则表示该行为注释,如果第一个字符为空格则表示该行为上一行的延续。此外,行首的第一个字符均为命令,但是命令同变量或值之间没有间隔。这种格式便于 Sendmail 进行分析,但很难阅读。下面介绍 sendmail.cf 配置文件中的命令。

D(定义宏)

命令 D 定义宏并为其赋值。当宏被定义之后,其就负责提供提供其存储的值给 sendmail.cf 文件中其他的命令使用或者直接提供给 Sendmail 使用。宏的名字可以是任何单字符,小写的用于 Sendmail 内部宏,用户创建的宏只能使用大写字母作为名字。一些 Sendmail 的内部宏也在 sendmail.cf 文件里定义。例如下面两行定义了宏 D 和内部宏 n:

 DDcs.mit.edu 
 DnMAILER-DEAMON

则宏 D 的值为 cs.mit.edu,宏 n 的值为 MAILER-DEAMON。要使用宏的值时,必须在宏的名字前面加上符号“$”,以这种形式来引用其值。例如:

 #my official host name 
 Dj$w.$D

如果宏 w 的值为主机名 moon,此时宏 j 的值就为 moon.cs.mit.edu,这便是本主机的全称名(FQDN)。

C 与 F(定义类)

命令 C 与 F 都是用来定义 Sendmail 的类。所谓类,实际上就是由处理方式相同的多个变量组成的数组。与宏一样,类也使用单字符名字,大小写规则也一样。类可以定义在一行之中,也可以分多行定义,例如,下面的示范为内部类 w 赋值为系统的主机名,而系统可以有多个名字:

  • Cwmoon sun
  • Cwearth
  • Cwlocalhost

命令 F 是从文件中获取类的值,例如,可以把 moon、sun、earth 保存在 sendmail.cw 之中,然后用 F 命令便可以实现同上述命令完全相同的结果:

 Fw/etc/sendmail.cw

对类的引用与宏的引用完全一样,事实上宏就是一种类。两者唯一的区别在于:宏只能有一个唯一的值,而类可以有多个值,当然也可以只有一个值。

O(设置选项)

命令 O 是为 Sendmail 的选项赋值,赋给选项的值可以是字符串、整数或布尔值,所有的选项值都是直接由 Sendmail 来使用。注意:这里所说的选项与 Sendmail 使用的命令行参数不一样。通常情况下,不需要修改这些选项。

T(定义可信任的用户)

命令 T 用来定义一组用户列表,这组用户可以使用 Sendmail 命令带 -f 参数来修改用户发出的邮件地址。一般情况下,包含 root、daemon 和 uucp。管理员最好不要随意添加其他的用户,否则这种权限在某些用户手中可能会对系统安全构成威胁。可信任的用户可以在一行或多行中定义,但是被定义的用户必须是 /etc/passwd 中的合法用户。默认是:

 Troot 
 Tdaemon 
 Tuucp

P(设置优先级)

Sendmail 使用命令 P 定义不同的优先级来处理进入出局缓冲区的电子邮件。命令 P 定义的值越高,则优先级也越高,缺省的优先级为 0。负优先级的电子邮件是不产生错误信息的,因此在批量发送邮件是应该定义较底的优先级。常用的优先级为:

 Pfirst-class=0 
 Pspecial-delivery=100 
 Plist=30 
 Pbulk=-60 
 Pjunk=-100

如果用户在发送邮件是要指定优先级,则需要在邮件的首部中添加 Precedence,例如:

 Precedence:bulk

K(关键文件声明)

特殊的映射可以定义成:Kmapname mapclass arguments。其中,mapname 是可重写规则中使用这个映射的句柄,mapclass 是映射类型的名字,arguments 的解释依赖与映射类型,通常是包含映射的文件名。

V(配置版本级别)

提供与老版本配置文件的兼容性能。

M(定义邮件传输程序)

命令 M 定义邮件传输程序(mailer)的规格 / 详细参数,其形式为:Mname,[field=value]。

Sendmail 并不是直接发送各种各样的电子邮件,它首先将要发送的邮件分类,然后交给相应的 mailer 来发送,本身只发送基于 SMTP/TCP/IP 的邮件。其中,[IPC] 表示使用 Sendmail 通过 SMTP 来传送邮件。关于 IPC mailer,在 Sendmail 的文档里有一段特殊的解释:当规则集 0 解析到 IPC mailer 时会处理一些特殊的过程。比如直接用 IP 地址发送邮件可以用 [128.32.149.78] 的形式,若用 [ucbvax.berkeley.edu] 将会被作为字符串传递,用这样的方法用户可以构造一个特殊的邮件地址,使自己的邮件按指定的路线发送,而通常用户是不关心也不知道自己邮件的发送路线的。

H(定义邮件的首部格式)

命令 H 定义 Sendmail 命令插进电子邮件首部的行的格式。

R(定义重写规则)

重写规则是 Sendmail 配置文件的核心内容,每一个重写规则由命令 R 定义,其形式如下:

 Rpattern transformation comment

命令 R 中的字段由制表符进行分隔,系统处理时忽略注释字段(comment),模式字段(pattern)与改写字段(transformation)为该命令的核心。重写规则将输入地址与模式进行匹配,如果匹配,则将该地址用规则中改写字段的规则重写为新的格式。每一个规则都可以多次处理同一地址,这是因为地址在重写之后,仍要再次同该模式进行匹配,如果仍旧匹配则再次改写,直到不再匹配为止(使用“$:”可以避免无限循环)。

S(设置重写规则集)

规则集是一组可以用数字来引用的相关重写规则。命令 S 是规则集的开始并赋予其一个数字以便由邮件传输程序来调用。规则集可以被看作用来处理电子邮件地址的子程序或函数。具有特殊功能并可由 sendmail 直接调用的规则集有 5 个:

  1. 规则集 3:为最大最复杂的规则集,也是用于地址的第一个规则集。它将地址转化为正规形式,如:user@host.domain。
  2. 规则集 0:应用于传输邮件的地址。必须在规则集 3 之后使用,并仅用于实际邮件传输中接收者的地址。其可以将地址解析成(mailer,host,user)的形式,由邮件传输者、接收方主机和接收用户的名字组成。
  3. 规则集 1:应用于消息中所有发送者地址。
  4. 规则集 2:应用于消息中所有接收者地址。
  5. 规则集 4:应用于消息中所有地址并将内部地址格式转化为外部地址格式。

安全配置 sendmail.mc 文件

Sendmail 的配置十分复杂,其配置文件是 sendmail.cf,位于 /etc/mail 目录下。由于 sendmail.cf 的语法深奥难懂,很少有人会直接去修改该文件来对 Sendmail 服务器进行配置。我们一般通过 m4 宏处理程序来生成所需的 sendmail.cf 文件。创建的过程中还需要一个模板文件,系统默认在 /etc/mail 目录下有一个 sendmail.mc 模板文件。

用 m4 宏编译工具创建 sendmail.cf 文件比较方便,而且不容易出错,更可以避免某些带有安全漏洞或者过时的宏所造成的破坏。一个 sendmail.mc 模板的大致内容如下:

 divert(-1)dnl 
……
 include('/usr/share/sendmail-cf/m4/cf.m4')dnl 
 VERSIONID('setup for Red Hat)dnl 
 OSTYPE('Linux')dnl 
……
 dnl # 
 dnl define('SMART_HOST','smtp.your.provider') 
 dnl # 
 define('confDEF_USER_ID',''8:12'')dnl 
 define('confTRUSTED_USER', 'smmsp')dnl 
 dnl define( ′ confAUTO_REBUILD ′ )dnl 
……

下面介绍 ndmail.mc 模板的语法组成:

  • dnl:用来注释各项,同时 dnl 命令还用来标识一个命令的结束。
  • divert(-1):位于 mc 模板文件的顶部,目的是让 m4 程序输出时更加精简一些。
  • OSTYPE ('OperationSystemType'):定义使用的操作系统类型,显然这里应该用 Linux 代替 OperationSystemType,注意要用一个反引号和一个正引号把对应的操作系统类型括起来。
  • define:定义一些全局设置,对于 Linux 系统,设置了 OSTYPE 之后,可以定义下面的一些全局参数,如果不定义,就使用默认值。下面给出例子:define('ALIAS_FILE','/etc/aliases'):定义别名文件 (alia file) 的保存路径,默认是 /etc/aliases。Define('STATUS_FILE', '/etc/mail/statistics'):定义 sendmail 的状态信息文件。

因此,用户可以根据简单、直观的 sendmail.mc 模板来生成 sendmail.cf 文件,而无须直接编辑 sendmail.cf 文件。可以直接通过修改 sendmail.mc 模板来达到定制 sendmail.cf 文件的目的。这里介绍创建 sendmail.cf 文件的步骤:

(1)备份原有 sendmail.cf 文件:

 #cp /etc/mial/sendmail.cf /etc/mail/sendmail.cf.BAK

(2)生成 sendmail.cf 文件,根据 sendmail.mc 模板文件产生 sendmail.cf 配置文件,并导出到 /etc/mail/ 目录下:

 #m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

(3)重启 Sendmail 服务:

#service sendmail restart

在该文件中,有 6 个非常重要的参数需要进行仔细的设置,因为它们对 Sendmail 服务器的性能以及应对拒绝服务攻击方面具有很大的影响:

  1. ConfCONNECTION_RATE_THROTTLE:该参数表示服务器能够接受的最大连接数量。一般情况下 Sendmail 不会对其进行限制。但是如果不设置,将会可能使得服务器的性能“透支”,建议设置为:Define(’ confCONNECTION_RATE_THROTTLE ’ , 5);
  2. ConfMAX_MESSAGE_SIZE:该参数表示单个消息可接受数据的最大限度(以字节为单位),此参数设置可以过滤一些异常的携带大附件的邮件,从而减轻服务器的传输压力和存储空间压力,建议设置为:Define(’ ConfMAX_MESSAGE_SIZE ’ , 10000000);
  3. ConfMIN_FREE_BLOCKS:此参数定义服务器保留的用于接收邮件的空闲块的最小数量,一般定义为 100 即可,即:Define(’ ConfMIN_FREE_BLOCKS ’ , 100);
  4. ConfMAX_DAEMON_CHILDREN:此参数定义服务器主进程能够派生的子进程的最大数量,一般不宜过大,设定为 10 即可,即:Define(’ ConfMAX_DAEMON_CHILDREN ’ , 10);
  5. ConfMAX_HEADER_LENGTH:该参数定义消息头的最大限度(以字节为单位),定义该参数可以过滤部分黑客攻击,建议设置为:Define(’ ConfMAX_HEADER_LENGTH ’ , 16000);
  6. ConfMAX_RCPTS_PER_MESSAGE:设定邮件最大接收者的数量,对该参数进行限定可以过滤大量的垃圾邮件,因为垃圾邮件一般都具有巨大数量的接收者。建议设置为:Define(’ ConfMAX_RCPTS_PER_MESSAGE ’ , 100)。

实战安全配置使用 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 的虚拟域管理功能可以定义多个虚拟邮件域。


总结

本文作为本系列的第一部分,详细介绍了企业开源电子邮件系统的安全原理及 Sendmail、Qmail 安全防护实战。第二部分将详细介绍 Postfix 的安全防护实战,以及如何进行企业垃圾邮件防范。

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=870517
ArticleTitle=企业开源电子邮件系统安全保障实战精要: 第 1 部分,原理及 Sendmail、Qmail 安全防护实战
publish-date=04152013