FreeBSD: Интеграция P0F с Amavisd-new и SpamAssassin

p0f В настоящее время для рассылки СПАМа все реже используются серверы с операционными системами семейства 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.

Заключение

Выполнив действия, описанные в этой статье, Вы поможете своей почтовой системе более адекватно идентифицировать СПАМ. На мой взгляд, актуальность рассмотренной доработки будет расти с течением времени, т.к. компьютеры, подключенные к Интернет, есть почти в каждом доме, однако, далеко не все пользователи заморачиваются с их грамотной настройкой и защитой от вредоносного программного обеспечения.

Понравилась статья?

Подпишитесь на RSS или почтовую рассылку;

Присоединяйтесь в Twitter, Facebook, Google+, VK;

Поделитесь ссылкой в социальной сети или блоге:

9 комментариев к “FreeBSD: Интеграция P0F с Amavisd-new и SpamAssassin

  1. Проделал все шаги по настройке интеграции в соответствии со статьей. Однако в исходниках получаемых писем не видно поле X-Amavis-OS-Fingerprint. Есть подозрение, что это происходит вследствие того, что сервера «общаются» не по 25 порту, а по 465 (стандартный для tls). Не сталкивались с подобным?

  2. Получил подобную проблему. Как оно часто бывает, проблема кроется в стартовом скрипте… Там не указан интерфейс.
    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-прокси, но тогда возникает много вопросов с ключами и сертификатами.

    • Подойдет, только придется ставить ПО с помощью rpm или yum, а также класть файлы конфигурации в папку /etc, а не /usr/local/etc. Подробнее сказать не могу, т.к. под Linux’ом не делал, но работать будет 100%. Читайте файлы INSTALL/README, входящие в состав дистрибутивов.

  3. На FreeBSD c двумя внешними интерфейсами есть проблема, слушается только один, или надо использовать что то на подобии Bridge. Можно запустить две копии p0f на разные порты. Но запусть двоную проверку в amavis… os_fingerprint_method = , надо еще поковырять…

Оставить комментарий