以下是通用的机制选项:

noplaintext

此选项将plaintext密码验证排除在外。这使得sasl选项challenge/response技术来使用。如果你的安全政策不容许密码以明文形 式流经网络,那就指定noplaintext选项吧,但是这也表示你不能使用saslauthd。

noactive

此选项将可能遭受“主动攻击”的密码机制排除在外。在“主动攻击”中,攻击者想办法将他们安插到client与server之间,所以,某些类型的主动攻 击又被称为"中间人攻击“。攻击者可以读取或改变数据,让client或server误以为数据真的是对方送过来的。

nodictionary

此选项将可能遭受”字典攻击“的密码机制排除在外。在”字典攻击“中,攻击者使用预编的密码数据库,逐一测试哪个密码”恰好“能闯入你的系统。这类密码数 据库通常由城市、团队、宠物、常见人名、字典词汇,加上各种明显的词汇变化等组成,所以称为”字典攻击“。

noanonymous

排除匿名登录。smtp验证的最主要目的,就是要确认用户的身份,所以”匿名登录“对smtp server是没有意义的。postfix的默认行为是禁止匿名登录。如果你指定了其他选项,你必须明确设定noanonymous。

mutual auth

要求使用互证机制--client与server双方都要提供证明自己身份的证据。

设定步骤汇整

在postfix系统中添加sasl功能所涉及的步骤有点繁复。总结本章前述的知识,以下是我们整理出来的设定步骤:

1、决定你打算支持的验证机制与架构。

2、安装sasl函数库,并重新编译postfix,使其包含sasl。或者取得已经内含sasl的postfix包,以及相关的sasl验证机制。

3、重新安装postfix

4、创建/usr/local/lib/sasl2/smtpd.conf配置文件,将pwcheck_method参数设定为saslauthd(如果使用sasl saslauthd与系统密码的话)或auxprop(如果使用sasl的专属密码文件的话)。

5、如果你选择的验证架构是unix系统密码,请启动saslauthd daemon,并且指出你的系统所用的验证方式;否则,使用saslpasswd2命令在你的系统上创建smtp client的账户与密码。

6、编辑main.cf,启动sasl验证功能,并指出验证方式。基本的设定至少需要下列两项参数:

smtpd_sasl_auth_enable = yes

smtpd_recipient_restrictions = permit_mynetworks,

permit_sasl_authicated, reject_unauth destination

7、重新加载postfix,使我们在main.cf配置文件所做的改变生效:

postfix reload

测试sasl验证配置

经过重重难关之后完成安装,要如何要确定所有步骤都没有出错,证明postfix确实真的已依照我们的要求来进行验证?等到用户旅行到外地了以后,看看他 们会不会打长途电话回来抱怨,肯定不是好办法。最好的办法,是直接观察smtp server的交互情况,实际体验验证过程,并立刻查阅日志文件留下的线索。

要想联机到smtp server,最容易的方法是使用telnet工具程序,然后与服务器进程smtp对话。最容易测试的plain机制,如果你禁用这项机制,建议你暂时先启用它,等完成测试实验之后再关掉它。

先让我们了解plain机制的细节,然后再开始动手做实验。plain机制要求你在auth命令之后提供一个身份标识串,此字符串编码成base64格 式。构成此字符串的各项数据的次序是“登录身份”,其后跟着一个null字符,然后是“密码拥有者的身份”,再跟一个null字符,最后是“密码”本身。 通常,“登录身份”与“密码拥有者的身份”是相同的。举例来说,假设用户kdnet的密码为rumpelstiltskin,而且其登录身份与密码拥有者 身份相同,那么,他的身份标识符串是“kdent\okdent\orumpelistiltskin”(编码前的格式)。

麻烦之处,在于如何将标识符串编码成base64格式且不包含字符串末端的CR字符。如果你的系统上有mmcncode与printf命令,这步骤应该不 难。printf命令能显出指定格式的字符串,但是不会像echo之类的命令那样,自动在字符串末端补一个换行字符。mmencode命令能将输入字符串 编码成各种mime格式,且其默认格式正好是我们所需要的base64。

所以,我们可用下列命令来产生base64格式的标识符串:

printf 'kdent\0kdent\0rumpelstiltskin' | mmencode

某些系统平台的printf可能不能正确地处理字符串中间地null字符(\0),要想知道自己系统上地printf有没有这个毛病,只要看base64编码结果是否比原字符串短。如果你地printf有问题,不妨使用echo -n来代替printf。

smtp客户端验证

本章前半段地讨论,着重于postfix如何扮演smtp验证地服务器端角色--验证远程mua或mta地身份,借此判断对方是否有权使用转发服务。现 在,我们要换个角度,讨论postfix如何扮演客户端角色--提出自己地身份证明,借此获得远程mta地转发服务地使用权。

首先,你得提供一个密码文件给postfix,其中包含能通过远程服务器得证书数据。此密码文件得每一笔记录,各包含一个代表远程服务器的网域以及一组能通过该服务器验证的账户与密码,格式如下:

destination username:password

当postfix要寄出一封邮件时,它先检查收件地址的网域部分,如果不能在密码文件中找到完全相符的destination,再寻找打算联机的主机名 称。这种检查过程使得postfix可以轻易连接共享相同账户数据库的多个mx主机。决定密码文件位置的参数是 smtp_sasl_password_maps。

决定客户端行为的是smtp_sasl_security_options参数,其设定方法与服务器端的smtpd_sasl_security_options参数相同,所以不再赘述。如果你没指定任何选项,则默认行为是容许系统上所有能找到的机制,唯独匿名登录除外。

smtp客户端验证的设定过程

让我们举个例子来示范要如何设定postfix,才能使其在通过远程系统转发邮件时,提出自己的身份证明。在这个例子中,假设我们有一组可以通过ora.com网域的所有服务器主机的账户以及一组可以通过mail.postfix.org主机的账户。

1、创建/etc/postfix/sasl_passwd密码文件,并填入我们拥有的账户与密码,例如:

ora.com kdent:rumpelstiltskin

mail.postfix.org kyle:quixote

2、使用postmap产生数据库文件:

postmap /etc/postfix/sasl_passwd

3、编辑main.cf配置文件,启动客户端验证功能。请注意,这次要设定的参数是smtp_sasl_auth_enable,而不是 smtpd_sasl_auth_enable(后者用于启动服务器端验证)。接着,在smtp_sasl_password_maps参数中指出密码文 件的位置:

smtp_asal_auth_enable = yes

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

4、重新加载postfix,使我们所做的改变生效:

postfix reload

现在,每当postfix smtp client试图通过/etc/postfix/sasl_passwd所列的任何网域或主机来转发邮件时,它就会提供对应的验证书籍。比方说,如果你的 postfix smtp client联机到mail.ora.com服务器,则它会使用kden与rumpelstiltskin这组账户与密码。

通过文章的介绍,我们知道把Postfix sasl身份验证机制会好,那以后就不用发愁邮件的安全性了。

  • Postfix利用挡信机制来消除垃圾邮件的隐患
  • Postfix邮件转发详解
  • Postfix虚拟网络域名
  • Postfix里的POP与Imap介绍
  • Postfix中的地址操作大全
  • 使用 Kerberos 进行 SharePoint 身份验证
  • 修改SQL Server身份验证模式的方法
  • IIS服务中五种身份验证的灵活运用


相关内容