Версия для печати

dspam-logo-eyes DSPAM — это свободное программное обеспечение, представляющее собой статистический спам фильтр.

Проект DSPAM, который некоторое время оказался заброшенным, вот уже больше полугода активно развивается dspam-сообществом. В 2007 году его бывший автор Jonathan Zdziarski передал свои права компании Sensory Networks. А в январе 2009 года компания Sensory Networks объявила, что перестаёт заниматься этим проектом и полностью передала все права dspam-сообществу.

Про настройку, обучение и работу с dspam-ом есть много статей, я хочу написать об изменениях, которыми пользуюсь я для связки dspam-а и CGP.

Работая с почтовым сервером CGP, я решил попробовать dspam. У CGP есть удобный механизм написания helper-ов. Программ-помощников, которые умеют получать на вход содержимое сообщения, а на выход выдавать свой вердикт. Письмо можно принять, отвергнуть или добавить в него служебный заголовок. Вот я и решил использовать helper, что бы добавлять в сообщения заголовки с результатами анализа сообщения dspam-ом.

Как выяснилось, dspam не умеет выдавать результат анализа сообщения в виде коротких заголовков. Он или работает в режиме LMTP, когда принимает сообщение, анализирует, добавляет заголовки и передаёт сообщение дальше локальному DeliveryAgent-у. Или умеет измененное сообщение с заголовками возвращать на stdout обратно. Всё это не очень удобно для работы из helperCGP. Потому я сделал не большой патч к dspam-у, который переводит его в режим «возврата только заголовков». И написал dspam-cgp.c helper для CGP.

Для запуска dspam-а для CGP надо:

  1. Взять свежий dspam из git репозитория.
  2. Пропатчить dspam. dspam_addheader.patch включает в dspam-е вывод только заголовков:
    $ cd ./dspam
    $ patch -p2 < ../dspam_addheader.patch
  3. Собрать dspam:
    ./autogen.sh
    ./configure \
    --enable-daemon  \
    --enable-syslog \
    --with-storage-driver=mysql_drv \
    --with-mysql-includes=/usr/include/mysql \
    --enable-long-usernames
  4. Сконфигурить 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
  5. Я использую одну общую базу для всех ящиков. Общий пользователь у меня: nobody. Для этого надо положить в Home dspam-а файл group вот такого содержания (для моего конфига в /usr/local/var/dspam/group):
    nobody:shared:*
  6. Запустить 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"
  7. Собрать 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
  8. Сделать и запустить хелпер 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
  9. Настроить правило для CGP, что бы оно все сообщения отправляло в этот фильтр. Так как для анализа не требуется всё сообщение, на проверку отправляется только первые 256 килобайт сообщения. Потому в правиле для CGP можно не ограничивать размер обрабатываемых сообщений. Смотри параметр -S в dspam-cgp.
  10. Далее наблюдаем за результатами работы антиспама и обучаем его рекомендуемыми способами. Их можно поискать в документации или воспользоваться мировым опытом в интернете.
  11. Смотреть статику можно так:
    # 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-у.

Один комментарий на запись “DSPAM для CGP в режиме добавления заголовков”

  1. kocmuk.ru пишет:

    Обновление до версии 1.0.7

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


Антиспам-картинка