were21 发表于 2014-12-17 08:24:39

Postfix邮箱(四):安装Cyrus-SASL使Postfix支持SMTP认证

说明:Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息;

      本节后面将讲解Postfix自带的限制、过滤功能。

一、安装配置Cyrus-SASL
1、系统已默认安装Cyrus-SASL:

1
2
3
4
5
6
# 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

1
2
3
4
5
6
7
8
# 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
# chmod 755 /usr/local/var/spool/authdaemon




说明:有的系统authdaemond路径为/var/spool/authdaemon/socket。

3、配置postfix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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





1
# service postfix restart




说明:以上限制方式是postfix自带的一种访问限制方式,下文会详细说明。

4、测试SMTP认证
    使用MIME::Base64将邮箱账号和密码进行Base64编码:

1
2
3
4
# perl -e 'use MIME::Base64; print encode_base64("postmaster@yourmail.com")'
cG9zdG1hc3RlckB5b3VybWFpbC5jb20=
# perl -e 'use MIME::Base64; print encode_base64("extmail")'
ZXh0bWFpbA==




    本地测试需要安装telnet工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# yum install -y telnet
# 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)使用举例
    设置访问表限制:

1
2
3
4
# 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_recipien_restrictions = check_recipien_access hash:/etc/postfix/recipien_access




    创建访问表

1
2
3
4
5
6
7
# vi /etc/postfix/client_access
10.188REJECT
192.168.1.100 REJECT
# vi /etc/postfix/sender_access
user@example.com
marketing@
abc.example.com




    转化为数据库格式 (只要修改了访问表都要进行转化)

1
2
# postmap /etc/postfix/client_access
# postmap /etc/postfix/sender_access





2、内置限制条件

[*]permit_auth_destination
    放行mydestinationinet_interfaces irtual_alias_maps irtual_mailbox_mapselay_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进行简单的病毒过滤

1
/name ?="?.*.(bat|scr|com|dll|exe|hta|pif|vbs)"?/REJECT




    运用body_checks进行内容过滤

1
2
3
4
/increase your sales by /   REJECT
/in compliance (with|of) strict/REJECT
/lowest rates.*!/REJECT
/[:alpha:][:alpha:]/ REJECT




      第三个模式挑出任何含有lowest rates字样且其后跟着任何文字和!的字符串
      最后一个模式检查是否有HTML注释嵌在字句中间
      最好是使用外部内容过滤器spamassassin或DSPAM
   上图是SMTP对话过程以及各阶段对应的限制条件。

页: [1]
查看完整版本: Postfix邮箱(四):安装Cyrus-SASL使Postfix支持SMTP认证