Для пользователей, которые успешно авторизовались с помощью SMTP Auth (логин типа vasya@domain), мы разрешаем отсылать письма через наш почтовый сервер с любого IP-адреса (то есть поддерживаем roaming users). В определенный момент мы натолкнулись на неприятный случай – у одного клиента был украден/заснифлен его логин-пароль и с нескольких IP-адресов была массированная рассылка спама. При этом, так как клиент “представился”, ему было позволено указывать любой envelope-from, чем и воспользовались спаммеры. Ситуация расстроила, адреса зафильтровали, клиентский логин/пароль заблокировали, но нужно было что-то решать в комплексе – для авторизованных клиентов разрешать использование envelope-from, соответствующий их логину.
В postfix есть возможность указать ограничение reject_sender_login_mismatch, при использовании которого производится проверка в таблице smtpd_sender_login_maps соответствия логина и MAIL FROM. Но тут возникает другой момент – для тысяч почтовых ящиков генерировать такую таблицу можно, но это потребует напильника в postfixadmin, который используется для управления аккаунтами клиентов. Немного посоображав, была реализована следующая грубая, но работающая схема с помощью mysql maps: описываем таблицу в main.cf:
smtpd_sender_login_maps = mysql:/usr/local/etc/postfix/sql/mysql_authentificated_users.cf
Сам mysql_authentificated_users.cf прост до безобразия:
user = mysql_username password = mysql_password hosts = database_host dbname = database_name query = SELECT '%s'
Не забываем в main.cf указать, чтобы те, кто используют несовпадающий envelope-from, получали reject:
smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch permit
Вот такая история из цикла “неэлегантно, но практично”