是否可以设置Exim,以便根据传递给它的用户名,在尝试对该用户名执行密码查找之前拒绝身份验证尝试?我对Dovecot做了类似的操作,通过拒绝passdb对传入的邮件进行检查,并希望对发送邮件的尝试也这样做。我们不能让他们继续尝试和失败的主要原因来自于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/错误的代码?
如能提供任何协助,将不胜感激。
诚挚的问候,
发布于 2019-02-14 04:59:10
如果您需要允许客户端使用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,但我从来不需要它。
(我希望我没有犯任何错误。)
https://serverfault.com/questions/915328
复制