1. 程式人生 > >Linux中Postfix郵件認證配置(五)

Linux中Postfix郵件認證配置(五)

Postfix+Dovecot+Sasl工作原理

1.A使用者使用MUA客戶端藉助smtp協議登陸smtpd伺服器,需要先進行使用者和密碼認證,而SMTPD伺服器端支援sasl認證,例如有一個sasl客戶端,就會去連線SASL。當SASL接受到驗證請求時就會根據驗證方式去進行驗證,常用的有PAM,passwd等。驗證成功後就會返回給Smtpd伺服器。而smtpd就會允許A使用者登陸傳送郵件。

2.Smtpd伺服器接受到郵件轉發請求後,檢視郵件是本域的還是外部域的,如果是本域內的使用者,就會開啟MDA程序並進行郵件投遞到使用者的郵箱。

3.B使用者使用MUA客戶端藉助pop3協議登陸dovecot伺服器,需要先進行使用者和密碼認證,而Dovecot伺服器端本身就有sasl認證的功能,而根據設定的認證方式進行使用者和密碼的認證。認證成功之後使用者登入,Dovecot就會用MDR工具去使用者郵箱中取回郵件並下載到使用者的客戶端本地進行檢視。

Postfix+SASL進行使用者發郵件認證

通過驗證配置可以發現,如果想傳送郵件給外部(中繼郵件)基本配置只能在mynetwork規定的ip範圍內使用。這個方式在現實中也是不可行的。網際網路上常用的方式是通過賬號的認證方式允許中繼郵件。但Postfix本身沒有認證功能所以只能藉助於第三方認證元件SASL來實現。與Postfix配合較好的SASL有:dovecot-SASL和cyrus-SASL,以及courier-authlib這幾款元件。各有千秋,使用哪個根據實際選擇即可。

①確定cyrus-sasl已安裝

[[email protected] ~]# rpm -qa | 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
cyrus-sasl-devel-2.1.23-13.el6_3.1.x86_64

②確定Postfix支援sasl認證

[[email protected] ~]# postconf -a
cyrus
dovecot
  #預設支援cyrus和dovecot這兩種認證方式

③Postfix主配置新增以下內容

[[email protected] ~]# vim /etc/postfix/main.cf
###################CYRUS-SASL################
broken_sasl_auth_clients = yes
  #定義是否支援像outlook、foxmail等非標準協議認證
smtpd_sasl_auth_enable = yes
  #開啟sasl驗證使用者功能
smtpd_sasl_local_domain = $myhostname
  #用於識別本地主機
smtpd_sasl_security_options = noanonymous
  #不支援匿名使用者
smtpd_sasl_path = smtpd
  #指定使用sasl的程式名
smtpd_banner = welcome to smtp.ywnds.com
  #定義telnet連線時顯示資訊
smtpd_client_restrictions = permit_sasl_authenticated
  #用於限制客戶端連線伺服器
smtpd_sasl_authenticated_header = yes
  #從頭資訊查詢使用者名稱
smtpd_sender_restrictions = permit_mynetworks,reject_sender_login_mismatch
  #定義發件人規則
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated, reject_invalid_hostname,reject_unauth_destination
  #定義收件人規則
  #permit_mynetworks:允許本地網路
  #permit_sasl_authenticated:允許sasl認證過的使用者傳送郵件
  #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記錄時拒絕

④檢視SASL支援哪些認證機制

[[email protected] ~]# saslauthd -v
saslauthd 2.1.23
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap

⑤Postfix開啟基於SASL使用者認證

這裡介紹2種認證方式,saslauthd和auxprop,一個是使用系統的賬號來做認證,一個使用外部的賬戶來做認證,對於安全性來說,當然是使用外部的賬號更安全了,這裡介紹的使用sasldb2資料庫,mysql的方式暫不介紹。2種方式人選其一即可。

Saslauthd
[[email protected] ~]# vim /usr/lib64/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
#登入方式

Auxprop
[[email protected] ~]# vim /usr/lib64/sasl2/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
#登入方式

⑥SASL配置檔案/etc/sysconfig/saslauthd

SASL只是個認證框架,實現認證的是認證模組,而pam是sasl預設使用的認證模組。如果使用shadow做認證的話直接修改就可以不需要做其他任何配置了。

Saslauthd
[[email protected] ~]# vim /etc/sysconfig/saslauthd
SOCKETDIR=/var/run/saslauthd
#MECK= pam
MECK = shadow

Auxprop
[[email protected] ~]# vi /etc/sysconfig/saslauthd
#MECH=
FLAGS=sasldb

[[email protected] ~]# saslpasswd2 -c -u 'ywnds.com' redis
  #執行之後輸入2次密碼就可以了
[[email protected] ~]# sasldblistusers2
  #檢視新增的使用者
[[email protected] ~]# saslpasswd2 -d [email protected]
  #刪除使用者
[ro[email protected] ~]# chown postfix:postfix /etc/sasldb2
[[email protected] ~]# chmod 640 /etc/sasldb2
  #資料庫許可權修改

⑦重啟服務

[[email protected] ~]# /usr/sbin/postfix reload
[[email protected] ~]# service saslauthd restart
[[email protected] ~]# chkconfig saslauthd on
測試賬號

[[email protected] ~]# testsaslauthd -u hadoop -p hadoop
0: OK “Success”
SMTP認證指令

Linux中Postfix郵件認證配置(五)Linux中Postfix郵件認證配置(五)

Postfix內部郵件過濾

除了在上面配置檔案中使用的一些過濾指令外,管理員也可以使用訪問表(access map)來自定義限制條件,自定義訪問表的條件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access進行,它們後面通常跟上type:mapname格式的訪問表型別和名稱。其中,check_sender_access和check_recipient_access用來檢查客戶端提供的郵件地址,因此,其訪問表中可以使用完整的郵件地址,如[email protected];也可以只使用域名,如magedu.com;還可以只有使用者名稱的部分,如[email protected]

案例

1.這裡以禁止172.16.100.66這臺主機通過工作在172.16.100.1上的postfix服務傳送郵件為例演示說明其實現過程。訪問表使用hash的格式

(1)首先編輯/etc/postfix/access檔案,以之做為客戶端檢查的控制檔案,在裡面定義如下一行:

172.16.100.66          REJECT

(2)將此檔案轉換為hash格式產生一個access.db檔案

postmap /etc/postfix/access

(3)配置postfix使用此檔案對客戶端進行檢查編輯/etc/postfix/main.cf檔案新增如下引數:

smtpd_client_restrictions = check_client_access hash:/etc/postfix/access

(4)讓postfix重新載入配置檔案即可進行發信控制的效果測試了

2.這裡以禁止通過本伺服器向microsoft.com域傳送郵件為例演示其實現過程訪問表使用hash的格式

(1)首先建立/etc/postfix/denydstdomains檔案(檔名任取)在裡面定義如下一行:

microsoft.com          REJECT

(2)將此檔案轉換為hash格式

postmap /etc/postfix/denydstdomains

(3)配置postfix使用此檔案對客戶端進行檢查編輯/etc/postfix/main.cf檔案新增如下引數:

smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/denydstdomains, permit_mynetworks, reject_unauth_destination

(4)讓postfix重新載入配置檔案即可進行發信控制的效果測試了