Postfix邮件服务的高级配置(3)

三、高级邮件服务管理机制:
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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/7b263fd781addfeb9b68040f2fc466af.html