qmail-smtpd-auth-0.31.tar.gz认证问题的解决

来源:互联网 发布:mac的qq可以远程吗 编辑:程序博客网 时间:2024/05/22 02:08

        在按装配置qmail的过程中,设置SMTP认证是非常重要的,传统的邮件服务器是不包含SMTP认证的,帮助转发不属于自己管辖域的邮件,是网络开放和共享的精神的体现。但现在网上有太多的垃圾,他们会利用邮件服务器的这个特点,利用你的服务器发送大量的广告、甚至非法信息,给系统管理员带来巨大的风险,导致其他邮件服务器拒收你的正常邮件,甚至被有关部门请去喝茶都是可能的,所以必须加上正确的SMTP的认证,只有本域的合法用户才能通过服务器发送邮件。

        qmail是linux上非常流行的MTA,但它本身并不提供SMTP认证,需要通过其他的patch来实现。目前网络上流行的SMTP-AUTH的补丁有两个,一个是qmail-smtpd-auth-0.31.tar.gz,另一是直接修改smtpd.c文件。国内的几大论坛,如ChinaUnix都推荐直接修改smtp.c文件的方式,主要是在patch的过程中,很多人发现qmail-smtpd-auth-0.31.tar.gz有这样的问题,就是要不所有用户和随便的密码都能通过,要不就是合法用户也无法通过,无法真正实现SMTP认证。

         我在配置中也发现了这样的问题,搜索国外的权威技术站点,都没有提到qmail-smtpd-auth-0.31.tar.gz的这个问题,所以我对这个补丁进行了测试和配置,最终发现其实这个补丁是没有问题的,出现上述问题是配置不当的结果。

 过程如下,以供大家参考(补丁的安装过程,请参见补丁内部的安装文档):


1、最初的smtp-run的脚本
#!/bin/sh

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`

if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
    echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
    echo /var/qmail/supervise/qmail-smtpd/run
    exit 1
fi

if [ ! -f /var/qmail/control/rcpthosts ]; then
    echo "No /var/qmail/control/rcpthosts!"
    echo "Refusing to start SMTP listener because it'll create an open relay"
    exit 1
fi

exec /usr/local/bin/softlimit -m 15000000 \
    /usr/local/bin/tcpserver -H -R -l "$LOCAL" -t 1 -v -p -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
        -u "$QMAILDUID" -g "$NOFILESGID" 0 25 /usr/local/bin/rblsmtpd -r relay.ordb.org /var/qmail/bin/qmail-smtpd  /home/vpopmail/bin/vchkpw
/bin/true /usr/local/sbin/cmd5checkpw 2>&1


为了测试smtp认证的问题,我直接运行smtp认证


# /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw
220 example.com ESMTP
ehlo
250-example.com
250-AUTH LOGIN CRAM-MD5 PLAIN
250-AUTH=LOGIN CRAM-MD5 PLAIN
250-PIPELINING
250 8BITMIME
auth login
334 VXNlcm5hbWU6
amluemhhby55aXVABXVkKXF1ZS5jb20=
334 UGFzc3dvcmQ6
bzIx60EwKTg=
235 ok, go ahead (#2.0.0)

        注意这里的用户名和密码都需要经过base64转换后才行。经过测试,无论你的密码是否正确,都会验证通过。经过查看网上各位的讨论,这个认证补丁要求在smtpd后面带域名,所以我就把run脚本修改为:
#!/bin/sh

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`

if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; the
n
    echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
    echo /var/qmail/supervise/qmail-smtpd/run
    exit 1
fi

if [ ! -f /var/qmail/control/rcpthosts ]; then
    echo "No /var/qmail/control/rcpthosts!"
    echo "Refusing to start SMTP listener because it'll create an open relay"
    exit 1
fi

exec /usr/local/bin/softlimit -m 80000000 \
    /usr/local/bin/tcpserver -H -R -l "$LOCAL" -t 1 -v -p -x /etc/tcp.smtp.cdb -
c "$MAXSMTPD" \
        -u "$QMAILDUID" -g "$NOFILESGID" 0 25 /var/qmail/bin/qmail-smtpd "$LOCAL" /home/vpopmail/bin/vchkpw /bin/true /usr/local/sbin/cmd5che
ckpw 2>&1

红色的部分就是加了域名,然后接着用


# /var/qmail/bin/qmail-smtpd example.com /home/vpopmail/bin/vchkpw
220 example.com ESMTP
ehlo audaque.com
250-example.com
250-AUTH LOGIN CRAM-MD5 PLAIN
250-AUTH=LOGIN CRAM-MD5 PLAIN
250-PIPELINING
250 8BITMIME
auth login
334 VXNlcm5hbWU6
amluemhhby55aXVABXVkKXF1ZS5jb20=
334 UGFzc3dvcmQ6

bzIxMzEwMTg=
535 authorization failed (#5.7.0)
auth login
334 VXNlcm5hbWU6
amluemhhby55aXVABXVkKXF1ZS5jb20=
334 UGFzc3dvcmQ6
MTExMTEx
235 ok, go ahead (#2.0.0)

结果用户名密码都正确才能通过认证,所以说认证结果是正确的。然后,我运行smtpd-run文件,通过telenet server 25连上来,结果输入正确的用户名、密码也无法通过验证。这两者的唯一区别是上面的验证我是用root运行的,而smtpd-run的运行用户却是qmaild,是不是用户权限不对呢?我接着测试:
#su - qmaild
$/var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw
220 example.com ESMTP
ehlo
250-example.com
250-AUTH LOGIN CRAM-MD5 PLAIN
250-AUTH=LOGIN CRAM-MD5 PLAIN
250-PIPELINING
250 8BITMIME
334 VXNlcm5hbWU6
amluemhhby55aXVABXVkKXF1ZS5jb20=
334 UGFzc3dvcmQ6
MTExMTEx
535 authorization failed (#5.7.0)

     结果显示认证失败。所以可以肯定是qmaild用户权限不够,在这个运行过程中,涉及到的文件包括/home/vpopmail/vchkpw以及连接mysql的文件,我检查了这些文件权限,确实在我的服务器里,vchkpw已经设为6755,/home/vpopmail这个目录却不允许普通用户访问,/var/lib/mysql/mysql.sock也不允许普通用户运行,修改了这些权限以后,qmaild用户的运行结果与root用户的运行结果相同了,然后重新运行smtpd-run,再用telnet server 25访问进行验证,也能正确认证了。
    至此,我们可以肯定qmail-smtpd-auth-0.31是可以正确认证的,如果随便的密码都能通过,是因为在smptd后面没有加域名,系统认为任何用户都能直接通过;出现合法用户也不能通过的情况,是因为qmaild用户没有足够的权限。
    另外还有两点注意:1、vchkpw的权限要设置为6755,4755是不行的(有些人说设置为4755)2、在这个过程中还有softlimit 的问题,如果设置太小,会因为模块无法调入出错,我的就设置的很大,因为我直到调整到80000000才解决这些问题,我的系统是64位的。

原创粉丝点击