[exim-conf] реализована пассивная проверка операционной системы хоста отправителя

Victor Ustugov victor на corvax.kiev.ua
Пн Ноя 24 01:22:57 EET 2014


приветствую

реализована пассивная проверка операционной системы хоста отправителя.

сама проверка ОС осуществляется с помощью p0f:

http://lcamtuf.coredump.cx/p0f3/

о котором авторы пишут:

P0f is a tool that utilizes an array of sophisticated, purely passive
traffic fingerprinting mechanisms to identify the players behind any
incidental TCP/IP communications (often as little as a single normal
SYN) without interfering in any way.

можно скачать архив исходных текстов:

http://lcamtuf.coredump.cx/p0f3/releases/p0f-3.08b.tgz

под FreeBSD можно собрать p0f из порта:

cd /usr/ports/net-mgmt/p0f && make install clean

для RedHat/CentOS/Fedora можно получить пакет с исходными текстами из
Fedora rawhide с одного из зеркал:

https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/source/SRPMS/p/p0f-3.08b-1.fc22.src.rpm
ftp://ftp.funet.fi/pub/Linux/mirrors/fedora/linux/development/rawhide/source/SRPMS/p/p0f-3.08b-1.fc22.src.rpm

в составе p0f нет стартового скрипта для работы в режиме демона. скрипты
для FreeBSD и RedHat/CentOS/Fedora можно забрать отсюда:

http://mta.org.ua/p0f/freebsd/p0f
http://mta.org.ua/p0f/redhat/p0f


для FreeBSD в /etc/rc.conf нужно указать:
p0f_enable="YES"

p0f может работать только на одном интерфейсе. поэтому в переменной
p0f_iface нужно указать название интерфейса.

по умолчанию будет использовано следующее имя файла сокета:
/var/run/p0f.sock

альтернативное имя файла можно указать в /etc/rc.conf в переменной
p0f_socket:

p0f_socket="/var/run/p0f_em0.sock"


при необходимости определять операционную систему SMTP клиента при
коннектах на нескольких интерфейсах нужно запустить по одному экземпляру
p0f для каждого интерфейса.

для запуска второго экземпляра p0f нужно сделать копию стартового
скрипта /usr/local/etc/rc.d/p0f с другим именем. при этом нужно учесть,
что имена всех переменных в /etc/rc.conf будут соответствовать названию
новой копии стартового скрипта.

т. е. для /usr/local/etc/rc.d/p0f_em1 в /etc/rc.conf можно указать
следующие переменные:

p0f_em1_enable="YES"
p0f_em1_iface="em1"
p0f_em1_socket="/var/run/p0f_em1.sock"


в RedHat/CentOS/Fedora настройки p0f указываются в файле /etc/sysconfig/p0f:

P0F_IFACE="eth0"
P0F_SOCKET="/var/run/p0f.sock"

в случае необходимости запуска второго экземпляра p0f на другом
интерфейсе необходимо сделать копию стартового скрипта
/etc/rc.d/init.d/p0f с другим именем, создать для него соответствующий
файл настроек в /etc/sysconfig и настроить запуск демона:

cp -p /etc/rc.d/init.d/p0f /etc/rc.d/init.d/p0f_eth1
echo 'P0F_IFACE="eth1"' > /etc/sysconfig/p0f_eth1
echo 'P0F_SOCKET="/var/run/p0f_eth1.sock"' >> /etc/sysconfig/p0f_eth1
/sbin/chkconfig --level 35 p0f_eth1 on
/sbin/service p0f_eth1 start


кроме p0f для определения ОС SMTP клиента понадобится dlfunc
exim-p0f3-dlfunc:

http://dist.epipe.com/exim/
http://dist.epipe.com/exim/exim-p0f3-dlfunc-0.1.README.txt
http://dist.epipe.com/exim/exim-p0f3-dlfunc-0.1.tar.gz

для сборки этой dlfunc понадобятся исходные тексты exim (как и для
сборки любой другой dlfunc).

пример для FreeBSD:

fetch http://dist.epipe.com/exim/exim-p0f3-dlfunc-0.1.tar.gz
tar -xzf exim-p0f3-dlfunc-0.1.tar.gz
cd exim-p0f3-dlfunc-0.1
CPPFLAGS="-I`ls -1d /usr/ports/mail/exim/work/exim-4.*/build-FreeBSD-*`"
./configure --libdir=`ls -1d
/usr/ports/mail/exim/work/exim-4.*/build-FreeBSD-*`/
make
cp -p .libs/exim-p0f3-dlfunc.so /usr/local/libexec/exim/
cd ..


