当前位置: 主页 > 服务器技术 > Mail服务器 > 反病毒反垃圾邮件系统构建

反病毒反垃圾邮件系统构建

时间:2009-9-23来源:互联网 点击:


三、防垃圾邮件部分

垃圾邮件的防范必须掌握好尺度,postfix本身提供了header_check、body_check、access、classes等方式来拒绝邮件,可以参考如下地址的样例,结合自己的情况进行修改也能阻止一部分垃圾邮件:

http://www.securitysage.com/guides/postfix_uce_header.html
http://www.securitysage.com/guides/postfix_uce_body.html
http://www.securitysage.com/guides/postfix_uce_access.html
http://www.securitysage.com/guides/postfix_uce_class.html

不过以上配置文件需要管理员根据自己情况手工进行修改,如果直接采用的话,那么国内很多邮件你将收不到。
SpamAssassin和AMaViS可以很好的结合,它能够帮管理员自动处理一些垃圾邮件。SpamAssassin很有趣,它对解码后的邮件进行扫描后打分,如果分数达到用户指定的分数,那么就认为是垃圾邮件,而且它还有学习功能,管理员也可以自己重新定义各种分值或自定义分值。

1、SpamAssassin的安装

由于已经安装了AMaViS,所以自然就选择了SpamAssassin。SpamAssassin可以通过CPAN安装:

# perl -MCPAN -e shell
install Mail::SpamAssassin

2、SpamAssassin配置

创建/var/lib/amavis/.spamassassin/user_prefs文件:

# SpamAssassin config file for version 2.5x
# generated by http://www.yrex.com/spam/spamconfig.php (version 1.01)

# How many hits before a message is considered spam.
required_hits           5.0

# Whether to change the subject of suspected spam
rewrite_subject         1

# Text to prepend to subject if rewrite_subject is used
subject_tag             *****SPAM*****

# Encapsulate spam in an attachment
report_safe             1

# Use terse version of the spam report
use_terse_report        0

# Enable the Bayes system
use_bayes               1

# Enable Bayes auto-learning
auto_learn              1

# Enable or disable network checks
skip_rbl_checks         1
use_razor2              0
use_dcc                 0
use_pyzor               0

# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - chinese english 
ok_languages            zh en 

# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales              en zh

SpamAssassin的打分标准见http://spamassassin.org/tests.html,默认的标准可能并不适合我们,比如SUBJ_FULL_OF_8BITS有4分多,这个比较容易误伤友军,应该降低该分值。只需在配置文件里加上:

score           SUBJ_FULL_OF_8BITS      2

那么SUBJ_FULL_OF_8BITS就只能评2分了。很多垃圾邮件内容都会有免费什么什么的,所以免费可以作为关键字,打上较高分数:

body        CH_FREE        /免费/
describe    CH_FREE        Contain Chinese Free
score        CH_FREE        3.0

建立Bayes学习知识库:

# cd /var/lib/amavis/.spamassassin
# /usr/local/bin/sa-learn --rebuild -D -p user_prefs

以后spamassassin会自动学习更新。

3、amavis相关配置

修改/etc/amavis/amavisd.conf文件启用ANTI-SPAM功能:

# @bypass_spam_checks_acl  = qw( . );

运行amavisd debug,看到有如下的信息,说明ANTI-SPAM的功能已经打开了:

Jul 17 02:35:46 debian amavisd[3082]: ANTI-SPAM  code        loaded
Jul 17 02:35:46 debian amavisd[3082]: SpamControl: initializing Mail::SpamAssassin
Jul 17 02:35:47 debian amavisd[3082]: SpamControl: done

/etc/amavis/amavisd.conf配置文件里的$final_spam_destiny决定了对垃圾邮件的处理,是拒绝、丢弃还是通过。

也许你还需要好好调整amavisd.conf配置文件,比如发现垃圾邮件和病毒邮件的时候是否给管理员发送提醒邮件等等,每个选项上面都有详细的描述。

在一个十多个邮件用户的真实环境里,spamassassin一天大概能挡下四、五十封垃圾邮件,而且正确率非常高,在98%以上。病毒邮件比较少,但是正确率100%,包括邮件用户给其他人员发木马等软件,都会被挡下来,所以内部邮件用户要发送此类邮件必须使用加密或者压缩后加口令。

