Можно ли настроить Exim так, чтобы на основе переданного ему имени пользователя он мог отклонить попытку аутентификации, прежде чем он попытается выполнить поиск пароля для этого имени пользователя? Я проделал то же самое с Dovecot для попыток проверки входящей почты с помощью deny 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 / неправильный код?
Любая помощь будет оценена.
С уважением,
Если вам нужно разрешить 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 но мне это никогда не было нужно.
(Надеюсь, я не сделал никаких опечаток или опечаток.)