postfix使用dovecot的sasl认证服务

  • Post author:
  • Post category:其他


我的服务器使用postfix搭建smtp服务,使用dovecot搭建imap服务。当初图方便,只给postfix配置了允许relay的域名(relay_domains),同时增加了黑白名单(smtpd_recipient_restrictions)。

大部分时间是没有问题的,然而最近发现日志多了很多relay记录(不是跟我自己相关的),明显是服务器被探测到了。看来,不得不把sasl服务配置上去。但是,在网上搜索了一圈,没有发现可以正确限制的配置。不得不去看官方文档:

http://www.postfix.org/SASL_README.html

这里先简单介绍一下sasl服务,协议的描述:

https://tools.ietf.org/html/rfc4422

sasl是简单的认证服务。说简单点,类似我们使用dovecot时,需要登录账号的功能。

postfix默认是不限制转发的,即任何连接的客户端,都可以通过服务器给任意用户发送邮件。这个对于友好的中转功能来说特别不错。因为通过这个功能,邮件可以转发到很远的地方。不过,对于现在的网络条件来说,作用已经不是很大,反而成了垃圾邮件的中转服务。

由于安全需要,我们可能会配置一些限制规则,就如我开始配置的允许域名和黑白名单。但是,这个规则无法很好阻止恶意的转发,毕竟转发对于我们而言也是需要的,不然我们的邮件都无法发给其它系统的用户。这时就需要一种更合理的限制规则。

postfix配置sasl服务,其实就是给限制规则(smtpd_recipient_restrictions)增加一种方式(permit_sasl_authenticated)。这个规则的策略是,只允许登录用户使用完整的转发功能(发送给本机用户不受这个条件约束)。这样用起来就安全得多,至少可以防止未认证用户使用我们服务器发送垃圾邮件。

上面的官方文档描述得很清楚,而且都有例子,所以我这里只介绍一下基本的配置。

#使用dovecot的sasl服务。默认使用cyrus,所以一定要配置这个选项!
smtpd_sasl_type = dovecot
#调用sasl服务的路径。支持文件句柄(适合在同一台机器)和请求接口(适合不同机器)
#dovecot开启sasl服务的在/etc/dovecot/conf.d/10-master.conf,里面有明显的注释,去掉就可以
smtpd_sasl_path = /var/spool/postfix/private/auth
#启用sasl服务,并配置一些属性。它们的作用,大家参考文档
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
#在转发限制规则里面,使用sasl服务
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

这里补充一下dovecot的sasl配置,文件在/etc/dovecot/conf.d/10-master.conf。其实就是把“unix_listener /var/spool/postfix/private/auth”这段配置打开。这是使用文件句柄来提供sasl服务。

service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Users that have
  # full permissions to this socket are able to get a list of all usernames and
  # get the results of everyone's userdb lookups.
  #
  # The default 0666 mode allows anyone to connect to the socket, but the
  # userdb lookups will succeed only if the userdb returns an "uid" field that
  # matches the caller process's UID. Also if caller's uid or gid matches the
  # socket's uid or gid the lookup succeeds. Anything else causes a failure.
  #
  # To give the caller full permissions to lookup all users, set the mode to
  # something else than 0666 and Dovecot lets the kernel enforce the
  # permissions (e.g. 0777 allows everyone full permissions).
  unix_listener auth-userdb {
    #mode = 0666
    #user = 
    #group = 
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }

  # Auth process is run as this user.
  #user = $default_internal_user
}

配置好上面内容后,重启postfix就可以生效。

这里再介绍关于使用telnet测试postfix功能的一些问题。

1、ehlo命令可以查看服务器状态,包括是否启用sasl,以及使用的认证类型。这样我们就可以通过auth命令进行认证。例如,dovecot使用plain认证,那么我们输入“auth plain”就可以进行plain认证。

2、plain认证的数据是怎样的呢?协议的描述:

https://tools.ietf.org/html/rfc2595

里面有完整描述plain的数据格式,即[authorize-id] NUL authenticate-id NUL password。

但是发送给postfix的数据不是直接使用上面数据,而是需要base64编码后再发送(数据格式错误时,会有这个提示的)。

例如,用户:tim,密码:tanstaaftanstaaf,认证发送的数据就是“<NUL>tim<NUL>tanstaaftanstaaf”,可以使用下面命令生成发送的字符串:

echo -en "\0tim\0tanstaaftanstaaf" | base64

最后,使用plain认证时,建议启用tls,避免明文直接在网络传输。



版权声明:本文为UFO_SERIESOFSOFT原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。