当前位置:Linux教程 - Linux - SMTP认证让服务器拒绝垃圾邮件

SMTP认证让服务器拒绝垃圾邮件

作者:薛启康 

通常情况下,标准的E-mail传输协议——SMTP在传输邮件时,是不进行用户身份认证的。这是因为SMTP原本是为多用户环境下E-mail发送开发的,在这种环境中,用户必须登录到主机,向主机提供用户名及认证口令,之后,才能发送E-mail,SMTP负责在服务器间传输邮件。

但是,随着互联网的发展,由于个人机的使用,单用户机接入了互联网。用户也可以通过个人机收发邮件,使用POP、IMAP接收邮件。由于POP、IMAP要从服务器上读取/下载邮件,所以必须经过认证。但SMTP就不同了,非法用户可以在邮件头放置任何信息、任何邮件地址,而SMTP根本不管这些,统统发出。也就是说,甲可以盗用乙的邮件地址(尽管他不可能收到乙的邮件,因为POP、IMAP要求有口令才能收到邮件),收信者无法确定E-mail是不是真的是乙发的——邮件可以被匿名/冒名发送。

此外,一些在网上兜售的人,也会利用邮件服务器发送大量的垃圾邮件,以至于网络上的E-mail广告满天飞。

造成这种情况的主要原因是由于SMTP不进行认证,这是历史原因造成的。不过,在新版的Sendmail中(Sendmail.8.10以后)已经增加了SMTP认证。如果在编译时将SMTP认证加进了Sendmail服务,那么在用户发送邮件时,服务器就会要求用户输入口令,如果口令正确,则服务器为他发送邮件,如果口令错误,服务器将拒绝为他发送邮件。这样能减少网络兜售,也会有效地防止冒名发信。

安装认证库
首先,下载一个叫SASL的认证库,下载地址:ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/,最新版本是:cyrus-sasl-1.5.24.tar.gz。

安装过程如下:

#tar -zxvf cyrus-sasl-1.5.24.tar.gz
# cd cyrus-sasl-1.5.24
#./configure -prefix=/usr --enable-login --with-pwcheck --with-digest
#make;make install

安装完成后,建立一个/var/pwcheck目录,pwcheck程序要用此目录。

接下来,在/usr/lib/sasl目录中建立一个文件Sendmail.conf,文件内容为:pwcheck_method:pwcheck。

至此,SASL库的安装全部完成。

编译及配置Sendmail
编译Sendmail,并将sasl支持编译进去:

首先,在文件Sendmail源码下的devtools/Site/site.config.m4文件中,添加以下内容:

APPENDDEF(``confENVDEF, ``-DSASL)
APPENDDEF(``conf_Sendmail_LIBS, ``-lsasl)
  
然后,编译Sendmail(过程略)注意保证在编译时出现“-DSASL”。如下所示:

cc -O -I. -I../../Sendmail -I../../include -DNEWDB -DSASL -DNOT_SENDMAIL -c -o debug.o debug.c
cc -O -I. -I../../Sendmail -I../../include -DNEWDB -DSASL -DNOT_SENDMAIL -c -o errstring.o errstring.c

编译及安装完成后,在Sendmail.mc文件中加入以下内容:

TRUST_AUTH_MECH(``LOGIN PLAIN )dnl (转发那些使用login/plain/digest-md5认证的邮件)
define(``confAUTH_MECHANISMS, ``LOGIN PLAIN)dnl
FEATURE(``no_default_msa)dnl turn off default entry for MSA
DAEMON_OPTIONS(``Port=25, Name=MSA, M=E)dnl

最后,编译Sendmail.mc为Sendmail.cf。

至此,Sendmail配置全部完成。

测试
检查SASL是否已经生效。过程如下:

# Sendmail -d0.1 -bv root | grep SASL
结果会显示:“NETUNIX NEWDB QUEUE SASL SCANF SMTP USERDB XDEBUG”其中有SASL,表示Sendmail确实支持SASL了。
然后,登录25端口,查看授权方式:
$telnet localhost 25
Trying 127.0.0.1...
Connected to mail(127.0.0.1).
Escape character is ^].
220 mail ESMTP Sendmail 8.11.3/8.11.3; Mon, 9 Apr 2001 18:14:16 -0400
ehlo localhost
250-rh62.chinatrend.com Hello IDENT:xue@localhost [127.0.0.1], pleased to meet you
.........
.........
250-AUTH LOGIN PLAIN
250 HELP
quit
以上显示,表示已有login、plain认证方式了。当然,你的显示结果不一定与以上值相同,但一定要有“AUTH”这一行。

如果不成功,可以选择以下启动方式,将错误信息记录到日志文件中,以便查看错误:#Sendmail -O loglevel=14 -bs。从/var/log/messages中查看错误信息,并进行相应更正。

这种方案适用于对外开放SMTP转发功能的情况,也即此邮件服务器对任何主机发来的邮件都进行转发。不考虑客户机的IP地址,全部转发;也即不是通过控制用户的IP地址而是通过SMTP的认证机制来判断是否为用户转发邮件;也即不论用户的IP是否在access.db数据库有记录,只要能通过SMTP的认证,就为他转发邮件。绕过了拨号用户IP随时变化的情况,是目前切实可行的一种解决动态IP发信的方案。同时,也有效阻止了垃圾邮件占用邮件服务器的资源。

好了,现在可以设置自己的Outlook了,进入账户的属性栏,选择“我的服务器要求进行身份验证”,在弹出的窗口中选择“使用与邮件服务器相同的设置”,也可以选择登录方式,填写适当的用户名及口令。你可以选择“使用与接收邮件服务器相同的设置”也可以在登录用户中使用其它用户名及口令进行验证。