[文章] Postfix 整合 AD 驗證

基本上所有的設定都在 Linux 上完成
大致的設定流程:
1. 透過 krb5 和 samba 相關套件將 Linux Server 加入 AD Domain 中
2. 設定 postfix & dovecot 基本及驗證設定
3. 透過 PAM 指定哪些服務要使用 winbind 去和 AD 驗證帳號密碼
4. 以 cron 定時於 Linux 上建立新 AD user 的家目錄

另外先簡單說明一下設定完成後,收發 email 時大致的運作流程:
1. 使用者寄 email 時會先和 AD 驗證寄件者是否在 AD 帳號中,若有則驗證密碼是否正確,若正確 mail server 才會傳送此 mail,反之就將 mail drop 掉
2. 使用者收 email 時一樣會先和 AD 驗證收件者是否在 AD 帳號中,若有則驗證密碼是否正確,若正確 mail server 才會允許使用者收下此 mail,反之就 reject

最近因工作上的需求開始研究如何將 Linux 的 Postfix 和 Windows 的 AD 環境整合起來
簡單來說就是 SSO(Single Sign On)
人員異動時只需要調整 AD 的部份即可,不必 AD 和 Postfix 都要各自調整
有效的將作業流程簡單化

 
相關的設定方法已有很多先進在網路上分享過
所以重複或預設的部份就不再列出並說明,僅說明需設定的部份
以下為參考了很多先進的資料來源:
 
@ 透過 Samba 的 Winbind 整合 AD 驗證
@ Postfix 整合 AD
 
 
----------------------------------------------事前準備---------------------------------------------------
首先必須要有 Linux root 權限或可以 sudo 為 root 的帳號 (因為需安裝套件 & 修改設定檔)
以及 AD 環境下具有 Domain Admin 身份的帳號 (因為需將 Linux Server 加入 AD Domain)
以下假設此帳號為 admin
另外 Domain Name 為 BENJAMIN.COM.TW
DC 為 dc.benjamin.com.tw
 
基本上所有的設定都在 Linux 上完成
大致的設定流程:
1. 透過 krb5 和 samba 相關套件將 Linux Server 加入 AD Domain 中
2. 設定 postfix & dovecot 基本及驗證設定
3. 透過 PAM 指定哪些服務要使用 winbind 去和 AD 驗證帳號密碼
4. 以 cron 定時於 Linux 上建立新 AD user 的家目錄
 
另外先簡單說明一下設定完成後,收發 email 時大致的運作流程:
1. 使用者寄 email 時會先和 AD 驗證寄件者是否在 AD 帳號中,若有則驗證密碼是否正確,若正確 mail server 才會傳送此 mail,反之就將 mail drop 掉
2. 使用者收 email 時一樣會先和 AD 驗證收件者是否在 AD 帳號中,若有則驗證密碼是否正確,若正確 mail server 才會允許使用者收下此 mail,反之就 reject
 
環境介紹:
AD: Windows Server 2008 R2
Mail: CentOS 5.7,Postfix 2.6.6
 
 
----------------------------------------------開始設定---------------------------------------------------
以下皆於 CentOS 上執行
 
1. 安裝相關的服務套件
$sudo yum install postfix dovecot samba samba-winbind krb5-server krb5-server-ldap krb5-workstation pam pam_krb5 nss
 
 
2. 編輯 krb5 設定檔,為使 CentOS 可加入 AD Domain 中
$sudo vi /etc/krb5.conf
 
[libdefaults]
default_realm = BENJAMIN.COM.TW  ---此處填入欲整合的 Domain Name
dns_lookup_realm = true  ---設定使用 DNS 查詢 Domain Name 或 DC
dns_lookup_kdc = true  ---設定使用 DNS 查詢 KDC 角色
 
[realms]
BENJAMIN.COM.TW = {
 kdc = dc.benjamin.com.tw  ---填入 DC 的 IP 或 domain name
 admin_server = dc.benjamin.com.tw  ---管理 DC 的 server,直接填 DC 即可
 default_domain = benjamin.com.tw  ---當未指定 domain name 時自動填入的預設 domain name
}
 
[domain_realm]  ---指定各 domain 是屬於何 realm
.benjamin.com.tw = BENJAMIN.COM.TW
benjamin.com.tw = BENJAMIN.COM.TW
 
[appdefaults]  ---設定 pam 相關參數
pam = {
 debug = false
 ticket_lifetime = 36000
 renew_lifetime = 36000
 forwardable = true
 krb4_convert = false
}
 
 
3. 確認是否可連接 AD 進行驗證
$sudo kinit admin
password for admin@BENJAMIN.COM.TW:  ---因只有輸入帳號,故會自動填入預設的 domain name
輸入密碼後若直接跳回提示字元等待輸入,就表示可正常和 AD 連線並進行驗證
 
4. 編輯 samba 設定檔,才可透過 winbind 與 AD 溝通
$sudo vi /etc/samba/smb.conf
 
[global]
workgroup = BENJAMIN  ---欲加入網域的 netbios name
password server = dc.benjamin.com.tw  ---填入 DC FQDN
realm = BENJAMIN.COM.TW  ---領域名稱即 domain name
server string = Mail Server
netbios name = MAILSERVER
security = domain  ---設定認證的安全層級
idmap uid = 16777216-33554431  ---設定 AD 帳號的 UID 範圍
idmap gid = 16777216-33554431  ---設定 AD 帳號的 GID 範圍
username map = /etc/samba/smbusers
template homedir = /home/%U  ---設定家目錄
template shell = /bin/sh  ---此處可自行考量用 /bin/bash or /sbin/nologin
winbind separator = /
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = true
winbind offline logon = false
client use spnego = no
server signing = auto
encrypt passwords = yes
local master = no
preferred master = no
log file = /var/log/samba/%m.log
max log size = 50  ---每個 log 檔最大的容量,超過就 rotate,單位是 KB
 
