В настоящее время для рассылки СПАМа все реже используются серверы с операционными системами семейства Linux/Unix. Все чаще СПАМеры применяют специализированное программное обеспечение, зомбирующее домашние компьютеры с клиентскими операционными системами семейства Microsoft Windows. Получается, что сообщение, отправленное почтовым сервером, например, с Windows XP, более вероятно окажется СПАМом, нежели сообщение, отправленное почтовым сервером c Linux. Другими словами — тип операционной системы почтового сервера может служить одним из признаков идентификации СПАМа.
Постановка задачи
P0F — Linux/Unix-утилита, предназначенная для определения типа операционной системы удаленного компьютера путем анализа пакетов, перехваченных в момент установки соединения. В отличие от активных сканеров (например, nmap и queSO) p0f относится к пассивным сканерам, работает абсолютно прозрачно и не создает какой-либо дополнительный трафик с удаленным компьютером. Последние версии Amavisd-new и SpamAssassin позволяют использовать результаты работы p0f в качестве дополнительного критерия идентификации СПАМа. В этой заметке описан процесс интеграции p0f в существующую систему защиты от СПАМа на базе Amavisd-new и SpamAssassin.
Исходные данные
Имеется сервер с FreeBSD, находящийся на входе подсети центрального офиса. На этом сервере развернута почтовая система, имеющая примерно такую же подсистему защиты от СПАМа, как Почтовая система среднего офиса на базе Postfix. Утилита p0f будет автоматически установлена в процессе пересборки порта Amavisd-new. Программное обеспечение будет разворачиваться из портов, поэтому я рекомендую Вам обновить их перед выполнением действий, описанных ниже (я использовал FreeBSD 7.2 и последние версии портов для нее).
Интеграция p0f и Amavisd-new
Amavisd-new взаимодействует с p0f посредством демона amavis-p0fanalyzer, который входит в состав Amavisd-new. Демон amavis-p0fanalyzer обеспечивает прослушивание входящих TCP-подключений на 25й порт всех сетевых интерфейсов сервера с помошью p0f, соответствующую обработку, сохранение в кеше на 10 минут и отдачу собранных данных в ответ на специальные UDP-запросы на 2345 порт локального сетевого интерфейса от Amavisd-new. Получив информацию, Amavisd-new добавляет к сообщению заголовок X-Amavis-OS-Fingerprint
, содержащий тип операционной системы, аптайм, IP-дистанцию, тип сетевого подключения, IP-адрес и порт почтового сервера, например:
X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 2) (up: 4696 hrs), (distance 9, link: ethernet/modem), [209.85.219.216:57437]
Интеграцию p0f и Amavisd-new следует начать с пересборки Amavisd-new (в процессе пересборки будет автоматически установлена p0f):
cd /usr/ports/security/amavisd-new make deinstall make WITH_P0F=true reinstall clean
Для того, чтобы amavis-p0fanalyzer запускался при запуске операционной системы, необходимо добавить в файл /etc/rc.conf
строку:
amavis_p0fanalyzer_enable="YES"
После этого следует запустить amavis-p0fanalyzer командой /usr/local/etc/rc.d/amavis-p0fanalyzer start
. Для того, чтобы Amavisd-new начал запрашивать информацию у amavis-p0fanalyzer и добавлять к обрабатываемым сообщениям соответствующие заголовки, в файле /usr/local/etc/amavisd.conf
необходимо раскомментировать строку:
$os_fingerprint_method = 'p0f:*:2345'; # to query p0f-analyzer.pl
На этом интеграция p0f и Amavisd-new заканчивается. Остается перезапустить Amavisd-new командой amavisd reload
. Если Вы не допустили ошибок, то в заголовки принятых сообщений теперь будет добавляться поле X-Amavis-OS-Fingerprint
. Следует отметить, что по умолчанию для снижения нагрузки на сервер обрабатываются только те сообщения, которые были отправлены из-за пределов доверенных сетей, определенных в файле /usr/local/etc/amavisd.conf
с помощью переменной @mynetworks
.
Интеграция p0f и SpamAssassin
Интеграция p0f и SpamAssassin заключается в добавлении правил, которые анализируют содержимое поля X-Amavis-OS-Fingerprint
и выставляют соответствующие оценки. В официальной документации Amavisd-new представлена следующая статистика (ham
— сообщения, получившие оценку ≤3 и не являющиеся СПАМом, spam
— сообщения, получившие оценку ≥6 и являющиеся СПАМом):
Для того, чтобы SpamAssassin учитывал тип операционной системы почтового сервера, содержащийся в добавленном Amavisd-new заголовке X-Amavis-OS-Fingerprint
, необходимо добавить в файл в файл /usr/local/etc/mail/spamassassin/local.cf
следующие правила (оценки score
обоснованы представленной выше диаграммой и могут быть уточнены в процессе точной настройки системы защиты от СПАМа):
describe __L_P0F_EXISTS A header field X-Amavis-OS-Fingerprint does exist header __L_P0F_EXISTS exists:X-Amavis-OS-Fingerprint describe L_P0F_WXP Remote system is truly a Windows XP, not Windows 2000 header L_P0F_WXP X-Amavis-OS-Fingerprint =~ /\AWindows XP(?![^(]*\b2000 SP)/m score L_P0F_WXP 2.3 describe L_P0F_W Remote system is some Windows variant, except Win. XP header L_P0F_W X-Amavis-OS-Fingerprint =~ /\AWindows(?! XP)/m score L_P0F_W 1.3 describe L_P0F_UNKN P0f was unable to determine remote OS type header L_P0F_UNKN X-Amavis-OS-Fingerprint =~ /\AUNKNOWN/m score L_P0F_UNKN 0.8 describe L_P0F_Unix Remote system is running Unix, not Linux header L_P0F_Unix X-Amavis-OS-Fingerprint =~ /\A((Free|Open|Net)BSD|Solaris|HP-UX|Tru64|AIX)/m score L_P0F_Unix -1.0 describe L_P0F_Unix Remote system is running Linux header L_P0F_Linux X-Amavis-OS-Fingerprint =~ /\ALinux/m score L_P0F_Linux -0.1
Правило, заданное в строках 3-5 срабатывает в случае использования на почтовом сервере Windows XP; в строках 6-8 — любой версии Windows, но не Windows XP; в строках 9-11 — неизвестной p0f операционной системы; в строках 12-14 — Unix, но не Linux; в строках 15-17 — Linux.
Также официальная документация Amavisd-new рекомендует учитывать IP-дистанцию в процессе идентификации СПАМа. Для того, чтобы SpamAssassin учитывал IP-дистанцию, содержащуюся в добавленном Amavisd-new заголовке X-Amavis-OS-Fingerprint
, необходимо добавить в файл в файл /usr/local/etc/mail/spamassassin/local.cf
следующие правила:
header L_P0F_D1234 X-Amavis-OS-Fingerprint =~ /\bdistance [1-4](?![0-9])/m score L_P0F_D1234 -0.5 header L_P0F_D5 X-Amavis-OS-Fingerprint =~ /\bdistance 5(?![0-9])/m score L_P0F_D5 -0.5 header L_P0F_D6 X-Amavis-OS-Fingerprint =~ /\bdistance 6(?![0-9])/m score L_P0F_D6 -0.5 header L_P0F_D7 X-Amavis-OS-Fingerprint =~ /\bdistance 7(?![0-9])/m score L_P0F_D7 -0.5 header L_P0F_D8 X-Amavis-OS-Fingerprint =~ /\bdistance 8(?![0-9])/m score L_P0F_D8 -0.5 header L_P0F_D9 X-Amavis-OS-Fingerprint =~ /\bdistance 9(?![0-9])/m score L_P0F_D9 -0.4 header L_P0F_D10 X-Amavis-OS-Fingerprint =~ /\bdistance 10(?![0-9])/m score L_P0F_D10 -0.3 header L_P0F_D11 X-Amavis-OS-Fingerprint =~ /\bdistance 11(?![0-9])/m score L_P0F_D11 -0.3
Правило, заданное в строках 1 и 2 срабатывает, если IP-дистанция равна 1-4; в строках 3 и 4 — если IP-дистанция равна 5; 5 и 6 — если IP-дистанция равна 6; 7 и 8 — если IP-дистанция равна 7; 9 и 10 — если IP-дистанция равна 8; 11 и 12 — если IP-дистанция равна 9; 13 и 14 — если IP-дистанция равна 10; 15 и 16 — если IP-дистанция равна 11. На мой взгляд, правила не требуют дополнительных пояснений.
На этом интеграция p0f и SpamAssassin заканчивается. Остается проверить файл /usr/local/etc/mail/spamassassin/local.cf
на наличие ошибок командой spamassassin --lint
и перезапустить Amavisd-new командой amavisd reload
.
Заключение
Выполнив действия, описанные в этой статье, Вы поможете своей почтовой системе более адекватно идентифицировать СПАМ. На мой взгляд, актуальность рассмотренной доработки будет расти с течением времени, т.к. компьютеры, подключенные к Интернет, есть почти в каждом доме, однако, далеко не все пользователи заморачиваются с их грамотной настройкой и защитой от вредоносного программного обеспечения.
Проделал все шаги по настройке интеграции в соответствии со статьей. Однако в исходниках получаемых писем не видно поле
X-Amavis-OS-Fingerprint
. Есть подозрение, что это происходит вследствие того, что сервера «общаются» не по 25 порту, а по 465 (стандартный для tls). Не сталкивались с подобным?Если я ничего не путаю, p0f слушает только 25й порт.
Получил подобную проблему. Как оно часто бывает, проблема кроется в стартовом скрипте… Там не указан интерфейс.
TCPDUMP/BPF вешается обычно на
em0
, а у меня нужно наlagg0
…. Смотрим скрипт и лечим без ножа, и так, гомеопатия:# cat /etc/rc.conf
amavis_p0fanalyzer_enable="YES"
amavis_p0fanalyzer_p0f_filter="tcp dst port 25"
amavis_p0f_daemon_flags="-i lagg0 -l"
# ps xa | grep p0f
53535 ?? Ss 0:05.74 /usr/local/bin/p0f -i lagg0 -l tcp dst port 25
53536 ?? Is 0:00.19 /usr/bin/perl -T /usr/local/sbin/p0f-analyzer.pl 2345 (perl5.10.1)
Вешается
tcpdump
наlo0
и видим всё 🙂Dwolfix, TLS же шифрованный, его просто перехватывать бесполезно. Как вариант — ставить SSL-прокси, но тогда возникает много вопросов с ключами и сертификатами.
Уже отключил
p0fanalyzer
в связи с ненадобностью.На мой взгляд, хуже от него точно не будет.
Скажите пожалуйста, взял у ребят выделенный сервер с установленной CentOS, подойдет ли эта инструкция для такой ОС?
Подойдет, только придется ставить ПО с помощью rpm или yum, а также класть файлы конфигурации в папку
/etc
, а не/usr/local/etc
. Подробнее сказать не могу, т.к. под Linux’ом не делал, но работать будет 100%. Читайте файлыINSTALL/README
, входящие в состав дистрибутивов.На FreeBSD c двумя внешними интерфейсами есть проблема, слушается только один, или надо использовать что то на подобии Bridge. Можно запустить две копии p0f на разные порты. Но запусть двоную проверку в amavis…
os_fingerprint_method =
, надо еще поковырять…Любая нестандартная конфигурация нуждается в некотором дополнительном ковырянии 🙂