说明:Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息;
本节后面将讲解Postfix自带的限制、过滤功能。
一、安装配置Cyrus-SASL
1、系统已默认安装Cyrus-SASL:
[root@mail ~]# rpm -aq|grep cyrus-sasl cyrus-sasl-gssapi-2.1.23-13.el6_3.1.x86_64 cyrus-sasl-plain-2.1.23-13.el6_3.1.x86_64 cyrus-sasl-lib-2.1.23-13.el6_3.1.x86_64 cyrus-sasl-2.1.23-13.el6_3.1.x86_64 cyrus-sasl-md5-2.1.23-13.el6_3.1.x86_64
2、配置cyrus-sasl
[root@mail ~]# vi /etc/sasl2/smtpd.conf #pwcheck_method: saslauthd #mech_list: plain login pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/usr/local/var/spool/authdaemon/socket [root@mail ~]# chmod 755 /usr/local/var/spool/authdaemon
说明:有的系统authdaemond路径为/var/spool/authdaemon/socket。
3、配置postfix
[root@mail ~]# vi /etc/postfix/main.cf # SMTP 收件方限制 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname # SMTP 发件方限制 smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch, reject_authenticated_sender_login_mismatch, reject_unauthenticated_sender_login_mismatch # SMTP 用户登陆限制 smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf # SMTP 认证配置 broken_sasl_auth_clients = yes smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_sasl_security_options = noanonymous
[root@mail ~]# service postfix restart
说明:以上限制方式是postfix自带的一种访问限制方式,下文会详细说明。
4、测试SMTP认证
使用MIME::Base64将邮箱账号和密码进行Base64编码:
[root@mail ~]# perl -e 'use MIME::Base64; print encode_base64("postmaster\@yourmail.com")' cG9zdG1hc3RlckB5b3VybWFpbC5jb20= [root@mail ~]# perl -e 'use MIME::Base64; print encode_base64("extmail")' ZXh0bWFpbA==
本地测试需要安装telnet工具:
[root@mail ~]# yum install -y telnet [root@mail ~]# telnet localhost 25 Trying ::1... Connected to localhost. Escape character is '^]'. 220 mail.eplantstore.com ESMTP Postfix - by eplantstore.com ehlo localhost #输入hello内容 250-mail.eplantstore.com 250-PIPELINING 250-SIZE 10485760 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN #显示认证登陆表示Postfix成功 250-AUTH=PLAIN LOGIN #调用Cyrus-SASL进行SMTP认证 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth login #输入认证登陆命令 334 VXNlcm5hbWU6 cG9zdG1hc3RlckB5b3VybWFpbC5jb20= #输入账号的Base64编码 334 UGFzc3dvcmQ6 ZXh0bWFpbA== #输入密码的Base64编码 235 2.7.0 Authentication successful #显示认证成功 quit 221 2.0.0 Bye Connection closed by foreign host.
结论:以上信息表示postfix成功使用并通过SMTP认证(cyrus-sasl)
二、Postfix本身的邮件过滤
1、访问表
(1)访问表类型
check_client_access maptype:mapname
检查主机名和从属网域
192.168.1.100
10.188
check_helo_access maptype:mapname
检查HELO命令中显示的主机名
check_recipient_access maptype:mapname
检查收件地址
user@example.com
example.com
user@
check_sender_access maptype:mapname
检查发件地址
user@example.com
example.com
user@
(2)处理动作
OK
通过
REJECT
拒绝
REJECT message-text
messsage-text用来设置一条消息;
消息会连同拒收邮件一起发给客户端,并记录在log中(下同)
DUNNO
暂停检查
HOLD message-text
保留在队列中
DISCARD message-text
postfix丢弃邮件,但让客户端误以为发送成功
4.xx message-text
返回指定的拒绝码与信息给客户端,暂时拒收
5.xx message-text
返回指定的拒绝码与信息给客户端,彻底拒收
(3)使用举例
设置访问表限制:
[root@mail ~]# vi /etc/postfix/main.cf smtpd_client_restrictions = check_client_access hash:/etc/postfix/client_access smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/recipient_access
创建访问表
[root@mail ~]# vi /etc/postfix/client_access 10.188 REJECT 192.168.1.100 REJECT [root@mail ~]# vi /etc/postfix/sender_access user@example.com marketing@ abc.example.com
转化为数据库格式 (只要修改了访问表都要进行转化)
[root@mail ~]# postmap /etc/postfix/client_access [root@mail ~]# postmap /etc/postfix/sender_access
2、内置限制条件
permit_auth_destination
放行mydestination\inet_interfaces\virtual_alias_maps\virtual_mailbox_maps\relay_domain
设置的范围,不符合时返回DUNNO
permit_mynetworks
放行客户端IP位于mynetworks设置的范围
reject_unauth_destination
和第一条相反,拒绝以上所设范围
reject_invalid_hostname
HELO命令中的主机名称无效时返回501
reject_non_fqdn_hostname
HELO命令中的主机名称不是FQDN形式则返回504
reject_non_fqdn_recipient
收件地址不是FQDN则返回504
reject_non_fqdn_sender
发件地址不是FQDN则返回504
reject_unauth_pipelining
拒绝不守规定的流水线操作
reject_unknown_client
DNS查不出客户端IP的PTR记录时拒绝
reject_unknown_hostname
HELO命令中的主机名称没有A和MX记录时拒绝
reject_unknown_recipient_domain
收件人地址的网域部分查不出有效的A或MX记录时拒绝
reject_unknown_sender_domain
发件人地址的网域部分查不出有效的A或MX记录时拒绝
3、RBL实时黑名单
reject_rbl_client rblprovider.domain
客户端IP地址黑名单库
reject_rhsbl_client rblprovider.domain
客户端主机名称黑名单库
reject_rhsbl_sender rblprovider.domain
发件人黑名单库
4、内容过滤
(1)类型
header_checks = /etc/postfix/header_checks
检查标题
body_checks = /etc/postfix/body_checks
检查正文
nested_header_checks
检查附件标题
mime_header checks
检查标题的MIME字段
(2)动作
REJECT message-text
拒收
WARN message-text
不拒绝,记录message到log,可用于测试
IGNORE
删除符合模式的内容
HOLD message-text
保留到队列中
DISCARD message-text
偷偷丢弃邮件
(3)样例
运用header_checks进行简单的病毒过滤
/name ?="?.*\.(bat|scr|com|dll|exe|hta|pif|vbs)"?/ REJECT
运用body_checks进行内容过滤
/increase your sales by / REJECT /in compliance (with|of) strict/ REJECT /lowest rates.*!/ REJECT /[:alpha:]<!--.*-->[:alpha:]/ REJECT
第三个模式挑出任何含有lowest rates字样且其后跟着任何文字和!的字符串
最后一个模式检查是否有HTML注释嵌在字句中间
最好是使用外部内容过滤器spamassassin或DSPAM
上图是SMTP对话过程以及各阶段对应的限制条件。