Одним из, пожалуй главных минусов электронной почты является спам. В сегодняшней статье я хочу рассказать о том, как можно легко, просто, довольно эффективно бороться со спамом не прибегая к использованию специализированного и очень дорогого программного обеспечения. В качестве примера я буду использовать лучший, на мой взгляд, почтовый сервер Microsoft Exchange Server (не сочтите за рекламу).

Самым правильным, с точки зрения информационной безопасности, будет использовать для борьбы со спамом роль сервера пограничного транспорта (Edge Transport). Первое, с чего стоит начать, это с поставщиков черных списков IP-адресов (DNSBL). Настраивается это следующими командами:

Add-IPBlockListProvider -Name "zen.spamhaus.org" -LookupDomain zen.spamhaus.org
Add-IPBlockListProvider -Name "b.barracudacentral.org" -LookupDomain b.barracudacentral.org
Add-IPBlockListProvider -Name "bl.spamcop.net" -LookupDomain bl.spamcop.net

Черные списки IP-адресов, несмотря на свою простоту и древность, по-прежнему отсеивают большую часть спама. Настроив список поставщиков DNSBL, можно приступить к настройке контент-фильтра:

Set-ContentFilterConfig -SCLQuarantineEnabled $true -SCLRejectEnabled $true -SCLDeleteEnabled $true -SCLQuarantineThreshold 5 -SCLRejectThreshold 6 -SCLDeleteThreshold 8 -QuarantineMailbox [email protected] -BypassedRecipients [email protected] -BypassedSenders [email protected] 

Приведенным выше командлетом мы настроили контент фильтр так, чтобы он помещал в почтовый ящик карантина сообщения вероятность нежелательности (SCL) которых больше или равна 5. Сообщения с SCL больше либо равным 6 отклоняются, а с SCL >= 8 - удаляются. Если сервер сообщение отклоняет, то он оповещает об этом отправителя. Удаление же характерно тем, что отправитель об этом не извещается. Оценка вероятности нежелательности является весьма субъективным критерием фильтрации, однако именно контент-фильтр является обучаемым, поэтому важно в почтовом ящике отмечать, что является спамом, а что спамом не является, поскольку эта информация передается на пограничный транспортный сервер. На вероятность нежелательности влияет, в частности, тема сообщения, а также его текст. Отсутствие темы в сообщении только увеличивает SCL, тем самым повышая вероятность того что такое сообщение попадет в спам или вообще будет отклонено сервером. 

Разберем подробнее значение каждого параметра:

  • -SCLQuarantineEnabled $true - разрешает помещать в карантин сообщения SCL которых больше либо равен значению параметра -SCLQuarantineThreshold. Если значение этого параметра $false параметр -QuarantineMailbox [email protected] просто не имеет никакого смысла
  • -SCLRejectEnabled $true - разрешает отклонять сообщения SCL которых больше либо равен значению параметра -SCLRejectThreshold
  • -SCLDeleteEnabled $true - разрешает отклонять сообщения SCL которых больше либо равен значению параметра -SCLDeleteThreshold
  • -QuarantineMailbox - задает адрес почтового ящика карантина
  • -BypassedRecipients - позволяет указать получателей, сообщения для которых не должны проходить контентную фильтрацию
  • -BypassedSenders - позволяет указать адреса отправителей, сообщения от которых следует исключить из контентной фильтрации. Иными словами данный параметр задает список надежных отправителей

Следующим этапом настроим идентификацию отправителей. Для понимания, идентификация отправителей, это проверка записей SPF для домена, указанного в адресе отправителя

Set-SenderIdConfig -SpoofedDomainAction Delete

При такой настройке сообщения, имеющие признаки подделки (когда проверка SPF заканчивается ошибкой) удаляются сервером, а отправитель не извещается о предпринятом сервером действии.