пример для RedHat/CentOS/Fedora:

wget http://dist.epipe.com/exim/exim-p0f3-dlfunc-0.1.tar.gz
tar -xzf exim-p0f3-dlfunc-0.1.tar.gz
cd exim-p0f3-dlfunc-0.1
CPPFLAGS="-I`ls -1d /usr/src/redhat/BUILD/exim-4.*/build-Linux-* | tail
-n 1`" ./configure --libdir=`ls -1d
/usr/src/redhat/BUILD/exim-4.*/build-Linux-* | tail -n 1`/
make
cp -p .libs/exim-p0f3-dlfunc.so /usr/local/libexec/exim/
cd ..


итак, необходимость использования проверки операционной системы хоста
отправителя указывается в переменной confCHECK_ACCESS_RELAY_OS:

NO          - не использовать пассивную проверку ОС хоста отправителя
YES         - не использовать пассивную проверку ОС хоста отправителя
DEBUG       - выводить в файл протокола название ОС хоста отправителя
              вне зависимости от действий в фильтре

в файле access-relay-os можно указать необходимое действие для данной ОС
в виде:

ОС          : действие : сообщение : сообщение 2

где
ОС          - операционная система в виде полного названия, маски или
            регулярного выражения
действие    - действие, применяемое к письму
сообщение   - ответ SMTP клиенту (может отсутствовать)
сообщение 2 - сообщение в файл протокола или в добавляемое поле
            заголовка (может отсутствовать)

возможные названия ОС можно почерпнуть из файла p0f.fp из состава p0f

следует иметь ввиду, что Windows 2003 опознается как "Windows XP",
Windows 2008 и Windows 2012 опознаются как "Windows 7 or 8".

но т. к. по большому счету вся эта затея призвана наградить серыми
списками товарищей, пришедших из-под Windows без аутентификации и
шифрования, то неспособность различить разные версии Windows ввиду
идентичности используемой реализации стека TCP/IP не так важна.


возможные действия:
ok		- исключение из проверки для указанной ОС
warn		- вывод предупреждения в файл протокола и добавление в
                письмо поля заголовка
greylist=X	- добавление X баллов к счетчику опционального
                грейлистинга
reject=X	- добавление X баллов к счетчику опционального reject'а
delay=zz	- задержка на zz секунд перед продолжением обработки
                сообщения
pause=zz	- синоним delay=zz

в полях действия и сообщений можно использовать вычисляемые выражения,
т. о. можно возвращать разные действия для одной и той же ОС например в
зависимости от принадлежности хоста отправителя списку доверенных сетей
или от использования шифрования SMTP клиентом.

пример:
\N^Windows.*$\N : warn greylist=10 ${if eq{$tls_cipher}{}{pause=15
reject=1}{pause=5}} : $acl_c_sender_host_os OS detected on ${if
eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address]

путь по умолчанию к файлу сокета p0f:
define(`confCHECK_ACCESS_OS_P0F_SOCKET', `/var/run/p0f.sock')

т. к. p0f может слушать лишь на одном интерфейсе, то может понадобиться
запуск нескольких экземпляров p0f с настройкой работы на разных
интерфейсах и использованием разных файлов сокетов.
в этом случае нужно указать зависимость файла сокета от IP адреса
интерфейса, на который пришло соединение от SMTP клиента:

define(`confCHECK_ACCESS_OS_P0F_SOCKET', `${if
eq{$received_ip_address}{1.2.3.4}{/var/run/p0f_em1.sock}{/var/run/p0f.sock}}')dnl

исключения из пассивной проверки операционной системы хоста отправителя:
AUTH	- исключения для аутентифицированных отправителей
HOSTS	- исключения для хостов из confCHECK_ACCESS_RELAY_OS_SKIP_HOSTS
define(`confCHECK_ACCESS_RELAY_OS_SKIP', `AUTH HOSTS')dnl

исключения из пассивной проверки операционной системы хоста отправителя
для хостов из списка:
define(`confCHECK_ACCESS_RELAY_OS_SKIP_HOSTS', `+relay_from_hosts')dnl


-- 
Best wishes Victor Ustugov  mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:       http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 371808614          JID: corvax_at_nb на jabber.corvax.kiev.ua
nic-handle: CRV-UANIC



Подробная информация о списке рассылки exim-conf