热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Postfix邮件服务器上反垃圾邮件的方法

在介绍如何配置Postfix的smtp配置之前有必要首先介绍一下它的背景和特点。Postfix是一个由IBM资助下由WietseVenema负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。Postfix力图做到快速、易于管理、提供尽可能的安全

       在介绍如何配置Postfix的smtp配置之前有必要首先介绍一下它的背景和特点。Postfix是一个由IBM资助下由Wietse Venema 负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。Postfix力图做到快速、易于管理、提供尽可能的安全性 ,同时尽量做到和sendmail邮件服务器保持兼容性以满足用户的使用习惯。起初,Postfix是以VMailer这个名字发布的,后来由于商标上的原因改名为Postfix。

Postfix是一个非常优秀的MTA,她素以高效、安全的特点而著称。Postfix是作者在UNIX上所见过的MTA中在反垃圾邮件(Anti-Spam或Anti-UCE)方面做得最好的一个,甚至有很多公司在Postfix代码的基础上进行二次开发而推出反垃圾邮件网关产品。MTA的反垃圾邮件功能,实际上就是在MTA处理过程中对会话进行过滤。这个过滤不但过滤了发往自身的垃圾邮件,而且还防止了自身被恶意利用发送垃圾邮件。Postfix实现了目前所有主要的MTA过滤技术。postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。和Sendmail相比Postfix更快、更容易管理、更灵活、更安全,同时还与sendmail保持足够的兼容性。

在Postfix中反垃圾邮件大致有四个方法, smtp认证、逆向域名解析、黑名单过滤和内容过滤。

一、Smtp认证

1、在邮件传送代理(Mail Transport Agent,MTA)上对来自本地网络以外的互联网的发信用户进行SMTP认证,仅允许通过认证的用户(我的理解是登陆的用户)进行远程转发。这样既能够有效避免邮件传送代理服务器为垃圾邮件发送者所利用,又为出差在外或在家工作的员工提供了便利。

2、如果不采取SMTP认证,则在不牺牲安全的前提下,设立面向互联网的Web邮件网关也是可行的。

3、如果SMTP服务和POP3服务集成在同一服务器上,在用户试图发信之前对其进行POP3访问验证(POP before SMTP)就是一种更加安全的方法。

4、带smtp认证的postfix配置:Postfix能限制哪个主机允许通过自身转发邮件,并且支持限定什么邮件允许接进。Postfix实现通常的控制功能:黑名单列表、RBL查找、HELO/发送者DNS核实。基于内容过滤当前没有实现。 表查看: Postfix没有实现地址重写语言,而是使用了一种扩展的表查看来实现地址重写功能。表可以是本地 dbm或 db文件等格式。 
好,下面就来看看具体的配置过程: 
版本 
redhat 6.2 
cyrus-sasl-1.5.24 
snapshot-20010329 
下载:http://ftp.cnuol.com

步骤:

1). 安装sasl 
#./configure --enable-login --with-pwcheck;make;make install 
#echo /usr/local/lib>>/etc/ld.so.conf 
#echo /usr/local/lib/sasl >> /etc/ld.so.conf 
# ldconfig 
2).安装postfix 
# make tidy 
# make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include" / 
AUXLIBS="-L/usr/local/lib -lsasl" 
# make 
# adduser -s /bin/false postfix 
# make install 
3).修改postfix的cf文件使支持smtp认证 
在/etc/postfix/main.cf文件最后加上: 
smtpd_sasl_auth_enable = yes 
smtpd_delay_reject=yes 
smtpd_recipient_restrictiOns= permit_mynetworks permit_sasl_authenticated permit_auth_destination reject 
smtpd_client_restrictiOns= permit_sasl_authenticated 
broken_sasl_auth_clients = yes 
smtpd_sasl_security_optiOns= noanonymous 
这样用户的postfix就支持smtp认证了。Postfix其余的配置请参考/etc/postfix/main.cf.default和sample-*文件,这里不多说了。 
现在telnet 25口应该有下面的提示 
telnet 127.0.0.1 25 
Trying 127.0.0.1... 
Connected to 127.0.0.1. 
Escape character is '^]'. 
220 mailx.bjcnuol.com ESMTP Postfix 
ehlo 127.0.0.1 
250-mailx.bjcnuol.com 
250-PIPELINING 
250-SIZE 10240000 
250-ETRN 
250-AUTH LOGIN PLAIN 
250-AUTH=LOGIN PLAIN 
如果有就差不多成功了。 
4).配置sasl使支持smtp认证 
# touch /usr/local/lib/sasl/smtpd.conf 
# echo pwcheck_method:shadow >> /usr/local/lib/sasl/smtpd.conf 
5).设置口令文件权限 
因为postfix用户无权读取/etc/shadow所以必须把shadow文件的权限改成postfix,这不能不说是一个缺陷,如果你觉得不安全,你可以将认证方式该为sasldb的方式,但是这样需要额外创建用户和口令不能和邮件用户的口令保持一致修改口令也不方便。此外还可以用pwcheck守护进程,但我没试出来感兴趣的朋友可以试试,如果成功了别忘了告诉我。 
6).配置OE5 
1.打开你的Outlook Express,修改你的账号属性,在服务器选项,选取我的smtp服务器需要认证选项, 然后进入配置。 
2.不要选取安全口令认证,sendmail并不支持这个选项。是选取使用pop3同样的口令还是选择另外输入用户密码,这就看你的爱好和设置了,这不是关键。如果你在服务器上有一个真实账号,不妨选取使用同样的口令,如果没有账号,选用其他的用户口令同样可以。 
7).启动和关闭postfix  
启动 
postfix start 
关闭 
postfix stop 
你可以把postfix start放到/etc/rc.d/rc.local文件的最后用来每次重起后自动启动postfix

