Postfix + SASL 使用错误查询进行身份验证

Postfix + SASL 使用错误查询进行身份验证

我最近按照以下指南在 aws ec2 实例上设置了 postfix + dovecot:http://flurdy.com/docs/postfix/#config-secure-auth

目前我被 SASL 困住了。

SQL 查询似乎与已配置的查询不同。以下是配置:

/etc/postfix/sasl/smtpd.conf

节目

pwcheck_method: saslauthd
mech_list: plain login
log_level: 7
allow_plaintext: true
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail
sql_passwd: passwd
sql_database: maildb
sql_select: select crypt from users where id='%u@%r' and enabled = 1

/etc/sasl2/smtpd.conf

节目

pwcheck_method: saslauthd
mech_list: plain login
log_level: 7
allow_plaintext: true
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail
sql_passwd: password
sql_database: maildb
sql_select: select crypt from users where id='%u@%r' and enabled = 1

/etc/pam.d/smtp

#%PAM-1.0
auth required pam_mysql.so user=mail passwd=password host=127.0.0.1 db=maildb table=users usercolumn=id passwdcolumn=crypt crypt=1 debug
account sufficient pam_mysql.so user=mail passwd=password host=127.0.0.1 db=maildb table=users usercolumn=id passwdcolumn=crypt crypt=1 debug

现在配置文件定义select crypt from users where id='%u@%r' and enabled = 1为密码的选择查询。

当身份验证失败时,我检查了一下/var/log/secure,发现使用了错误的选择查询:

Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - SELECT crypt FROM users WHERE id = 'admin'
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - SELECT returned no result.
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - pam_mysql_check_passwd() returning 1.
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - pam_mysql_sql_log() called.
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - pam_mysql_sql_log() returning 0.
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - pam_sm_authenticate() returning 10.
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - pam_mysql_release_ctx() called.
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - pam_mysql_destroy_ctx() called.
Jun  1 15:50:13 ip-172-31-23-97 saslauthd[19892]: pam_mysql - pam_mysql_close_db() called.

这可能是什么原因造成的?

答案1

有两种常用方法可以使用后缀 SASL使用 MySQL:

  • 使用 saslauthd 服务与 pam_mysql 结合
  • 将 sasl auxprop 与 sql 插件结合使用

不幸的是,第二种方法严重的安全缺陷:您必须将密码存储在纯文本格式。因此,对于您的情况,您需要使用 saslauthd 和 pam_mysql。

在上述配置中,您混合了这两种方法:pwcheck_method您放入 saslauthd,但将 sasl 配置为auxprop_plugin与 sql 一起使用。pwcheck_method将覆盖此配置,因此参数 auxprop_plugin(以及您的所有sql_*参数)变得无用。这解释了为什么您会得到错误的查询。相反,SASL 将执行提供的查询。为了满足您的要求,请在 pam 配置中/etc/pam.d/smtp放入额外的参数where

... passwdcolumn=crypt crypt=1 debug where=enabled=1
... passwdcolumn=crypt crypt=1 debug where=enabled=1

对于缺少领域(%r)的问题,请尝试设置smtpd_sasl_local_domain为您的默认域。

相关内容