Postfix系列:防垃圾邮件:SpamAssassin: Bayes实现自动投喂垃圾邮件

tlin82大约 7 分钟LinuxPostfixMessaging邮件系统Postfixantispamspamassassin反垃圾邮件sa-learnbayes贝叶斯

前言

SpamAssassin 是一款很著名、很强大的防垃圾邮件过滤系统,更多介绍看官方Wikiopen in new window

SpamAssassin提供两个机制来过滤邮件:

  • 评分规则系统
  • 贝叶斯过滤器

正文

SpamAssassin评分系统

评分规则系统来判定、标识来邮是否是垃圾邮件,这个规则可以通过/etc/spamassassin/local.cf (CentOS分支)来自定义规则。这个规则定义了来邮满足什么特征给多少惩罚分,分数越高垃圾邮件嫌疑越大。然后根据分值高低交给Amavisd-new做动作(【丢弃】、【投递到隔离邮箱】、【标记提醒】

SpamAssassin评分将在另开一篇介绍,这里不展开。这里有一些 SpamAssassin规则解释open in new window

贝叶斯过滤器

SpamAssassin还允许管理员训练一个贝叶斯过滤器来加强垃圾邮件拦截能力。

工作方式

  1. 贝叶斯过滤器通过学习邮件样本,从样本中提取关键字(token)提高识别能力。,给来邮的邮件头打上标志位。

  2. SpamAssassin根据贝叶斯的标志位打分,如果贝叶斯标志位是spam,给惩罚分。惩罚分数值管理员根据自定义SpamAssassin规则定义。

  3. 训练和投喂方式。SpamAssassin 是通过一个sa-learn程序来学习,管理员需要投喂样本。

投喂垃圾邮件:

sa-learn --spam --mbox /path/to/spam.mbox 

投喂正常邮件:

sa-learn --ham --mbox /path/to/ham.mbox 

注意

SpamAssassin Bayes需要投喂200封垃圾邮件和200封正常邮件后才能开始工作. "The bayesian classifier can only score new messages if it already has 200 known spams and 200 known hams"

投喂方式

  • 手动投喂
  • 自动投喂(本文重点)

手动投喂

手动投喂就是通过以上命令完成。但实际步骤有点繁琐,简单说一下步骤,管理员首先需要:

  • 1、收集垃圾邮件样本。如果是从Outlook邮件客户端取样本,要把这些邮件转换成mbox邮箱格式。
  • 2、使用工具把垃圾邮件汇集到一个mbox,把正常邮件汇集到一个mbox文件。(这个工具比较难找,网上有一款PST to MBOX Converteropen in new window 试用版只能一次性转换30封。
  • 3、上传mbox文件到SpamAssassin所在主机;
  • 4、执行以上投喂指令;

自动投喂

通过以上看出,手动投喂还是比较麻烦的,每次都要把以上步骤操作一遍不能自动。自动投喂是什么效果?

  • 邮件管理员平时只要鼠标点点,用肉眼识别一下邮件,如果看到垃圾邮件就拖到指定文件夹;
  • SpamAssassin在后台自动从指定文件夹下载样本自动学习;

实现自动投喂

看看怎么实现自动投喂,如果你是使用Exchange邮箱,大致要实现几个初始配置:

  • 创建一个投喂专用邮箱,可以是Exchange邮箱,并开启IMAP/POP3;
  • 在这个邮箱下面创建两个文件夹,一个文件夹用来存放垃圾邮件,另一个正常邮件;
  • 在SpamAssassin所在主机上运行fetchmail等支持IMAP/POP3的邮件MUA客户端。
  • 在SpamAssassin所在主机上绑定两个本地用户到fetchmail里的2个mbox文件;
  • 在SpamAssassin所在主机上设置fetchmail定期从那个专用邮箱下载邮件样本;
  • 在SpamAssassin所在主机上设置sa-learn从以上两个mbox文件中学习;

以上配置看似步骤很多,但是是一次性初始配置实现自动投喂,一劳永逸。

开始


  • 创建邮箱且开启IMAP

步骤略

在我的环境和邮件路由是Exchange -> Postfix网关,因此我创建Exchange邮箱,例如quarantine@example.com。同时,这个邮箱是我部署SpamAssassin指定的目标隔离邮箱,凡是被SpamAssassin判定垃圾邮件嫌疑的都会转发到这个邮箱,因此这个邮箱会有很多垃圾邮件样本。

  • 创建邮件文件夹。

创建一个sa_spamsa_ham (文件名可以任意,尽量不用中文和一些特殊字符)

  • 在SpamAssassin安装和运行fetchmail
yum install fetchmail
  • 在SpamAssassin主机上创建两个本地用户

需要两个本地用户来绑定两个mbox来接收样本邮件,一个对应垃圾样本,一个对应正常样本;

useradd sa_spam
useradd sa_ham

创建后,可以看到/var/spool/mail/sa_spam/var/spool/mail/sa_ham 这两个文件是mbox文件,也就是用户邮箱,fetchmail下载的邮件将分别存放在这两个邮箱文件中(邮箱可以使用mailx查看)

  • 在SpamAssassin主机上配置fetchmail来下载样本

提示

fetchmail使用一个配置文件.fetchmailrc,注意:文件要在家目录下。

在接收垃圾样本的用户下

创建.fetchmailrc,并chmod 600 .fetchmailrc

[root@i ~]su - sa_spam
[sa_spam@i ~]$ cat .fetchmailrc
set daemon 300
set no bouncemail
set postmaster "postmaster@example.com"
set no spambounce
set logfile fetch_spam.log
set limit 1024000
set properties ""
defaults proto imap
poll my-email-server.example.com with proto imap
user 'quarantine@example.com' there with password 'password_for_the_exchange_mailbox' is 'sa_spam' here
smtphost localhost/10025
ssl
# 下载邮箱里的spam文件夹下所有邮件
folder sa_spam
fetchall

启动fetchmail

[sa_spam@i ~]$ fetchmail -vvvv

在接收正常样本的用户下

创建.fetchmailrc,并chmod 600 .fetchmailrc

[root@mailhost ~]su - sa_ham
[sa_spam@i ~]$ cat .fetchmailrc
set daemon 300
set no bouncemail
set postmaster "postmaster@example.com"
set no spambounce
set logfile fetch_ham.log
set properties ""
defaults proto imap
poll my-email-server.example.com with proto imap
user 'quarantine@example.com' there with password 'password_for_the_exchange_mailbox' is 'sa_ham' here

smtphost localhost/10025
ssl
# 邮箱里的sa_ham文件夹
folder sa_spam
fetchall

启动fetchmail

[sa_spam@i ~]$ fetchmail -vvvv
  • 检查fetchmail运行状况
  1. 在专用邮箱里,拖动邮件样本到指定文件夹;
  2. 使用mailx -f /var/spool/mail/sa_spam检查邮件是否下载
  3. 如果有邮件则正常,如果没有检查fetchmail日志
  • 配置crontab job定期执行sa-learn学习
[root@mailhost ~]crontab -l
#Schedule a SpamAssassin SA-Learning from local mailboxes where fetchmail from Exchange Quarntine Mailbox for details
*/1 * * * *  /usr/bin/sa-learn --username=amavis --spam --mbox /var/spool/mail/sa_learn_spam >> /var/log/sa-learn-spam.log
* */3 * * *  /usr/bin/sa-learn --username=amavis --ham --mbox /var/spool/mail/sa_learn_ham >> /var/log/sa-learn-ham.log
*/30 * * * *  /usr/bin/sa-learn --username=amavis --sync

#Schedule mailbox purge on the local mailboxes used for sa-learning to free local storage space.
@weekly > /var/spool/mail/root
@monthly > /var/spool/mail/sa_learn_spam
@monthly > /var/spool/mail/sa_learn_ham

扩展:Fetchmail学习

从以上配置看出,整个过程关键部分就是fetchmail的配置最为关键。 因此有必要多了解一下fetchmail的使用。

How fetchmail works

Fetchmail可以在Linux Terminal实现邮件接收和发送,实现:

  • 从外部邮箱服务器,例如Gmail/Office365等支持IMAP/POP3下载邮件;
  • 把下载后的邮件绑定到Linux本地用户,实现方法是先使用IMAP/POP3接收协议下载,然后通过本地smtp(Mail Delivery Agent),例如PostfixSendmail发给本地用户;

配置Fetchmailrc

fetchmail默认使用一个配置文件.fetchmailrc,具体使用可以参考: https://calomel.org/fetchmailrc.htmlopen in new window

Fetchmail排错

  • 在fetchmailrc配置中使用logfile指定日志文件,查看日志根据具体错误进行排查;
  • 一般可能是参数使用或配置错误,例如IMAP邮箱用户名或密码弄错;

其他

注意邮箱清理,大量且长期下载邮件可能会造成磁盘空间爆满。可使用cron任务定期清理:

@monthly > /var/spool/mail/sa_learn_spam