二、逆向域名解析

无论哪一种认证,其目的都是避免邮件传送代理服务器被垃圾邮件发送者所利用,但对于发送到本地的垃圾邮件仍然无可奈何。要解决这个问题,最简单有效的方法是对发送者的IP地址进行逆向名字解析。

1、  通过DNS查询来判断发送者的IP与其声称的名字是否一致。例如,其声称的名字为mx.hotmail.com,而其连接地址为20.200.200.200,与其DNS记录(我的理解:这个记录是否在MX中)不符,则予以拒收。这种方法可以有效过滤掉来自动态IP的垃圾邮件,对于某些使用动态域名的发送者,也可以根据实际情况进行屏蔽。

2、  但是上面这种方法对于借助Open Relay的垃圾邮件依然无效。对此,更进一步的技术是假设合法的用户只使用本域具有合法互联网名称的邮件传送代理服务器发送电子邮件。例如,若发件人的邮件地址为someone@yahoo.com,则其使用的邮件传送代理服务器的Internet名字应具有yahoo.com 的后缀。这种限制并不符合SMTP协议,但在多数情况下是切实有效的。需要指出的是,逆向名字解析需要进行大量的DNS查询。(即对发件人的邮件地址后缀进行检查)。

三、黑名单过滤

以上介绍的防范措施对使用自身合法域名的垃圾邮件仍然无效。对此比较有效的方法就是使用黑名单服务了。黑名单服务是基于用户投诉和采样积累而建立的、由域名或IP组成的数据库,最著名的是RBL、DCC和Razor等,这些数据库保存了频繁发送垃圾邮件的主机名字或IP地址,供MTA进行实时查询以决定是否拒收相应的邮件。但是,目前各种黑名单数据库难以保证其正确性和及时性。例如,北美的RBL和DCC包含了我国大量的主机名字和IP地址,其中有些是早期的Open Relay造成的,有些则是由于误报造成的。但这些迟迟得不到纠正,在一定程度上阻碍了我国与北美地区的邮件联系,也妨碍了我国的用户使用这些黑名单服务。

Postfix 邮件服务器中应用 RBL 的设置方法:

RBL-采用的是DNS方式的实时黑名单技术,在Postfix中都使用RBL参数来配置。Postfix1.x和Postfix 2.x在使用RBL的 配置上是不同的。

Postfix 1.x: 
要先用maps_rbl_domains来定义RBL表: maps_rbl_domains = rbl.anti-spam.cn 
然后在过滤条件中(如smtpd_recipient_restrictions )使用reject_maps_rbl来拒绝黑名单连接: 
smtpd_recipient_restrictiOns= ... reject_maps_rbl,...

Postfix 2.x:

直接在过滤条件中(如smtpd_recipient_restrictions )使用reject_rbl_client来拒绝黑名单连接: 
smtpd_recipient_restrictions =... 
reject_rbl_client rbl.anti-spam.cn,... 
如果您想先测试一下RBL服务是否工作正常,可以在reject_maps_rbl指令和reject_rbl_client指令前加上 warning_if_reject来改变默认的拒绝动作为警告(警告信息会在邮件日志中看到)。等确认工作正常后再去掉警告指令。

四、内容过滤

即使使用了前面诸多环节中的技术,仍然会有相当一部分垃圾邮件漏网。对此情况,目前最有效的方法是基于邮件标题或正文的内容过滤。其中比较简单的方法是,结合内容扫描引擎,根据垃圾邮件的常用标题语、垃圾邮件受益者的姓名、电话号码、Web地址等信息进行过滤。

