搞定Sendmail邮件权限控制

12/3/2006来源:Qmail人气:6326

  在当今网络的应用中,安全是越来越显出它的重要性了。而E-mail服务是网络世界的一项十分有价值的应用,同样它受到的安全上的威胁也越来越大。从邮件中,黑客们可以采取各种各样的方式来寻找你网络系统上的安全漏洞并实施攻击。比如说,通过在短时间内连续发送大量的垃圾邮件,可以导致你的邮件服务器系统崩溃;另外有些邮件发送者可以利用你的邮件服务器作他们的代理转发系统,这也可能让你系统“蒙受不白之冤”。还有一种情况是,有些站点发来的邮件是不可靠或者非法的,这也需要得到有效的控制。那么怎样能够实现这些对邮件的控制呢?

  一、Sendmail出场

  这里我们就来探讨怎样在linux平台上用Sendmail邮件程序来完成这项功能。由于篇幅所限,现在我们只可能就其很小的一部分功能作一些简要介绍。

  我们假定你有一台服务器,并且已经安装好了Sendmail软件(推荐为8.9.x以上的版本),可以实现收发邮件的功能。子网内部机器都可以通过而且必须通过该服务器的邮件代理来发送和接收Internet上的邮件。我们以Sendmail的标准配置为参照,看看如何实现对SMTP邮件的中继转发控制。在安装完Sendmail后,我们在/etc/mail(这是默认目录)下,可以找到几个用来控制的数据库及其编辑文件,包括mailer、deny、access等。其中access库即是我们本文讨论的重点。当我们用vi access查看该文件时,可以看到如下一些默认行(注:这里示例的sendmail版本是8.9.3):

  localhost.localdomain       RELAY

  localhost           RELAY

  这些默认行说明对你的本域内机器可以实现转发,我们下面的工作就是要对该文件进行加工编辑,以实现对邮件传输的权限控制,从而保证一定的系统安全性。

  二、走进邮件数据库

  我们仍旧以vi access命令来实施对文件的编辑。首先简单说明一下access数据库的作用及基本形式。access库允许系统管理者按照自己的策略决定是否允许其它域的邮件服务器或邮件地址访问。这个数据库中的每条记录包括一个域名(或者网络名、子网名以及直接的邮箱地址等)作为关键字,以及一项针对该关键字的行动值(即对关键字表示的地址采取什么样的控制方法),它们以TAB键分隔。在默认行中,我们看到的localhost localdomain、localhost都是关键字,而relay则是相应的行动值。

  关键字可为多种形式,如完全或部分域名、直接的邮箱地址、ip地址等,例如:

  host.subdomain.domain.com,subdomain.domain.com或domain.com都是符合要求的关键字,同样,[email protected],@host.domain,205.199.2.250,205.199.2,205.199也都是合法的关键字。

  由此可见,关键字的匹配项很多,这就大大提高了程序对邮件的控制功能。范围或大或小,都可以由我们灵活控制,确实不错!以下我们便可根据自己系统的需要分别对这些关键字作权限控制,具体来说,行动值有四类:其中的relay,我们已经在文件的默认值中见过了,它表示允许通过你的邮件服务器对邮件作中继转发。其它的三类分别为ok、reject和discard。别小看就这么几项,但实现的功能可不小哦。ok是用来允许用户的任意访问,它会覆盖任何其它已建立的检查(实际设置中,最好别设这项,除非你对该用户是绝对信任的);reject可以实现对来访地址的拒绝,它根本就不容许该地址与你的邮件服务器进行连接通信;如果你想对来访地址耍一个小花招,那么选择discard就再合适不过了,它的作用是在接收到传输的邮件消息后,偷偷地把它丢弃掉(在发送者看来,他的邮件的确是接收了,但他并不知道,发送的目的地址根本不可能接收到他的邮件,服务器巧妙地欺骗了他,这就叫以其人之道还治其人之身!)。除了以上介绍的这四类以外,还可以通过传递出错端口标志和出错信息来拒绝接收邮件。

  三、动手做实例

  我们下面就来看一看几个例子:

  cyber.com             reject

  sendmail.org             relay

  [email protected]           ok

  [email protected]          discard

  202.103.109.35 reject

  202.103 relay

  @buyme.com    550  You don't see the whole world!

  (注:四个行动值不区分大小写。)

  你可以根据你的需要加入合适项以实现邮件权限的设置。为了给大家一个整体的概念,让我们再看一个完整的access文件(已经作了各种限制的):

  # Check the /usr/doc/sendmail-8.9.3/README.cf file for a description

  # of the format of this file. (search for access_db in that file)

  # The /usr/doc/sendmail-8.9.3/README.cf is part of the sendmail-doc

  # package.

  #

  # by default we allow relaying from localhost...

  localhost.localdomain     RELAY

  localhost       RELAY

  #

  #other control measures to your email system

  [email protected]       reject

  [email protected]     ok

  202.103.109.8 relay

  @bad.com     550   You are a bad user!

  Dis.xq.com           discard

  完成了对access文件的编辑之后,可千万不要以为就万事大吉了。还有一个非常重要的步骤,那就是把修改的内容写到access数据库中去以使之生效。具体的实现方法是:在命令符下,输入makemap -v hash /etc/mail/access〈 /etc/mail/access,然后系统会给出相应的响应信息,如果结果类似以下这个样子:

  key=′localhost.localdomain′, val=′RELAY′

  key=′localhost′, val=′RELAY′

  key=′[email protected]′, val=′reject′

  key=′[email protected]′, val=′ok′

  key=′202.103.109.8′, val=′relay′

  key=′@bad.com′, val=′550   You are a bad user!′

  key=′dis.xq.com′, val=′discard′

  那就表示一切正常!最后请重新启动Sendmail服务,剩下你要做的就是好好享受一下你的工作成果了!

  附记:本篇文章完成之际,正值Sendmail 8.10.0全新推出,该版本据说功能较以前有大幅提升。对于本文所涉及的access控制,新的Sendmail版本已经可以实现对邮件收取和发送分别作不同的控制,如下:

  To:file.example.net RELAY

  From:file.example.net  RELAY

  第一条记录允许对去向file.example.net域的邮件作转发,但不允许对来自此域的邮件作转发;而第二条记录则正好相反。