分类: LINUX
2009-11-02 09:43:15
Sendmail实现发信认证的功能
关于基本的sendmail的服务器的搭建这里就不在赘述
基本的smtp协议没有验证用户身份的能力。虽然信封上的寄件人地址已经隐含了发信者的身份,然而,由于信封地址实在太容易假造,所以不能当成身份凭据。 为了判断客户端是否有权使用转发服务(relay),服务器端必须确认客户端(寄件人)是否当真是对方所自称的那个人。在不能以寄件人地址为身份证书的前 提下,smtp势必需要其他补充机制,才能验证客户端的身份。
对于一个邮件服务器,应该避免“open relay”的情况,也就是不能为所有的邮件客户端和其他的smtp服务器来转发邮件,所以它需要验证为哪些客户端来转发邮件。MTA提供了基于IP的验证方法,也就是说邮件服务器只转发它指定IP范围内的客户端发送的邮件。但这种基于IP验证的方式在很大的分布式网络环境中实现起来是比较困难的,特别是对于一些移动用户,因为他们使用的IP是不确定的。
配置了发信认证之后,sendmail就不管access文件的限制,即使是不被允许的ip网段,如果客户端通过认证就可以通过服务器发送邮件.
Smtp使用sasl实现验证.
SASL的验证框架大致如下:
支持SASL的服务器端(比如postfix的smtpd这个daemon)监听网络连接
客户端连接应用并发起认证过程:客户端选择一个SMTP AUTH的机制,并根据这个机制准备相应的凭证,然后把它选择的机制和相应的凭证发给服务器
服务器方保存客户端的验证机制和相应的凭证,并把它交给一个真正完成这种密码验证的后服务,比如saslauthd
验证服务根据客户的凭证和验证的后端数据(比如/etc/shadow文件,还可以用nis等等)来确定是否通过验证,并把验证结果返回给smtpd
smtpd根据验证的结果做出相应的动作
在验证的过程中服务器和客户之间需要一个验证接口来告诉客户端需要验证以及哪些验证机制是可用的。SASL本身并没有
对这个接口做出规定,而是由具体的服务和协议自己来确定这个接口。比如在ESMTP协议中,在客户端敲入EHLO时,服务器端
会提示支持的验证机制:
250-AUTH
LOGIN PLAIN DIGEST-MD5 CRAM-MD5
Sasl的验证机制,这里只列出plain和login
PLAIN
The
PLAIN mechanism is the simplest to use, but it does not include any
encryption of authentication credentials. You may want to use TLS
(see TLS information in Chapter 13) in conjunction with the PLAIN
mechanism. The login and password are passed to the mail server as a
base64 encoded string.
LOGIN
The
LOGIN mechanism is not an officially registered or supported
mechanism. Certain older email clients were developed using LOGIN as
their authentication mechanism. The SASL libraries support it in case
you have to support such clients. If you need it, you must specify
support for it when you compile the libraries and Postfix. See
Appendix C if you are building your own Postfix. If you are using a
packaged distribution and you need LOGIN support, check the
documentation with your distribution to make sure it includes it. If
it is used, the authentication exchange works the same as the PLAIN
mechanism.
具体过程比较简单
修改/etc/mail/sendmail.mc
找到如下相关信息:
50 dnl # Please remember that saslauthd needs to be running for AUTH.
51 dnl #
52 dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
53 dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
将52 和53行的注释去掉,删掉dnl即可
重启服务。
# service sendmail restart
测试过程:
# telnet 192.168.1.1.101 25 192.168.1.101是的服务器的ip
输入 ehlo server1
输入 auth login
输入用户名,这个用户名需要用base64编码。事先做好准备。
生成base64格式的用户名和密码过程如下:
# echo –en ‘username’ | openssl base64
# echo –en ‘password’ | openssl base64
然后将产生的用户名和密码输入
会输出 authtification success。
当然也可以用mua 测试,用outlook express测试。
在用户的属性中 的服务器选项中选上:
我的服务器需要身份验证。
就可以通过outlook发送邮件了。如果不选会被服务器拒绝。
如果用Foxmail测试的话,他都可以发送邮件,这个就是mua的设计问题了。