更加复杂但同时更具智能性的方法是,基于贝叶斯概率理论的统计方法所进行的内容过滤,该算法最早由Paul Graham提出(http://www.paulgraham.com/spam.html),并使用他自己设计的Arc语言实现。这种方法的理论基础是通过对大量垃圾邮件中常见关键词进行分析后得出其分布的统计模型,并由此推算目标邮件是垃圾邮件的可能性。这种方法具有一定的自适应、自学习能力,目前已经得到了广泛的应用。最有名的垃圾邮件内容过滤是Spamassassin,它使用Perl语言实现,集成了以上两种过滤方法,可以与当前各种主流的MTA集成使用。内容过滤是以上所有各种方法中耗费计算资源最多的,在邮件流量较大的场合,需要配合高性能服务器使用。

反垃圾邮件中,内容过滤是非常重要的部分,在Postfix中有两种内容过滤:邮件头过滤和邮件内容过滤。

1)邮件头过滤

邮件头包括邮件头部信息和MIME头信息,要使邮件头过滤生效需要在main.cf中加入:

header_checks = regexp:/etc/postfix/checks/header_checks

mime_header_checks = regexp:/etc/postfix/checks/mime_header_checks

在这里我们使用的是标准正规表示式过滤规则,规则文件中的第一行都类似于如下行:

/^HEADER: .*content_to_act_on/ ACTION MESSAGE

/^HEADER: .*content_to_act_on/是正规表示式,ACTION是对满足正规表示式时所采取的动作,MESSAGE是该规则的说明,一般用于向客户端反回信息或用户邮件日志。常用的ACTION有:

REJECT  通知Postfix弹回邮件,这样邮件在进入你的邮件服务器前便被禁止 IGNORE  通知Postfix删除满足过滤条件的那部分内容 HOLD  通知Postfix将邮件保存在邮件队列中,以便管理对之进一步处理DISCARD  通知Postfix直接删除邮件,在这种情况下,服务器不对发送者返回任何信息,以便让发送端感觉邮件已经正常发送

下面是一些有用的例子:

/^Subject: .* / REJECT Spam Header Many Spaces

/^Subject: Free Money/ REJECT Spam Free Money Mails

/^Date: 19[0-9][0-9]/ REJECT Spam past date

/name=[^>]*/.(bat|com|exe)/ REJECT Spam Executable Attachements

2)邮件内容过滤

邮件内容过滤是指邮件的正文内容过滤,它是针对邮件正文中的文字进行过滤,其规则的用法和邮件头过滤一样,为了使用邮件内容过滤需要在main.cf中加入:

body_checks = regexp:/etc/postfix/checks/body_checks

下面是几个有用的规则:

/Free Money/ REJECT Spam Free Money in Body mails

/www.disallowdsites.com/ REJECT Disallowed Sites

/Real Bad Words/ REJECT Bad Words

需要提醒的是,与邮件头过滤规则不同的,邮件内容过滤规则中的正则表示式不区分大小写。

附:访问控制列表

访问控制列表可以限制客户端对邮件服务器的访问,main.cf中常用的访问控制如下:

smtpd_client_restrictions  SMTPD客户端限制 smtpd_helo_restrictions  SMTPD标识限制 smtpd_sender_restrictions  SMTPD发送者限制 smtpd_recipient_restrictions  SMTPD接收都限制

以下是访问控制列表使用的示例:

smtpd_client_restrictiOns= check_client_access hash:/etc/postfix/checks/access_client

smtpd_helo_restrictiOns= check_client_access hash:/etc/postfix/checks/helo_client

smtpd_sender_restrictiOns= check_client_access hash:/etc/postfix/checks/sender_client

smtpd_recipient_restrictiOns= check_client_access hash:/etc/postfix/checks/recipient_client

访问控制表是一个hash表,其中每一行就是一条控制项,如下:

spammer.com  550 You can't sends mail from my server.

hacker@  550 You aren't allowed to send mail.

规则中,第一项是规则内容,第二项是对满足规则时所采取的行动,第三项是返回给客户端的信息。

其中第一条表示禁止任何spammer.com上的用户发送邮件,第二条表示禁止任何用户名为hacker的用户发送邮件。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 有关phpfgetss()函数的文章推荐10篇
    有关phpfgetss()函数的文章推荐10篇:了解如何使用PHP的各种文件函数。查看诸如fopen、fclose和feof之类的基本文件函数;了解诸如fgets、fgetss和f ... [详细]
author-avatar
michael
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有