У нас следующая топология электронной почты:
Exchange server --------- Sendmail server ---------------Internet
На сервере sendmail нет почтового ящика пользователя и сообщений с адресом отправителя user@my.domain.com
может поступать только с сервера обмена и никогда из Интернета. Основываясь на этом факте, я хочу ограничить количество получаемого спама, отклоняя все электронные письма, поступающие из Интернета и утверждая, что они отправлены из моего собственного домена (anyuser@my.domain.com
).
Я настроил запись SPF для своего домена и установил на сервере sendmail пакеты spfmilter, spamassassin и spamass-milter. Он работает хорошо, но есть две проблемы:
Если во время SMTP-разговора отправитель указал неверный адрес в "MAIL FROM:
"команда, она будет отклонена, но отправитель все равно может выдать другую"MAIL FROM:
", и если этот второй адрес будет принят, будут приниматься и все сообщения. Я предпочитаю, чтобы у отправителя не было второго шанса, и если он укажет, наконец, один адрес, отклоненный spfmilter, все сообщение должно быть безоговорочно отклонено.
Если отправитель указал действительные адреса (принятые spfmilter), он может выдать DATA
команду, а затем поместите строку (как тело сообщения), например "From: <me@my.domain.com>
". Эта строка не является частью SMTP-диалога, но становится частью заголовка сообщения (в моем Outlook этот адрес отображается как адрес отправителя). Поэтому я хочу настроить тест / правило фильтра spamassassin, которое будет отмечать сообщение как спам (после DATA, уже слишком поздно для отклонения сообщения), если адреса отправителя, указанные в заголовке сообщения, не совпадают с адресами, указанными в рамках диалога SMTP, но не знают, как это сделать.
Какие-либо предложения?
Я использую Exim, настроенный с mysql, для фильтрации моей электронной почты. Я считаю, что настройку сделать проще. Конфигурация sendmail всегда казалась мне довольно загадочной.
Чтобы отправитель не мог изменить идентификатор mail_from и повторить попытку, вам нужно будет добавить его IP-адрес в черный список и принудительно включить черный список. Если вы можете заставить фильтр разрывать соединение, а не отклонять mail_from, им нужно будет повторно подключиться, чтобы изменить адрес mail_from. Не думаю, что многие отправители так поступят. Я проверю свою базу и обновлю позже.
Следующее правило проверяет, принадлежит ли адрес «От» к домену example.com. Добавьте эти строки в файл local.cf и перезапустите spamassassin. Увеличивайте балл, если уверены, что он работает правильно. Это предполагает, что вы не используете spamassassin для исходящей почты.
header LOCAL_FROM_HERE From =~ /[.@]example.com/ score LOCAL_FROM_HERE -0.75 describe LOCAL_FROM_HERE From header is local address
РЕДАКТИРОВАТЬ: Я выполнил несколько запросов к своей базе данных электронной почты. Из 2500 соединений, которые использовали локальный адрес в команде MAIL FROM, только 28 были выполнены попытки с нелокальным адресом. Это примерно 1% отказов при простом отказе от использования локальных адресов в команде MAIL FROM. Я не обнаружил случаев, когда сервер повторно подключался и пробовал использовать нелокальный адрес.
Предполагая, что заголовок Envelope_from добавлен до того, как spamassassin отфильтрует сообщение, оба условия могут быть объединены в одну запись черного списка в local.cf. Опять же, это предполагает, что вы не запускаете spamassassin для исходящей электронной почты.
blacklist_from *@example.com
EDIT2: я использую ACL в Exim, чтобы отклонить команду Mail From, если в адресе используется локальный домен. Это применимо, если подключающийся хост не тот, который я считаю локальным. К локальным хостам относятся серверы в локальной сети, утвержденные ретрансляторы и хосты, использующие аутентифицированное соединение на порту представления (587).
+1 к вопросу.
Это звучит как очень распространенный сценарий, для которого должно быть много плагинов sendmail.
Конечно ты должен иметь dkim-milter
и spfmilter
, но они не решают эту точную проблему, что звучит достаточно легко, просто добавив собственный фильтр, чтобы отклонять любые письма, соответствующие чему-то вроде egrep -e '^From: *@my.domain.com'
DKIM очень хорошо, но если письмо не подписано, вы не сможете его провалить из-за плохой подписи. Тогда вы должны потерпеть неудачу, потому что у него нет подписи и утверждает, что он из вашего домена.
Использовать DKIM. это как запись SPF, но показывает открытый ключ. Ваш сервер подписывает электронные письма от вашего домена закрытым ключом
identificator._domainkey.mydomain.com. IN txt "/*spf*/" +" v=DKIM1; k=rsa; p=MIG......endofkey" //BIND9
и в ACL, установленном для проверки подписи DKIM для всей входящей почты, которая утверждает, что это ваш домен.
Dkim был разработан для решения вашей проблемы (рыбалка :))