dspam 安装学习笔记

刚接触dspam一个多星期,把安装和学习的过程记录下来。不对的地方请多指教。

本文最初发表于 http://hi.baidu.com/delphiss/blog/item/24da4611395c33fac3ce79c3.html 转载请注明出处 作者:wdy

一、 安装

下载 dspam-3.8.0.tar.gz #./configure \ –with-dspam-home=/var/dspam \ –with-dspam-home-owner=vmail \ –with-dspam-home-group=postdrop \ –with-dspam-mode=2510 \ –with-dspam-owner=vmail \ –with-dspam-group=postfix \ –with-delivery-agent=/usr/sbin/sendmail \ –with-storage-driver=mysql_drv \ –with-mysql-includes=/usr/include/mysql \ –with-mysql-libraries=/usr/lib/mysql \ –enable-preferences-extension \ –enable-virtual-users \ –enable-daemon \ –enable-debug \ –enable-syslog \ –enable-clamav \ –with-logdir=/var/log/dspam

#make #make install –with-storage-driver: 存储垃圾邮件识别数据用的存储器类型,这里用了mysql,其他类型请查询安装文档。 –with-dspam-home-owner 和 –with-dspam-owner 直接用了maildrop投递邮件的用户vmail,也可以单独建一个用户。 –enable-virtual-users 启用虚拟user,与unix系统用户分离。 –with-dspam-home:存储user和一些配置信息的路径。

创建mysql的库和表。

# cd src/tools.mysql_drv # mysql -u root -p -e “create database dspam” # mysql -u root -p -e “grant all on dspam.* to dspam@localhost identified by ‘passwd123456’”

给 mysql_objects-4.1.sql 和 virtual_users.sql 增加一行内容到最上面: use dspam;

# mysql -u dspam -p < mysql_objects-4.1.sql # mysql -u dspam -p < virtual_users.sql

二、配置

安装后dspam的配置文件为 /usr/local/etc/dspam.conf,修改之

TrustedDeliveryAgent    /usr/sbin/sendmail Trust root Trust vmail Trust postfix

# spamAction 表示识别为垃圾邮件后的处理,quarantine:扔到隔离区,tag:给邮件Subject增加标记,deliver:直接投递 # quarantine 需要设置 QuarantineAgent Preference “spamAction=tag” # spamSubject tag操作的时候给邮件Subject前面增加的字符 Preference “spamSubject=SPAM” #signatureLocation: dspam给每个识别后的邮件编个号码,将来可以用作重新训练 #’message’: 把signature加在邮件正文后面,’headers’:把signature加在邮件头里 Preference “signatureLocation=headers” # ‘message’ or ‘headers’ Preference “showFactors=on”

# mysql的设置 MySQLServer             /var/lib/mysql/mysql.sock MySQLUser               dspam MySQLPass               passwd123456 MySQLDb                 dspam MySQLCompress           true

启动 dspam 后台进程: #/usr/local/bin/dspam –daemon &

三、原理

先说明一一下dspam的基本原理和一个非常重要的概念:user。

dspam刚安装完成的时候,还不能识别垃圾邮件,因为没训练它。对它的训练,就是喂给他一些邮件,并注明是垃圾邮件还是不是垃圾邮件。dspam把垃圾或非垃圾邮件的特征存储下来,以备后面识别使用。

当dspam开始上岗工作的时候,它从标准输入里读取邮件内容,根据之前识别的数据和一些算法来确定邮件是否是spam,然后根据配置文件进行下一步的操作(给邮件打标记或扔到隔离区等)。

现在问题来了,如果一个用户总是把某些邮件训练为垃圾邮件,而另外一些用户不认为是垃圾邮件,就会造成识别混乱。所以dspam在训练或识别的时 候,都需要加一个参数 user ,通过 不同的 user 参数,把不用的用户的特征数据分开。设置 –enable-virtual-users后, user 参数只是一个字符符号,可以任意来取,不和系统账号或邮件账号必然对应。

下面的问题:怎么设定user?

基本的就两种方式: 1. 每个邮箱账号对应一个训练和识别user,user的名字可以设置成邮箱账号(user@domain.com),每个用户自己训练dspam识别垃圾邮件。 2. 系统使用一个全局固定的user,由管理员来训练识别垃圾邮件,这个全局user来为所有的邮箱账号服务。

上面的方案各有利弊。 方案1优点是用户自己训练邮件,不会造成有异议识别,缺点就是每个用户得自己亲自来训练。如果用户账号数目很多,n多的user管理也是个麻烦事。 方案2的优点是用户不必自己训练了,由管理员代劳,但可能会造成误识别。比如管理员认为某邮件是垃圾邮件,而一些用户则认为不是。