重新啟動 samba
$sudo /etc/init.d/smb restart
 
 
5. 設定 Name Service Switch,以修改帳號驗證時對 winbind 的信任
$sudo vi /etc/nsswitch.conf
 
passwd: files winbind
shadow: files
group: files winbind
 
 
6. 接著要將 CentOS 加入 domain 中
$sudo net ads join -U admin -S dc.benjamin.com.tw -n mailserver
Enter admin’s password:
輸入 password 後,若成功就會出現類似 Joined “mailserver” to realm “benjamin.com.tw” 的回應
簡單說明參數的意義:
-U 指定擁有 Domain Admin 的帳號
-S 指定要透過哪台 DC 加入 AD
-n 設定 netbios name,加入後會在 DC 中看到的 computer name
 
重新啟動 winbind
$sudo /etc/init.d/winbind restart
 
 
7. 測試是否可向 DC 取得 AD 中的帳號/群組資訊
$sudo wbinfo -t  ---測試和 AD 的連線及信任關係
$sudo wbinfo -u  ---查詢 AD 中帳號資訊
$sudo wbinfo -g  ---查詢 AD 中群組資訊
 
 
8. 測Check Winbind nsswitch module with getent
$sudo getent passwd  ---查詢 AD 中詳細帳號資訊
$sudo getent group  ---查詢 AD 中詳細群組資訊
 
 
9. 設定 Dovecot
$sudo vi /etc/dovecot/conf.d/10-auth.conf
 
disable_plaintext_auth = yes  ---取消明文驗證
auth_mechanisms = plain
!include auth-system.conf.ext
 
 
$sudo vi /etc/dovecot/conf.d/auth-system.conf.ext
 
passdb {
 driver = pam
}
userdb {
 driver = passwd
}
 
 
$sudo vi /etc/dovecot/conf.d/10-mail.conf
 
mail_location = maildir:~/Maildir
 
重新啟動 dovecot
$sudo /etc/init.d/dovecot restart
 
 
10. 設定 postfix
$sudo vi /etc/postfix/main.cf
 
myhostname = mail.benjamin.com.tw
mydomain = benjamin.com.tw
myorigin = $mydomain
relay_domains = $mydestination
mydestination = $myhostname, localhost.$mydomain, localhost,$mydomain
inet_interfaces = all
unknown_local_recipient_reject_code = 550  ---若收件者為 unknown 則回覆 reject
mynetworks_style = subnet
mynetworks = 192.168.1.0/24,127.0.0.0/8  ---此處輸入各內部網路的 network
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $mydomain
 
重新啟動 postfix
$sudo /etc/init.d/postfix restart
 
 
11. 設定各服務透過 PAM 以 winbind 作驗證
$sudo vi /etc/pam.d/login
$sudo vi /etc/pam.d/smtp
$sudo vi /etc/pam.d/dovecot
 
auth sufficient pam_winbind.so
account sufficient pam_winbind.so
password sufficient pam_winbind.so use_authtok
 
這三行建議放在每個檔案的最上面,優先以 winbind 來驗證
另外若要 ssh or samba 登入時也透過 AD 來驗證
則以同樣的方式修改 /etc/pam.d/sshd or /etc/pam.d/samba 即可
 
 
12. 需於 CentOS 的 /home 中建立各 AD 帳號的家目錄
此部份是借用 "酷!學園論壇" 中 promisexiong 大大寫的 script
可在 root 的家目錄底下新增一個 script mk_ad_home_dir.awk
root@mail ~# vi mk_ad_home_dir.awk
 
#!/bin/awk
BEGIN {
FS = ":"
uidmin = 16777000
uidmax = 33550000
}
{
if ($3 >= uidmin && $3 <= uidmax ) {
print "\nmake directory " $6 "\nchown " $3 "." $4 " " $6
system ( "mkdir -p " $6 " ;chown " $3 "." $4 " " $6 )
}
}
 
root@mail ~# getent passwd | awk -f mk_ad_home_dir.awk
此時就會從畫面上看到自動建立 AD 帳號的家目錄
為了確保新增的 AD 帳號都會自動於 CentOS 中建立家目錄,可使用 cron 來達成
因為已存在的資料夾中的資料不會被覆蓋,所以就沒有新增判斷式了
目前是設定每日凌晨兩點執行一次
$sudo vi /etc/cron.d/mk-ad-home-dir
 
0 2 */1 * * root /usr/bin/getent passwd | /bin/awk -f /root/mk_ad_home_dir.awk
 
 
13. 設定相關服務開機自動啟動
$sudo chkconfig winbind on
$sudo chkconfig samba on
$sudo chkconfig dovecot on
$sudo chkconfig postfix on
 
 
14. 最後就可以用 AD 帳號密碼嘗試收發 email 試看看囉!
 
 
 
 
 

從諮商輔導人心
到諮商輔導資訊系統及網路世界
雖繞了一大圈 但都是極具意義的事
秉持著過去所學 朝著自己的興趣
體驗著一輩子只有一次的人生~~