根据用户名拒绝 Exim 身份验证尝试

根据用户名拒绝 Exim 身份验证尝试

是否可以设置 Exim,以便根据传递给它的用户名,在尝试查找该用户名的密码之前拒绝身份验证尝试?我已经通过拒绝 passdb 对 Dovecot 的传入邮件检查尝试进行了类似的操作,并且也希望对外发邮件尝试执行相同的操作。我们不能让他们继续尝试并失败的主要原因是发生的 IP 阻止有时会影响其他人。

我查看了 Exim 文档中看似相关的内容(ACL、身份验证器、变量索引等),但我不太确定我的解释是否准确。有几个 ACL 看似相关,但我最初尝试使用它们时没有成功。

我尝试使用的两个 ACL 是 acl_smtp_auth 和 acl_smtp_connect,代码如下:

deny condition = ${if exists{/etc/virtual/blacklist_smtp_email_accounts}}
    condition = ${lookup{$sender_address}lsearch{/etc/virtual/blacklist_smtp_email_accounts}{1}{0}}
    message = E-Mail $sender_address is blacklisted
    logwrite = E-Mail $sender_address is blacklisted

这是否需要修改身份验证器,这意味着我所做的一切都必须是安全的,或者我只是使用了错误的 ACL/错误的代码?

任何援助将不胜感激。

此致,

答案1

如果您需要允许客户端进行 AUTH,但根据回复的地址您想要阻止实际的密码查找,那么最合乎逻辑的地方似乎是身份验证器:

Q_AUTH_USERBL = ${lookup{$auth2}lsearch{.../blacklist}{true}}
Q_AUTH_PLAIN =  ${if eq{ ${lookup{$auth2}lsearch{.../users}} }{ $auth3 } {true}{false}}

或者使用 SQL:

Q_AUTH_USERBL = ${lookup pgsql{SELECT count(*) FROM user WHERE uid='${quote_pgsql:$auth2}' AND blacklisted}{true}}

Q_AUTH_PLAIN = ${lookup pgsql{SELECT count(*) FROM user WHERE uid='${quote_pgsql:$auth2}' AND pw=encrypt('${quote_pgsql:$auth3}')}{$value}fail}

fixed_plain:
  driver = plaintext
  public_name = PLAIN
  server_condition = ${if !bool{Q_AUTH_USERBL} {Q_AUTH_PLAIN}{false}}
  server_set_id = $2
  server_prompts = :
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
    server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}
  .endif

对于 SQL 来说,这毫无意义,因为最终会使用两次查找,而不是一次,并且通过使用

SELECT COUNT(*) FROM users WHERE uid=$1 AND pw=$2 AND NOT blacklisted;

种 SQL,并且可以简单地使用server_condition=Q_AUTH_PLAIN

至于 ACL,我会检查验证 acl_smtp_mailauth但我从来不需要它。

(我希望我没有犯任何错误或者打字错误。)

相关内容