LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1435|回复: 3

centos 配置postfix sasl 认证求解

[复制链接]
发表于 2011-6-10 11:18:56 | 显示全部楼层 |阅读模式
centos 配置postfix sasl 认证求解
补充资料
系统centos 5.4 ,postfix-2.3.3-2.1.el5_2 ,cyrus-sasl-2.1.22-5.el5
匿名登录,首发邮件都可以。配置sasl认证 etc/sysconfig/saslauthd.conf  MECH=shadow, /etc/postfix/main.cf主要配置
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_relay_domains, reject_unauth_destination
本地testsaslauth -u XXX  -p XXX认证成功。 使用telnet 25登录后 ehlo localhost 显示了,plain 开启的,但是仍然能匿名发邮件。
如果强制使用auth plain + 验证码(64位 perl),进行认证 提示
auth plain AHdlYgkx
535 5.7.0 Error: authentication failed: bad protocol / cancel

单是 root 又能通过,普通用户就提示上面错误
postfix服务器 maillog提示
Jun  10 11:10:21 localhost postfix/smtpd[6493]: warning: SASL authentication failure: Can only find author/en (no password)
Jun  10 11:10:21 localhost postfix/smtpd[6493]: warning: unknown[10.0.0.253]: SASL plain authentication failed: bad protocol / cancel

messges 日志

Jun 10 10:58:24 localhost saslauthd[10847]: server_exit     : master exited: 10847
Jun 10 10:58:49 localhost saslauthd[10889]: detach_tty      : master pid is: 10889
Jun 10 10:58:49 localhost saslauthd[10889]: ipc_init        : listening on socket: /var/run/saslauthd/mux
shadow文件权限为644
之前安装过sendmail,用alternative 切换到了postfixl

尝试了 网上很多办法都不行,希望大家帮助谢谢
发表于 2011-6-10 12:10:29 | 显示全部楼层
首先,你auth plain那样的用法是错误的。 详情参考 http://www.postfix.org/SASL_README.html 。里面提到,你可能需要创建/usr/lib/sasl2/smtpd.conf ,来为postfix设置sasl.

你可以通过如下脚本测试smtp认证:
smtp_auth.py
  1. #!/usr/bin/python
  2. import smtplib
  3. smtp = smtplib.SMTP('localhost')
  4. #smtp.set_debuglevel(1);
  5. try:
  6.     smtp.login('username','password')
  7. except smtplib.SMTPAuthenticationError,e:
  8.     print "login failed: %s" % e
  9. print "login OK"
  10. smtp.quit()
复制代码
将username, password替换为你自己的用户名密码
回复 支持 反对

使用道具 举报

发表于 2011-6-10 14:24:52 | 显示全部楼层
官方文档中,提到使用类似的命令测试plain auth.
  1. perl -MMIME::Base64 -e \
  2.     'print encode_base64("\0username\0password");'
复制代码
这个可能会出问题,为什么呢?因为在Perl语言中,\nnn(n代表数字)转义序列用来表示8进制数,此处,如果你的密码是123456,用户名是jacuro,于是:
  1. perl -MMIME::Base64 -e \
  2.     'print encode_base64("\0jacuro\0123456");'
复制代码
斜杠后面的连续3个数字(012)被认为是一个8进制序列,最终会转换为一个字符.这样产生的base64编码必然是错误的.
所以,如果用户名或者密码的开头是数字,请把\0写成\000,这样安全些.
比如这样子:
  1. perl -MMIME::Base64 -e 'print encode_base64("\0jacuro\000123456");'
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-10 20:15:01 | 显示全部楼层
Post by jacuro;2142199
官方文档中,提到使用类似的命令测试plain auth.

  1. perl -MMIME::Base64 -e \
  2.     'print encode_base64("\0username\0password");'
复制代码

这个可能会出问题,为什么呢?因为在Perl语言中,\nnn(n代表数字)转义序列用来表示8进制数,此处,如果你的密码是123456,用户名是jacuro,于是:

  1. perl -MMIME::Base64 -e \
  2.     'print encode_base64("\0jacuro\0123456");'
复制代码

斜杠后面的连续3个数字(012)被认为是一个8进制序列,最终会转换为一个字符.这样产生的base64编码必然是错误的.
所以,如果用户名或者密码的开头是数字,请把\0写成\000,这样安全些.
比如这样子:

  1. perl -MMIME::Base64 -e 'print encode_base64("\0jacuro\000123456");'
复制代码


谢谢了 就是按照你的提示和帮助解决的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表