如果确定使用方案1,可以加上参数 –enable-domain-scale,这样user的数据可以存储为 $HOME/data/domain.com/user,否则就是 $HOME/data/user。

本文后面用是方案2。

四、训练识别

比如我们手头有个垃圾邮件的样本: spam01.eml,可以这样训练它

cat spam01.eml /usr/local/bin/dspam –mode=teft –source=corpus –class=spam –feature=noise –user mydspam

--class=spam 表示训练识别垃圾邮件,训练识别非垃圾邮件则用参数 –class=innocent –source=corpus 与 –source=error 对应的设置 –user mydspam 训练的user,dspam会自动创建。

dspam提供了一个批量训练邮件的命令:

dspam_train [username] [spam_dir] [nonspam_dir]

username 是训练用的user,spam_dir 和 nonspam_dir 是垃圾邮件和非垃圾邮件存储的目录。目录下每个邮件一个文件。

五、postfix的配置

修改master.cf 加上:

dspam   unix    -       n       n       -       10      pipe flags=Rhqu user=vmail argv=/usr/local/bin/dspam –deliver=innocent –user mydspam -i -f $sender – $recipient

dspam就是用来识别处理垃圾邮件的transport, –user mydspam 是识别邮件的user。如果采用方案1,那么有可能就是 –user $user 或 –user $recipient。 –deliver=innocent 表示对非垃圾邮件进行投递。 -f $sender – $recipient 告诉dspam发信人和收信人地址。

交给dspam的邮件,dspam先根据 user 参数取出之前训练产生的特征数据进行识别,识别后会调用 /usr/sbin/sendmail 再送给postfix,postfix则会交给maildrop等mda将邮件投入邮箱。

main.cf 需要增加: dspam_destination_recipient_limit = 1

下面一个问题:在哪个环节让postfix来识别处理垃圾邮件?

postfix灵活的结构可以设置在n个地方进行垃圾邮件的过滤,比如 给smtpd 增加参数:-o content_filter=dspam: 等等,这里用下面的一种方式。

修改 main.cf: smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, check_client_access pcre:/etc/postfix/dspam_filter_access

check_client_access 将根据smtp客户端host和ip进行过滤判别。 permit_sasl_authenticated permit_mynetworks 避免了对SMPT用户认证通过的和mynetworks的客户端的垃圾邮件识别。

# vi /etc/postfix/dspam_filter_access /./     FILTER dspam:dspam

/./ 是个正则表达式,表示匹配所有主机和ip。

通过maillog可以看到dspam的工作情况。 dspam会给经手的邮件头部加上自己的信息。 X-DSPAM-Result: Spam 表示此封邮件为 spam X-DSPAM-Result: Innocent 表示此封邮件为 nonspam

六、配置DSPAM Web Control

DSPAM Web Control 的功能是让dspam的user设置个人参数,查看识别邮件记录,还可以重新训练识别错误的邮件。 Web Control的用户通过Apache的HTTP Auth来登录,所以要把dspam user加到AuthUserFile里。 (前面提到的方案1在这里会有很大的问题)

#mkdir /var/www/cgi-bin/dspam #cp -R webui/cgi-bin/* /var/www/cgi-bin/dspam/ #cp webui/htdocs/base.css /var/www/htdocs/ #cp webui/htdocs/dspam-logo-small.gif /var/www/htdocs/ #chown -R vmail.vmail /var/www/cgi-bin/dspam/

base.css 和 dspam-logo-small.gif 拷贝到apache的 DocumentRoot

创建apache http auth 用户 #/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/dspam.pass mydspam

设置管理员用户名: echo “mydspam” > /var/www/cgi-bin/dspam/admins 修改 Apache httpd.conf <Directory “/var/www/cgi-bin/dspam”> Options ExecCGI Options -Indexes DirectoryIndex dspam.cgi AllowOverride All Order deny,allow Deny from all AuthType Basic AuthName “DSPAM Control Center” AuthUserFile /usr/local/apache2/dspam.pass Require valid-user Satisfy Any

ScriptAlias /dspam /var/www/cgi-bin/dspam

Web Control 生成图形需要用到Perl的几个图形模块: GD::Graph::bars, GD, GD::Graph, GD::Text::Align,请安装。

修改 /var/www/cgi-bin/dspam/configure.pl

$CONFIG{‘DSPAM_HOME’}   = “/var/dspam”; $CONFIG{‘DSPAM_BIN’}    = “/usr/local/bin”; $CONFIG{‘LOCAL_DOMAIN’} = “yourdomain.com”;

#下面两个根据编译参数修改 #$CONFIG{‘LARGE_SCALE’} = 0; #$CONFIG{‘DOMAIN_SCALE’} = 0; 打开网页 http://host/dspam/dspam.cgi , 输入用户名口令登录。