四、邮件列表

1、mailman的安装

一直听说mailman不错,于是就选用了,结果问题多多,花了很长时间才解决。

首先在apt安装的时候就有问题,mailman一定要关联apache,由于系统本身有自己编译的apache,所以导致安装不成功。没办法只能手工编译,手工编译得确定有mailman的用户和组,而且需要python2.1-dev,源码包里有INSTALL和README.POSTFIX两个帮助文件一定要好好看看。

# apt-get install python2.1-dev
# wget http://heanet.dl.sourceforge.net/sourceforge/mailman/mailman-2.1.2.tgz
# tar xzf mailman-2.1.2.tgz
# mkdir /usr/local/mailman
# chmod 02775 /usr/local/mailman
# cd mailman-2.1.2
# ./configure --prefix=/usr/local/mailman --with-mail-gid=mailman

安装完后检查权限:

# /usr/local/mailman/bin/check_perm

加上-f参数可以修复。安装很方便,可是和虚拟域的postfix结合还是比较折腾人的,直接使用虚拟域如test.org就会带来麻烦,它会查找虚拟域的用户,所以会报unknown user的错误。

2、mailman的配置

加上mailman的cron:

# cd /usr/local/mailman/cron
# crontab -u mailman crontab.in

把mailman加到启动组里:

# cp scripts/mailman /etc/init.d/mailman
# update-rc.d mailman defaults

修改/usr/local/mailman/Mailman/mm_cfg.py,加上:

DEFAULT_EMAIL_HOST = ‘lists.test.org‘
MTA = ‘Postfix‘
POSTFIX_STYLE_VIRTUAL_DOMAINS = [‘lists.test.org‘, ‘test.org‘]

可以试着添加一个邮件列表:

# /usr/local/mailman/bin/newlist mailman

把用户添加到邮件列表里测试一些,建一个文本文件,比如members.txt,一行一个邮件地址,然后执行如下命令就可以了:

# /usr/local/mailman/bin/add_members -n members.txt mailman

3、postfix相关配置

还需要修改postfix的配置文件才能使mailman工作正常,修改main.cf,加上:

owner_request_special = no
recipient_delimiter = +
unknown_local_recipient_reject_code = 550

修改alias_maps和virtual_maps为:

alias_maps            = hash:/usr/local/mailman/data/aliases,
                        mysql:/etc/postfix/mysql-aliases.cf
virtual_maps          = hash:/usr/local/mailman/data/virtual-mailman,
                        mysql:/etc/postfix/mysql-virtual.cf

单单这样还是不行的,我测试还需要把main.cf里myorigin改为:

myorigin = lists.test.org

然后在transport表里添加一个记录:

insert into transport set domain=‘lists.test.org‘,destination=‘local:‘;

重启postfix和mailman,现在可以试试给mailman这个邮件列表发邮件是否都正常了?

4、python处理中文的问题

如果邮件都是中文gb2312编码的就有问题,查看/usr/local/mailman/logs/error会发现如下的错误:

Jul 16 17:40:09 2003 (392) Uncaught runner exception: unknown encoding
Jul 16 17:40:10 2003 (392) Traceback (most recent call last):
  File "/usr/local/mailman/Mailman/Queue/Runner.py", line 105, in _oneloop
    self._onefile(msg, msgdata)
  File "/usr/local/mailman/Mailman/Queue/Runner.py", line 155, in _onefile
    keepqueued = self._dispose(mlist, msg, msgdata)
  File "/usr/local/mailman/Mailman/Queue/IncomingRunner.py", line 130, in _dispose
    more = self._dopipeline(mlist, msg, msgdata, pipeline)
  File "/usr/local/mailman/Mailman/Queue/IncomingRunner.py", line 153, in _dopipeline
    sys.modules[modname].process(mlist, msg, msgdata)
  File "/usr/local/mailman/Mailman/Handlers/CookHeaders.py", line 75, in process
    prefix_subject(mlist, msg, msgdata)
  File "/usr/local/mailman/Mailman/Handlers/CookHeaders.py", line 262, in prefix_subject
    h.append(s, c)
  File "/usr/local/mailman/pythonlib/email/Header.py", line 285, in append
    s = s.encode(outcodec, errors)
