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

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 не добавляется. Он слишком большой и неудобный для добавления.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

По теме:

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



Anti-spam image