Теперь перейдем к настройке фильтра репутации отправителя. Оценка репутации отправителя один из вероятностных алгоритмов, основанный на анализе протокола, включающем в себя анализ приветствия (HELO/EHLO), обратный поиск DNS (проверка, соответствует ли имя хоста, указанное в приветствии, имени хоста в PTR-записи для IP-адреса, с которого пришло сообщение), анализ SCL для конкретного отправителя, а также тест открытого прокси-сервера. Таким образом можно отметить, что фильтр репутации отправителя является обучаемым, так как использует накопленную статистику SCL. Настраивается фильтр следующим командлетом:

Set-SenderReputationConfig -SrlBlockThreshold 6 -SenderBlockingPeriod 36 -OpenProxyDetectionEnabled $true -SenderBlockingEnabled $true 

Разберем подробнее значение каждого параметра:

  • -SrlBlockThreshold - определяет минимальный уровень репутации отправителя (SRL), при котором сервер блокирует IP адрес отправителя на время, определяемое параметром -SenderBlockingPeriod
  • -SenderBlockingPeriod - определяет период, на который блокируется IP-адрес адрес отправителя, SRL которого равен или  превышает значение, определенное параметром -SrlBlockThreshold
  • -OpenProxyDetectionEnabled - включает тест открытого прокси-сервера
  • -SenderBlockingEnabled - разрешает или запрещает блокировать отправителей, SRL которых равен или  превышает значение, определенное параметром -SrlBlockThreshold

Таким образом, приведенный мною пример настройки фильтра репутации отправителя настраивает сервер на блокировку отправителей на 36 часов, если их SRL больше или равен 6.

Следующим этапом нужно запретить прием сообщений от имени собственного домена. Сделать это можно следующим образом:

Set-SenderFilterConfig -BlankSenderBlockingEnabled $true -BlockedDomainsAndSubdomains @{Add=”examle.local","example.net","exemle.ru"}

Более подробно об этом я писал тут. Командлет Set-SenderFilterConfig позволяет, в частности, запретить присылать извне сообщения на определенные адреса, а также заблокировать определенных отправителей как по домену, так и по полному адресу. Подробнее об этом командлете можно почитать тут.

Заблокировав собственные домены мы предотвращаем возможность спуфинга собственных адресов.

Теперь самое время подумать о том, как можно сократить нагрузку на сервер, ведь спамеры нередко открывают немеренное количество соединений с сервером. Это можно пресечь установив -TarpitInterval - искусственную задержку, которую сервер включает для подозрительных IP-адресов:

Set-ReceiveConnector "Default internal receive connector EDGE0" -RequireEHLODomain $false -RequireTLS $true -MaxInboundConnectionPerSource 1 -MessageRateLimit 10 -TarpitInterval 00:00:30

Разберем подробнее значение каждого параметра:

  • -RequireEHLODomain - включает или отключает обязательное требование от отправителя сообщать имя хоста в команде HELO/EHLO
  • -RequireTLS - включает или отключает требование TLS шифрования
  • -MaxInboundConnectionPerSource - устанавливает максимальное количество одновременных соединений с одного IP-адреса
  • -MessageRateLimit - устанавливает максимальное количество сообщений, которое может принять сервер с одного IP-адреса в течении 1 минуты
  • -TarpitInterval - указывает период задержки SMTP-ответа удаленному серверу, который подозревается в злоупотреблении подключением.

Подробнее можно почитать тут.

В приведенном примере для соединителя получения включается обязательное требование TLS для всех входящих соединений, допуская максимально одно одновременное подключение с одного IP-адреса, ограничение в 10 сообщений в минуту с одного IP адреса и задержка для подозрительных адресов, равная 30 секундам.

Фактически, большинство рассыльщиков спама не поддерживают TLS шифрование, в результате чего сервер просто закрывает соединение, не проводя какие-либо проверки.

Таким образом, сама по себе защита от спама не так сложна, как может показаться, а различные платные программные продукты, на мой взгляд целесообразнее именно для защиты от вирусов, нежели чем защиты от спама.