LookupError: unknown encoding

Jul 16 17:40:10 2003 (392) SHUNTING: 1058348408.892736+4539457d44c4477c6393b0b8b9916993b6084898

这是由于python不支持gb2312的缘故!在linuxforum找到一篇关于如何使python支持gb2312的文章:

http://www.linuxforum.net/forum/showflat.php?Cat=&Board=python&Number=427317&page=0&view=collapsed&sb=5&o=&fpart=

我就用了作者提供的http://bbs1.nju.edu.cn/file/gb2312.rar,其实它也是从http://sourceforge.net/projects/python-codecs/来的。把gb2312目录的gb2312.py文件拷贝到/usr/lib/python2.1/encodings/目录下,chinesecn目录也拷贝到该目录下,然后修改/usr/lib/python2.1/encodings/aliases.py文件,在最后的}前加上:

    # gb2321_cn codec
    ‘gb2312‘: ‘gb2312‘,

然后再次发送中文邮件给邮件列表,发现邮件列表就能够正常转发了。

5、邮件列表的配置

Default.py和mm_cfg.py的配置是针对全局的,对全局配置文件的修改不会影响到已经存在的邮件列表。mailman提供了config_list这个命令来对单个邮件列表进行配置,先导出该邮件列表的配置:

# /usr/local/mailman/bin/config_list -o /tmp/config mailman

然后修改/tmp/config文件,里面有很多选项,可以根据自己的要求修改,比如加上回复到邮件列表的邮件头、去掉mailman自动加的边脚等等,最后把这个配置文件导回给邮件列表就可以了:

# /usr/local/mailman/bin/config_list -i /tmp/config mailman

习惯了发现mailman配起来也是蛮简单的。

五、其它事项

1、courier-pop

有一个值得注意的问题,如果不小心/etc/init.d/courier-pop stop以后,再start起来,有时候会发现不能登陆pop,日志会提示:

courierpop3login: chdir: No such file or directory

这应该是一个bug,courierpop3login好像使用了工作目录,只需退到根目录再start启动就没有问题。感谢scz的提醒。

2、Debian的ENC增强位

Debian默认设置/proc/sys/net/ipv4/tcp_ecn=1,这样在TCP握手时发的syn包ecn置位,对于一些严格的防火墙来说这不是syn包,所以拒绝和你建立连接。只需置零就可以了:

echo 1 > /proc/sys/net/ipv4/tcp_ecn

如果希望重启也不置位,那么在/etc/sysctl.conf里加上:

net/ipv4/tcp_ecn=0

3、邮箱别名

alias表是针对本地的别名,virtual表才是针对虚拟用户的别名。比如要给san@test.org建立一个别名faint@test.org,那么写入以下的SQL语句:

insert into virtual set email=‘faint@test.org‘,destination=‘san@test.org‘;

4、地址欺骗

为了让mailman正常工作,main.cf里已经设置myorigin = lists.test.org,这使得本地用户发送邮件也使用这个域名,比如通过web发邮件在日志里就能看到from是nobody@lists.test.org,如果lists.test.org这个子域名不存在的话,那么对于一些严格的邮件服务器会拒绝接受此类邮件(postfix可以在smtpd_sender_restrictions后面加上reject_unknown_sender_domain拒绝此类邮件)。
这时可以使用postfix的masquerade_domains选项来实现地址欺骗,只需加上:

masquerade_domains = test.org

这样本地用户发送的邮件地址就使用test.org了。但有一点要注意,要屏蔽邮件列表,比如:

masquerade_exceptions = mailman, otherlist

这样邮件列表还是使用lists.test.org这个域。地址欺骗并不影响虚拟域。

参考资料:
1. http://www.marlow.dk/tech/postfix.php
2. http://lawmonkey.org/anti-spam.html
3. http://www.securitysage.com/guides/postfix_uce.html

站长资讯网
.
分页: [1] [2] [3]
TAG: 反垃圾邮件 反病毒 系统 构建
推荐内容最近更新人气排行
关于我们 | 友情链接 | 网址推荐 | 常用资讯 | 网站地图 | RSS | 留言