三、高级邮件服务管理机制:
1、smtp的用户认证
现在常用的用户认证机制是sasl,默认的情况下saslauthd是安装了但是没有启动的
所以启动sasl认证
具体步骤:
①启动sasl认证
#service saslauthd start
#chkconfig saslauthd on //开机自动启动服务
在/usr/lib/sasl2/下有一个smtpd.conf文件,如果你使用的是Sendmail的话,下面是
sendmail.conf
#vim /usr/lib/sasl2/smtpd.conf
添加一下内容
pwcheck_method:saslauthd 认证方法
#service saslauthd restart
②调整/etc/postfix/main.cf文件,以便支持认证
#vim /etc/postfix/main.cf
smtpd_sasl_auth_enable=yes
smtpd_sasl_security_options=noanonymous
mynetworks = 127.0.0.1
smtpd_recipient_restrictions=
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
#service postfix reload 重新加载postfix
③验证
[root@mail ~]# telnet 192.168.1.103 25
Trying 192.168.1.103...
Connected to mail.linuxidc.com (192.168.1.103).
Escape character is '^]'.
220 mail.linuxidc.com ESMTP Postfix
EHLO mail.linuxidc.com
250-mail.linuxidc.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN //出现了认证的功能
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
接下来就是要输入发信人和接受人了
MAIL FROM:RedHat@linuxidc.com
MAIL FROM:redhat@linuxidc.com
250 2.1.0 Ok
RCPT TO:root@linuxidc.com
250 2.1.5 Ok
RCPT TO:redhat@126.com
554 5.7.1 <redhat@126.com>: Relay access denied
由上面可以看出,发送给自己域内的可以OK,而发往其他外域的就denied
但是如果这个时候我没使用
AUTH LOGIN来从新输入发件人的话输入的是通过base64编码的用户名和密码
(注:#printf "redhat" | openssl base64 或者使用echo -n "redhat" |openssl base64
就能转换格式了,然后把转换后的内容粘贴到下面的提示中,当然密码也要编码,
由于我的用户名和密码一样,所有下面的两处需要输入的地方都是一样的)
AUTH LOGIN
334 VXNlcm5hbWU6
cmVkaGF0 //通过转换成base64位的用户名
334 UGFzc3dvcmQ6
cmVkaGF0 //通过转换成base64位的密码
235 2.0.0 Authentication successful //认证成功了
然后在输入
MAIL FROM:redhat@linuxidc.com
....下面的都一样了
接下来就是整个认证验证的全过程了:
[root@mail ~]# !tel
telnet mail.linuxidc.com 25 //*测试的开始
Trying 192.168.1.103...
Connected to mail.linuxidc.com (192.168.1.103).
Escape character is '^]'.
220 mail.linuxidc.com ESMTP Postfix
EHLO mail.linuxidc.com //*使用EHLO mail.linuxidc.com 来查看是否有认证功能
250-mail.linuxidc.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN //*显示的有认证功能
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN //*使用认证的方式登录
334 VXNlcm5hbWU6
cmVkaGF0 //*输入通过base64编码的用户名(redhat)
334 UGFzc3dvcmQ6
cmVkaGF0 //*输入通过base64编码的用户密码(redhat)
235 2.0.0 Authentication successful //显示认证成功
MAIL FROM:redhat@linuxidc.com //*发邮件的用户
250 2.1.0 Ok
RCPT TO:test@126.com //*接收邮件的用户
250 2.1.5 Ok
data //*邮件内容
354 End data with <CR><LF>.<CR><LF>
Subject:sasl test //*邮件主题
sasltest //*邮件内容
. //*结束邮件的编辑
250 2.0.0 Ok: queued as EF6826C2EE4
quit //*退出测试
21 2.0.0 Bye
Connection closed by foreign host.(注:带“*”都是要输入的)
接下来就看日志信息来看看整个过程了:
#postqueue -p 查看邮件队列,如果有就没有发出,如果没有就结合着邮件日志来查看整个过程
我这里是没有的
#tail -20 /var/log/maillog
Aug 11 03:51:38 station78 postfix/smtpd[5314]: connect from mail.linuxidc.com[192.168.1.103]
Aug 11 03:52:44 station78 postfix/smtpd[5314]: EF6826C2EE4: client=mail.linuxidc.com[192.168.1.103], sasl_method=LOGIN, sasl_username=redhat
Aug 11 03:53:09 station78 postfix/cleanup[5319]: EF6826C2EE4: message-id=<20110810195244.EF6826C2EE4@mail.linuxidc.com>
Aug 11 03:53:09 station78 postfix/qmgr[5126]: EF6826C2EE4: from=<redhat@linuxidc.com>, size=372, nrcpt=1 (queue active)
Aug 11 03:53:11 station78 postfix/smtpd[5314]: disconnect from mail.linuxidc.com[192.168.1.103]
Aug 11 03:53:23 station78 postfix/smtp[5323]: EF6826C2EE4: to=<test@126.com>, relay=126mx01.mxmail.netease.com[220.181.15.141]:25, delay=59, delays=45/0.11/12/2, dsn=5.0.0, status=bounced (host 126mx01.mxmail.netease.com[220.181.15.141] said: 550 User not found: test@126.com (in reply to RCPT TO command))
Aug 11 03:53:23 station78 postfix/cleanup[5319]: E8F136C2EE6: message-id=<20110810195323.E8F136C2EE6@mail.linuxidc.com>
Aug 11 03:53:23 station78 postfix/qmgr[5126]: E8F136C2EE6: from=<>, size=2226, nrcpt=1 (queue active)
Aug 11 03:53:23 station78 postfix/bounce[5324]: EF6826C2EE4: sender non-delivery notification: E8F136C2EE6
Aug 11 03:53:23 station78 postfix/qmgr[5126]: EF6826C2EE4: removed
Aug 11 03:53:24 station78 postfix/local[5325]: E8F136C2EE6: to=<redhat@linuxidc.com>, relay=local, delay=0.23, delays=0.02/0.03/0/0.19, dsn=2.0.0, status=sent (delivered to mailbox)
Aug 11 03:53:24 station78 postfix/qmgr[5126]: E8F136C2EE6: removed
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max connection rate 1/60s for (smtp:192.168.1.103) at Aug 11 03:51:38
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max connection count 1 for (smtp:192.168.1.103) at Aug 11 03:51:38
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max cache size 1 at Aug 11 03:51:38
所以可以看出邮件是已经通过认证的方式发出去了,这就是当时我们针对本机设置认证,
如果想和外域的发邮件,就要先认证才能发送邮件,否者是被拒绝的。
2、设置用户别名和邮件群组
所谓的用户别名就是通过给一个一个用户邮件转发给另一个用户
别名有两个功能:地址转发,邮件群发
使用文件/etc/aliases文件
在里面添加记录
格式如下:
别名:地址1,地址2,地址3,...
然后执行newaliases命令转换aliases.cb格式
然后在postfix中添加一个别名机制
步骤如下:
①在/etc/aliases中添加别名记录
#vim /etc/aliases
root: redhat //凡是给root用户发的邮件转发给redhat用户
#newaliases 生成新的aliases.db文件
#service postfix reload
# echo "TO root" |mail -s "to root" root@linuxidc.com //给root@linuxidc.com发邮件测试
#tail /var/log/maillog查看日志文件
Aug 11 04:21:33 station78 postfix/qmgr[5126]: D2A056C2EE5: from=<root@linuxidc.com>, size=294, nrcpt=1 (queue active)
Aug 11 04:21:34 station78 postfix/local[8079]: D2A056C2EE5: to=<redhat@linuxidc.com>, orig_to=<root@linuxidc.com>, relay=local, delay=0.3, delays=0.11/0.02/0/0.18, dsn=2.0.0, status=sent (delivered to mailbox)
Aug 11 04:21:34 station78 postfix/qmgr[5126]: D2A056C2EE5: removed
这三行日志显示发给root@linuxidc.com 最终发给了redhat@linuxidc.com用户了
#su - redhat
#mail 查看邮件,你会发现刚写的邮件
②在/etc/aliases中添加群组的记录,这样就可以发送群邮件了
#groupadd mygroup
#vim /etc/aliases
mygroup: redhat,student,root
#newaliases
#service postfix reload
测试同上面,查看日志文件
3、邮件加密
邮件传送的时候会经过internet,所以存在安全隐患,为了跟好的保障邮件的传输
以及数据的完整性,所以要对数据进行加密,在加密的过程中,可以使用smtps,pop3s,
imaps方式。
这就需要使用邮件服务的ssl了,接下来就是做这个过程了
首先,使用wireshark抓把工具来进行抓包
#yum install wireshark
#tshark -ni eth0 -R "tcp.scrport eq 110 or tcp.dstport eq 110" 进行抓包
然���在客户端等登录
在window的cmd下输入 telnet 192.168.1.103 110
USER redhat
PASS redhat
LIST //列出邮件
RETR NUM //查看指定编号的邮件
这个时候你分析抓包工具抓的数据包,能看到里面直接就有用户名和密码
所以这样太危险了,为了安全考虑,我们需要使用ssl对数据进行加密,同时考
虑到数据传输的特点,在接受邮件的时候进行加密会更好,所以使用pop3s,或
imaps协议来实现加密功能
具体步骤如下:
①建立ca
#(umask 077;openssl genrsa 1024 >private/cakey.pem) //建立ca的私钥
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650//颁发一个自签的证书
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [ZZ]:
Organization Name (eg, company) [linux]:
Organizational Unit Name (eg, section) []:ca
Common Name (eg, your name or your server's hostname) []:ca.linuxidc.com
Email Address []:ca@linuxidc.com
# mkdir certs newcerts crl
# touch index.txt serial
# echo 01 > serial
②为dovecot创建私钥并申请证书
#mkdir /etc/dovecot
#cd /etc/dovecot
#mkdir ssl
#cd ssl
#openssl genrsa 1024>dovecot.key
#chmod 600 dovecot.key
#openssl req -new -key dovecot.key -out dovecot.csr //申请证书
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [ZZ]:
Organization Name (eg, company) [linux]:
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:mail.linuxidc.com
Email Address []:root@linuxidc.com
③颁发证书
# openssl ca -in dovecot.csr -out dovecot.crt //颁发证书
④编辑/etc/dovecot.conf文件
#cd /etc/dovecot/ssl
#cp /etc/pki/CA/private/cacert.pem ./
#mv cacert.pem cacert.crt
#rm -fr dovecot.csr
#vim /etc/dovecot.conf 修改如下内容
ssl_cert_file = /etc/dovecot/ssl/dovecot.crt
ssl_key_file = /etc/dovecot/ssl/dovecot.key
ssl_ca_file = /etc/dovecot/ssl/cacert.crt
protocols = imap imaps pop3 pop3s
⑤测试:
#mutt -f pop3s://redat@mail.linuxidc.com
测试会显示一个关于证书的,这样就实现了加密。
这时候在使用抓包工具就不会抓到密码了
4、拒绝指定地址、指定用户发邮件
①指定地址拒绝发送邮件
#vim /etc/postfix/main.cf
smtpd_client_restrictions =hash:/etc/postfix/access_file
#vim /etc/postfix/access_file
192.168.1.103 REJECT
#postmap /etc/postfix/access_file //转换成二进制的格式
#service postfix reload
220 mail.linuxidc.com ESMTP Postfix
HELO mail.linuxidc.com
250 mail.linuxidc.com
MAIL FROM:redhat@linuxidc.com
250 2.1.0 Ok
RCPT TO:root@linuxidc.com
554 5.7.1 <unknown[192.168.1.100]>: Client host rejected: Access denied
我在自己的客户机(192.168.1.100)上验证,这样就会拒绝指定的IP地址发送邮件了
②指定网段
在/etc/postfix/access_file中添加网段
如1.2.3 REJECT表示1.2.3.0这个网段的被拒绝
剩下的步骤就和上面的一样了
③拒绝指定的用户发送邮件
#vim /etc/postfix/main.cf
smtpd_sender_restrictions=hash:/PATH/FILE_NAME
#vim /PATH/FILE_NAME
CentOS@linuxidc.com REJECT 拒绝指定的用户的指定邮箱
@a.org REJECT 拒绝a.org这个域的用户
gentoo@ REJECT 拒绝gentoo所在的所有的域
#postmap /PATH/FILE_NAME
#service postfix reload