DSPAM для CGP в режиме добавления заголовков
DSPAM — это свободное программное обеспечение, представляющее собой статистический спам фильтр.
Проект , который некоторое время оказался заброшенным, вот уже больше полугода активно развивается dspam-сообществом. В 2007 году его бывший автор Jonathan Zdziarski передал свои права компании Sensory Networks. А в январе 2009 года компания Sensory Networks объявила, что перестаёт заниматься этим проектом и полностью передала все права dspam-сообществу.
Про настройку, обучение и работу с dspam-ом есть много статей, я хочу написать об изменениях, которыми пользуюсь я для связки dspam-а и CGP.
Работая с почтовым сервером CGP, я решил попробовать dspam. У CGP есть удобный механизм написания helper-ов. Программ-помощников, которые умеют получать на вход содержимое сообщения, а на выход выдавать свой вердикт. Письмо можно принять, отвергнуть или добавить в него служебный заголовок. Вот я и решил использовать helper, что бы добавлять в сообщения заголовки с результатами анализа сообщения dspam-ом.
Как выяснилось, dspam не умеет выдавать результат анализа сообщения в виде коротких заголовков. Он или работает в режиме LMTP, когда принимает сообщение, анализирует, добавляет заголовки и передаёт сообщение дальше локальному DeliveryAgent-у. Или умеет измененное сообщение с заголовками возвращать на stdout обратно. Всё это не очень удобно для работы из helper-а CGP. Потому я сделал не большой патч к dspam-у, который переводит его в режим «возврата только заголовков». И написал dspam-cgp.c helper для CGP.
Для запуска dspam-а для CGP надо:
- Взять свежий dspam из .
- Пропатчить dspam. dspam_addheader.patch включает в dspam-е вывод только заголовков:
$ cd ./dspam $ patch -p2 < ../dspam_addheader.patch
- Собрать dspam:
./autogen.sh ./configure \ --enable-daemon \ --enable-syslog \ --with-storage-driver=mysql_drv \ --with-mysql-includes=/usr/include/mysql \ --enable-long-usernames
- Сконфигурить dspam. Я использую mysql для хранения базы. hashdb много быстрее, но крешится. Мой dspam.conf:
Home /usr/local/var/dspam StorageDriver /usr/local/lib/libmysql_drv.so OnFail error Trust root Trust nobody TrainingMode tum Feature noise Feature whitelist Feature tb=5 Algorithm graham burton # Я использую osb, если поток писем не большой, # то можно попробовать sbph Tokenizer osb PValue bcr ImprobabilityDrive off Preference "spamAction=deliver" Preference "signatureLocation=headers" # 'message' or 'headers' Preference "showFactors=off" # Ваши настройки для mysql базы dspam-а. MySQLServer 111.222.333.444 MySQLPort 3306 MySQLUser dspam MySQLPass xxxxxx MySQLDb dspam MySQLCompress true MySQLReconnect true MySQLConnectionCache 5 # Игнорируем хэдеры, которые может добавлять кто-то по пути IgnoreHeader X-Spam-Status IgnoreHeader X-Spam-Scanned IgnoreHeader X-Spam-Flag IgnoreHeader X-Virus-Scanner-Result IgnoreHeader X-DSPAM-Result IgnoreHeader X-DSPAM-Confidence IgnoreHeader X-DSPAM-Probability IgnoreHeader X-Spam-Yversion IgnoreHeader X-Spam-Ystatus Notifications off # Чистка базы mysql запускается отдельно через sql запрос. # Потому тут всё "off". PurgeSignature off # Specified in purge.sql PurgeNeutral 90 PurgeUnused off # Specified in purge.sql PurgeHapaxes off # Specified in purge.sql PurgeHits1S off # Specified in purge.sql PurgeHits1I off # Specified in purge.sql SystemLog off UserLog off TrainPristine off Opt out ParseToHeaders off ChangeModeOnParse off ChangeUserOnParse off MaxMessageSize 10485760 # Параметры dspam-сервера ServerPort 24 ServerQueueSize 64 ServerPID /var/run/dspam.pid ServerMode dspam ServerPass.Relay1 "secret" ServerParameters "--deliver=innocent, spam" ProcessorURLContext on ProcessorBias on
- Я использую одну общую базу для всех ящиков. Общий пользователь у меня: nobody. Для этого надо положить в Home dspam-а файл group вот такого содержания (для моего конфига в /usr/local/var/dspam/group):
nobody:shared:*
- Запустить dspam-демон:
dspam --daemon --user nobody
Запускать его можно как на том же сервере, где работает CGP, так и на удалённом выделенном сервере. Ресурсов он потребляет не много. Основная нагрузка приходится на mysql базу, потому что запросы достаточно тяжёлые. Для систем с большим потоком писем возможно стоит перейти в режим «TrainingMode notrain» и «Tokenizer osb»:
# TrainingMode notrain - Do not train or store signatures # (large ISP systems, post-train) # Tokenizer osb - Orthogonal Sparse biGram # Similar to SBPH, but only uses the biGrams # example: "the * * fox" and "the * * * jumped"
- Собрать dspam-cgp.c:
Linux: gcc -Wall -pthread dspam-cgp.c -o dspam-cgp FreeBSD: gcc -DFREEBSD -pthread dspam-cgp.c -o dspam-cgp Solaris: gcc -threads dspam-cgp.c -o dspam-cgp -lsocket -lnsl - Сделать и запустить хелпер CGP:
CGPDSPAM/dspam-cgp -q -d 127.0.0.1 -u nobody -a secret@Relay1
Дополнительные параметры хелпера:
Usage: dspam-cgp [options] -d : specify ip address to connect to DSPAM -h : print this help message -p : specify port for connection. default: 24 -t : timeout in seconds to read from DSPAM 0 disables, default: 30 sec -U : use UNIX domain socket with path -a : set ClientIdent for DSPAM mode -u : specifies the destination users -c : tells DSPAM to only classify the message -S : checks the first Kylobytes of a message : if message size is more, default: 256K -q : don't add any header on Skip messages - Настроить правило для CGP, что бы оно все сообщения отправляло в этот фильтр. Так как для анализа не требуется всё сообщение, на проверку отправляется только первые 256 килобайт сообщения. Потому в правиле для CGP можно не ограничивать размер обрабатываемых сообщений. Смотри параметр -S в dspam-cgp.
- Далее наблюдаем за результатами работы антиспама и обучаем его рекомендуемыми способами. Их можно поискать в документации или воспользоваться мировым опытом в интернете.
- Смотреть статику можно так:
# dspam_stats -H nobody: TP True Positives: 45176 TN True Negatives: 564624 FP False Positives: 329 FN False Negatives: 353 SC Spam Corpusfed: 124471 NC Nonspam Corpusfed: 183185 TL Training Left: 0 SHR Spam Hit Rate 99.22% HSR Ham Strike Rate: 0.06% PPV Positive predictive value: 99.28% OCA Overall Accuracy: 99.89%
В результате в сообщениях появятся заголовки:
X-DSPAM-Result: Spam X-DSPAM-Processed: Tue Dec 8 20:50:37 2009 X-DSPAM-Confidence: 0.9901 X-DSPAM-Probability: 1.0000 X-DSPAM-Signature: 4aba8b37175501492017818
Внимание! Заголовок X-DSPAM-Factors не
добавляется. Он слишком большой и неудобный для добавления.
UPD. 16.09.2010 Обновление до версии 1.0.3. Изменена инструкция для сборки под solaris. Оказалось, что fflush () для строкоориентированных файловых потоков под Солярисом добавляет перевод строки. Это немного мешает работе хелпера.
UPD. 02.10.2010 Обновление до версии 1.0.4. Более корректная работа с трэдами. Добавлена опция для указания произвольного заголовка для X-Junk-Score.
UPD. 20.01.2012 Обновление до версии 1.0.7. Переименована функция _getline. Для функции connect () написан враппер с возможностью установить timeout. Исправлена досадная ошибка в LMTP протоколе: не добавлялись вторые точки к строкам с точкой в начале. Могло приводить к зависанию хелпера и отстрела его cgp-сервером по timeout-у.









20.01.2012 в 23:04
Обновление до версии 1.0.7