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

exim: проверка псевдонимов для аутентифицированного пользователя?

Можно ли проверить псевдоним отправителя на соответствие аутентифицированного пользователя БЕЗ перезаписи поля От? Например, с учетом (значительно упрощенного) файла псевдонима, например:

a1@example.com:       user1@mydomain.com
a2@other.example.com: user1@mydomain.com
a3@example.com: a4@example.com
a4@example.com:       user1@mydomain.com

a5@example.com:       user2@mydomain.com

Я хочу, чтобы аутентифицированный user1 мог отправлять как a1, a2, a3 или a4@example.com, но НЕ a5@example.com, и я хочу, чтобы аутентифицированный user2 мог отправлять как a5@example.com И Я хочу, чтобы они могли использовать псевдонимы в поле From: отправляемых им писем (т.е. я не хочу, чтобы Exim переписывал поля From / Sender, как для «control = submission»).

Функционально это потребует, чтобы Exim уменьшил псевдоним отправителя до конечного маршрутизируемого адреса, а затем разрешил мне доступ к этому значению в acl, чтобы сравнить его с аутентифицированным пользователем. Я думал, что это сделает verify = sender, но тестирование не показывает, что это так.

В моем acl_check_rcpt я пробовал следующее, но безрезультатно, так как любой аутентифицированный пользователь все еще может отправлять как любой действительный псевдоним или другой локальный пользователь, а $ sender_address является псевдонимом, а не базовой реальной учетной записью:

  accept
    authenticated = *
    verify = sender
    logwrite = authenticated user '$authenticated_id' sending as '$sender_address' which \
        is '$sender_address_data' or '$address_data', if error: '$sender_verify_failure'

Согласно Документация Exim (Раздел 26), $ sender_address_data должен содержать результат поиска отправителя после verify = sender, но журналы показывают, что эта переменная всегда пуста:

authenticated user 'user1' sending as 'a5@example.com' which is '' or '', if error: ''

(Обратите внимание, что control = submission мало влияет на это, за исключением перезаписи заголовков From / Sender.)

Я просто ошибаюсь? Есть ли способ проверить, может ли аутентифицированный пользователь правильно отправить псевдоним, с которого он отправляет?

У меня это работает, и вот что я сделал.

Во-первых, во ВСЕХ маршрутизаторах, которые обрабатывают локальных пользователей, установите для переменной exim address_data значение $ {local_part}:

real_local:
  driver              = accept
  domains             = +local_domains
  local_part_prefix   = real-
  check_local_user
  transport           = LOCAL_DELIVERY
  # Set this so acl can use it
  address_data        = ${local_part}

Затем настройте acl для проверки отправителя и аутентифицированного пользователя:

acl_smtp_mail = acl_check_sender_vs_auth

И пусть этот новый acl сравнит аутентифицированного пользователя со значением переменной address_data и убедитесь, что оно такое же:

# Ensure that the MAIL FROM: address matches what the authenticated
# user is, if authentiation is used
acl_check_sender_vs_auth:
    accept
       authenticated = *
       # verify MUST be above condition to resolve $sender_address_data
       verify = sender
       condition = ${if eqi{$authenticated_id}{$sender_address_data}{yes}{no}}
       endpass
       logwrite = AUTH OK - authenticated user '$authenticated_id' sending email from '$sender_address', which belongs to '$sender_address_data'

    deny
       authenticated = *
       # verify MUST be above condition to resolve $sender_address_data
       verify = sender
       !condition = ${if eqi{$authenticated_id}{$sender_address_data}{yes}{no}}
       message = User '$authenticated_id' tried to send mail from '$sender_address', but that email address belongs to someone else
       logwrite = AUTH ERROR - authenticated user '$authenticated_id' tried sending from '$sender_address', but that address belongs to '$sender_address_data'

    accept