p3scan + DSpam 实现垃圾邮件网关

由 mshtyu 在 09-13-2004 21:28 发表:

p3scan + DSpam 实现垃圾邮件网关

【原文请参考 http://mshtyu.dns0755.net/P-Blog/bl...=3&cateID=1

垃圾邮件(Spam)是个很讨厌的东西,实际上是一些“不请自来”的电子邮件,又被称为“并未得到许可主动发送的商业邮件(Unsolicited Commercial Email -- UCE)”。想屏蔽这些垃圾邮件,Internet上提供了很多种方法,其中应用最广的就是利用“贝耶斯统计”方法的软件。由于这种算法的公开性,使用它的软件非常多,例如Foxmail就内嵌了利用这种算法的垃圾邮件处理模块。

Linux下面此类的软件包有:

SpamAssassin http://spamassassin.apache.org/index.html

DSpam http://www.nuclearelephant.com/projects/dspam/

详细的软件列表在这里: http://www.linuxlinks.com/Software/...pam/index.shtml

一些软件的对比,澳大利亚的Sam Holden写了一篇研究性的对比文章,可能对于选取何种软件包有帮助 http://sam.holden.id.au/writings/spam2/

我是个比较懒的人,喜欢看分析结果,所以看中了DSpam的cgi,尽管它的配置真是很繁琐。

由于大部分的Anti-Spam的包都是配合邮件服务器使用的,因此利用P3scan进行调用时,可能部分功能会受到限制,下面在对应的部分会提到。

【P3scan 的配置】

1. 作为root编辑/etc/p3scan/p3scan.conf,去掉 checkspam 前面的注释#,允许垃圾邮件检查;

2. 在DSpam对应的部分去掉 spamchecker 那行的注释,修改为正确的参数,我的是:

spamcheck = /usr/local/bin/dspam --user user1 --mode=teft --stdout --deliver=innocent --feature=ch,no,wh

注意 --deliver 选项,我这里用了--deliver=innocent,意思是只发送认为正常的信件,垃圾邮件将被截留,

--user 指定本次扫描时认为是作为 user1 来运行,结果会存入对应的数据库

如果你想确认效果后才采取截留的方式的话,建议使用 --deliver=innocent,spam 选项。

3. 存盘退出,别忘了重新启动 p3scan。

【DSpam 的安装】

1. 下载stable的版本,现在都已经是3.0.0了,

http://www.nuclearelephant.com/proj...am-3.0.0.tar.gz

2. 解压展开,进入对应目录

3. 编译前的配置,有个参数要注意:--with-storage-driver,DSpam使用数据库驱动,支持的数据库有

libdb4_drv: Berkeley DB4 Library

libdb3_drv: Berkeley DB3 Library

mysql_drv: MySQL Drivers

ora_drv: Oracle Drivers (BETA)

pgsql_drv: PostgreSQL Drivers (BETA)

虽然DSpam推荐使用mysql,但是缺省的参数是 sqlite_drv !我比较懒,全使用缺省参数,所以还得下sqlite、sqlite-devel 两个包。

选项的详细说明: http://www.nuclearelephant.com/projects/dspam/ README.txt

配置: ./configure [选项参数]

4. 编译、安装: make; make install

安装后,程序目录: /usr/local/bin

工作目录: /var/dspam/

数据目录: /var/dspam/data/user1

【DSpam 的配置】

看来懒的结果出来了,没有使用mysql,好多文件需要自己touch,:(

要是你用mysql的话,可以参考这个: http://www.lalkaka.com/dspam/

建立对应的目录与文件

cd /var/dspam/data/user1 <---- 与p3scan中调用dspam的--uesr参数一致

touch user1.alerts <---- spam提醒,CGI使用

touch user1.log <---- 用户日志,CGI使用

touch user1.mbox <---- spam邮件quanrantine后存放的邮箱

touch user1.mbox.size <---- 邮箱大小文件,CGI使用

touch user1.prefs <---- 用户首选项文件

touch user1.rstats <---- 用户重置前的统计信息

touch user1.sdb <---- 用户的spam_token数据库

touch user1.stats <---- 用户的统计信息

cd /var/dspam/

touch untrusted.mailer_args <---- 不信任的邮件服务器列表

touch trusted.users <---- 可信的用户列表,不在列表内的用户不能运行dspam及系列工具

编辑trusted.users,加入可以运行dspam及其工具的用户,一行一个,例如user1,apache

chown user1 -R /var/dspam

chmod 777 -R /var/dspam 修改dspam目录的所有权限,以便程序使用

【DSpam 的训练】

由于anti-spam软件需要先验概率,以便对垃圾邮件进行评判,因此我们需要大量的邮件对DSpam进行训练,生成spam、ham(正常邮件)的词汇库。

建立spam训练脚本文件:spamfeed.sh

代码:

#!/bin/sh

#spamfeed.sh

cat ${1} | dspam --mode=teft --source=corpus --class=spam --feature=chained,noise --user ${USER}

建立ham训练脚本文件:innocentfeed.sh

代码:

#!/bin/sh

#innocentfeed.sh

cat ${1} | dspam --mode=teft --source=corpus --class=innocent --feature=chained,noise --user ${USER}

训练:

假设已经有上千封垃圾邮件、正常邮件样本已经准备完毕、放在 /var/dspam/feed/目录下,注意,样本邮件是标准邮件文本,一个文件一封邮件存放,如果是linux本身,邮件文件则是一个文件存放所有邮件,可以用我自己写的一个工具来分割,见附件;

如果你找不到样本可以到 http://spamassassin.apache.org/publiccorpus/ 下载垃圾邮件样本包,但是绝大部分都是英文。

如果你想把你的windows下面的文件导出来,你可以参考我的另一篇文章。

find /var/dspam/feed/spam.dir/ -name "*" -exec ./spamfeed.sh {} ;

find /var/dspam/feed/innocent.dir/ -name "*" -exec ./innocentfeed.sh {} ;

训练完毕后,垃圾邮件和正常邮件的关键字及其统计信息已经存入对应的数据库,经过训练之后,p3scan就可以开始抓垃圾邮件了。

【DSpam的CGI】

DSpam提供了日志分析系统,通过cgi网页的方式提供,文件在源程序包的 cgi 目录下。

要CGI程序正常工作,系统还需要如下的软件包:

GD,用来生成图片的, http://www.boutell.com/gd/

freetype2,freetype字体相关, http://freetype.sourceforge.net/download.html#stable 安装完后,可能需要把freetype2的目录名改成freetype。

GD module for Perl,与Perl相关的几个GD的module,

<a href="http://www.perl.com/CPAN/modules/by-module/GD/default.htm" tar

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus