Назад | Перейти на главную страницу

Отклонять попытки аутентификации Exim на основе имени пользователя

Можно ли настроить 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 но мне это никогда не было нужно.

(Надеюсь, я не сделал никаких опечаток или опечаток.)