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的名字可以设置成邮箱账号([email protected]),每个用户自己训练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
</Directory>

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 , 输入用户名口令登录。