2017年1月4日 星期三

Ubuntu 16.04 安裝 iRedMail (Postfix) 整合 Samba DC

資料來源:
iRedMail 整合 Windows Active Directory 官網設定:
熱心的 Alan 把 iRedMail 英文官網翻譯成中文網頁:

會寫這篇是因為官網上的設定是針對 Windows Active Directory 的設定。
但我是使用 Samba 來當 DC 伺服器(沒有 Windows 系統),所以寫這篇當作是自己備忘錄用。
roundcubemail 的 config 檔案也有些微的調整,因為我的使用者是歸屬到 OU 裡,所以不調整會抓不到使用者名單及群組。
再強調一次,所有的設定都是延用官網提供的資料,只有些微的調整以符合我自己的網域環境。

先更新系統:
apt-get update && apt-get upgrade && apt-get dist-upgrade

下載安裝 iRedMail 套件,它會線上下載安裝所有所需的套件:

解壓縮 iRedMail :
tar -xvf iRedMail-0.9.5-1.tar.bz2
cd iRedMail-0.9.5-1
bash iRedMail.sh

iRedMail 固定的設定畫面,依它的設定步驟提供各項資料設定(增加版面的截圖):

郵件的儲存路徑:

要採用 Nginx 或 apache 作為 WEB Server:

這裡我選擇 OpenLDAP 作為使用者帳號管理(測試整合 Samba DC 帳號,後續再修改 LDAP 設定):
iRedMail 是一個支援多網域的郵件整合套件,這裡先輸入一個網域,但要整合 DC 伺服器的話,多網域功能將無法使用(這裡不允許輸入與本機相同的網域名稱):

輸入管理者密碼:

安裝額外的套件(WEB 管理介面、Web Mail、Fail2ban) :

最後,確認一下所有的設定項目,沒想修改的就按下 y 完成 iRedMail 的安裝:

按下 y 後開始下載及安裝各項套件,會跑一下子。安裝過程中還會再詢問是否要在防火牆設定開啟 SSH Port
我是依照提示字元 [Y|n] 哪個是大寫就選哪個,亂選!!!

完成後的訊息畫面:

重新啟動伺服器,啟動所有相關的服務功能:
reboot

登入 iRedMail 管理網頁:

先建一個使用者帳號給 LDAP search 清單時使用:
可利用微軟提供的 RSAT 管理工具連線 Samba DC 建立使用者帳號及管理;
遠端伺服器管理工具(RSAT) 連線管理 DC 伺服器:
下載連結位址: https://www.microsoft.com/zh-TW/download/details.aspx?id=45520
建一個【vmail】使用者帳號
想要練一下 Samba DC 指令建帳號也可以:
samba-tool user add -h    #查詢用法
samba-tool user list     #顯示目前使用者帳號
samba-tool user add username --given-name=小明 --surname= --mail-address=username@tw.example

測試 LDAP 是否可以搜尋到資料:
DNS IP 是指向 Samba Domain 的 DNS 主機才可用 -h DomainName 做測試
ldapsearch -x -h tw.example -D 'tw\vmail' -W -b 'cn=users,dc=tw,dc=example'

如果出現下列訊息:
則必須在 smb.conf 加入:
ldap server require strong auth = No    #關閉使用複雜的身份驗證

自已備忘用:
測試時用的是 dynamic dns 方式架設 iRedMail,所以如果出現下列訊息,
這時還沒修改 LDAP 設定整合 Samba DC:
do not list BOTH mydestination and virtual_mailbox_domains
修改 /etc/postfix/main.cf 下列三個參數:
不需修改 mydestination、virtual_mailbox_domains 這兩個參數


修改 Postfix 各項設定,整合 Samba DC :
將 LDAP 帳號驗證轉移到 Samba DC 後,iRedMail 本機的網域就無法登入使用了。

vi /etc/postfix/main.cf
修改下列參數值:
virtual_alias_maps =
    proxy:ldap:/etc/postfix/ldap/virtual_alias_maps.cf
    proxy:ldap:/etc/postfix/ldap/virtual_group_maps.cf
    proxy:ldap:/etc/postfix/ldap/virtual_group_members_maps.cf
    proxy:ldap:/etc/postfix/ldap/catchall_maps.cf
change to:
virtual_alias_maps =          #設為空值

sender_bcc_maps =
    proxy:ldap:/etc/postfix/ldap/sender_bcc_maps_user.cf
    proxy:ldap:/etc/postfix/ldap/sender_bcc_maps_domain.cf
change to:
sender_bcc_maps=         #設為空值

recipient_bcc_maps =
    proxy:ldap:/etc/postfix/ldap/recipient_bcc_maps_user.cf
    proxy:ldap:/etc/postfix/ldap/recipient_bcc_maps_domain.cf
change to:
recipient_bcc_maps=         #設為空值

relay_domains =
    $mydestination
    proxy:ldap:/etc/postfix/ldap/relay_domains.cf
change to:
relay_domains=         #設為空值

relay_recipient_maps=         #設為空值

virtual_mailbox_domains =
   proxy:ldap:/etc/postfix/ldap/virtual_mailbox_domains.cf
change to:
virtual_mailbox_domains = tw.example    #E-Mail Domain Name

smtpd_sasl_local_domain = tw.example    #E-Mail Domain Name

修改 transport 設定:
transport_maps =
    proxy:ldap:/etc/postfix/ldap/transport_maps_user.cf
    proxy:ldap:/etc/postfix/ldap/transport_maps_domain.cf
change to:
transport_maps = hash:/etc/postfix/transport

SMTP 寄件者設定:
smtpd_sender_login_maps =
   proxy:ldap:/etc/postfix/ldap/sender_login_maps.cf
change to:
smtpd_sender_login_maps =
   proxy:ldap:/etc/postfix/ldap/ad_sender_login_maps.cf

mail 使用者:
virtual_mailbox_maps =
   proxy:ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
change to:
virtual_mailbox_maps =
   proxy:ldap:/etc/postfix/ldap/ad_virtual_mailbox_maps.cf

mail 群組:
virtual_alias_maps =
    proxy:ldap:/etc/postfix/ldap/virtual_group_maps.cf
change to:
virtual_alias_maps =
   proxy:ldap:/etc/postfix/ldap/ad_virtual_group_maps.cf

建立 transport 檔案:
vi /etc/postfix/transport
內容:
tw.example dovecot

hash transport 檔案產生 transport.db:
postmap hash:/etc/postfix/transport

網友 squawell huang 提供:
在 DC 網域與使用者 E-Mail 網域不同的情況下,必須修改下列四個檔案:
1.ad_sender_login_maps.cf
2.ad_virtual_mailbox_maps.cf
3.ad_virtual_group_maps.cf
4.dovecot-ldap.conf
將【userPrincipalName】修改為【mail】
我自己的網域是 tw.example 但我的 E-Mail 是用 hansen@example.ddns.net ,

所以我登入 webmail 的帳號要輸入 hansen@example.ddns.net ,我測試從 Gmail 寄給 hansen@example.ddns.net 是可以收到信件的。

建立 ad_sender_login_maps.cf :
vi /etc/postfix/ldap/ad_sender_login_maps.cf
內容:
server_host     = tw.example    #DNS IP 指向 AD 主機時可這樣設定,指定 IP 也可以
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = tw\vmail
bind_pw         = vmail_password
search_base     = cn=users,dc=tw,dc=example
scope           = sub
#query_filter    = (&(userPrincipalName=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
#result_attribute= userPrincipalName
query_filter    = (&(mail=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute= mail
debuglevel      = 0

建立 ad_virtual_mailbox_maps.cf :
vi /etc/postfix/ldap/ad_virtual_mailbox_maps.cf
內容:
server_host     = tw.example    #DNS IP 指向 AD 主機時可這樣設定,指定 IP 也可以
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = tw\vmail
bind_pw         = vmail_password
search_base     = cn=users,dc=tw,dc=example
scope           = sub
#query_filter    = (&(objectclass=person)(userPrincipalName=%s))
#result_attribute= userPrincipalName
query_filter    = (&(objectclass=person)(mail=%s))
result_attribute= mail
result_format   = %d/%u/Maildir/
debuglevel      = 0

建立 ad_virtual_group_maps.cf :
vi /etc/postfix/ldap/ad_virtual_group_maps.cf
內容:
server_host     = tw.example    #DNS IP 指向 AD 主機時可這樣設定,指定 IP 也可以
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = tw\vmail
bind_pw         = vmail_password
search_base     = cn=users,dc=tw,dc=example
scope           = sub
query_filter    = (&(objectClass=group)(mail=%s))
special_result_attribute = member
leaf_result_attribute = mail
#result_attribute= userPrincipalName
result_attribute=mail
debuglevel      = 0

Alan 翻譯的注意事項: 
1.AD 的使用者資訊在 "mail " 及 "userPrincipalName"中皆有設定, 將取回重複的兩筆 郵件地址, 註解掉 'leaf_result_attribute' 即可
2.若群組帳號未傳回正確的 'mail' 及 'userPrincipalName' 資料,修改query_filter 的設定: query_filter = (&(objectClass=group)(sAMAccountName=%u))

移除 Postfix 中 iRedAPD 相關設定:
vi /etc/postfix/main.cf
移除下列這段文字:
check_policy_service inet:127.0.0.1:7777  (有兩處要刪除: smtpd_recipient_restrictions、smtpd_end_of_data_restrictions)

測試是否可提取 AD 資料,有回覆訊息表示正常運作:
postmap -q vmail@tw.example ldap:/etc/postfix/ldap/ad_virtual_mailbox_maps.cf
應回覆訊息:
tw.example/vmail/Maildir/

postmap -q vmail@tw.example ldap:/etc/postfix/ldap/ad_sender_login_maps.cf
應回覆訊息:
vmail@tw.example

postmap -q hr@tw.example ldap:/etc/postfix/ldap/ad_virtual_group_maps.cf
應回覆 HR 群組所有成員 E-Mail 清單。


AD 整合 Dovecot 功能(dovecot 的 LDAP 查詢轉向至 Samba DC 伺服器):
建立 dovecot-ldap.conf :
vi /etc/dovecot/dovecot-ldap.conf
內容:
hosts           = tw.example:389    #DNS IP 指向 AD 主機時可這樣設定,不然指定 IP 也可以
ldap_version    = 3
auth_bind       = yes
dn              = tw\vmail
dnpass          = vmail_password
base            = cn=users,dc=tw,dc=example
scope           = subtree
deref           = never
#user_filter     = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
#pass_filter     = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
user_filter     = (&(mail=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_filter     = (&(mail=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_attrs      = userPassword=password
default_pass_scheme = CRYPT
user_attrs      = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/

設定 user quota:
vi /etc/dovecot/dovecot.conf
找到修改:
quota_rule = *:storage=1G

重啟 Dovecot Service :
systemctl restart dovecot.service

測試 Dovecot 是否正常運作:
telnet localhost 143
出現 * OK [...] Dovecot ready.
表示正常可登入
測試指令:
. login vmail@tw.example user_password


設定 roundcubemail 可讀取 AD 使用者帳號:
iRedMail 將 roundcubemail 安裝在:
/opt/www/roundcubemail

修改 roundcubemail config.inc.php 設定檔:
vi /opt/www/roundcubemail/config/config.inc.php

修改的內容:
# Global LDAP Address Book with AD.
#
$config['ldap_public']["global_ldap_abook"] = array(
    'name'          => 'AD 通訊錄',
    'hosts'         => array("tw.example"),      //設定 Samba DC 主機名稱或者主機 IP
    'port'          => 389,
    'use_tls'       => false,   //設定 LDAP 使用 TLS
    'ldap_version'  => '3',
    'network_timeout' => 10,
    'user_specific' => false,

    'base_dn'       => "dc=tw,dc=example",    
     // <- 設定 base dn,因為 Samba DC 人員採用 OU 方式, cn=users,dc=tw,dc=example 無法提取清單,所以改成 dc=tw,dc=example

    'bind_dn'       => "tw\\vmail",             // <- 搜尋網域清單時 bind_dn 要加 "\\"
    'bind_pass'     => "vmail_password",
    'writable'      => false,               // <- 不允許使用者回寫資料到 Samba DC

    'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'),

    // mapping of contact fields to directory attributes
    'fieldmap' => array(
        'name'        => 'cn',
        //'surname'     => 'sn',
        //'firstname'   => 'givenName',
        'title'       => 'title',
        'email'       => 'mail:*',
        'phone:work'  => 'telephoneNumber',
        'phone:mobile' => 'mobile',
        'phone:workfax' => 'facsimileTelephoneNumber',
        'street'      => 'street',
        'zipcode'     => 'postalCode',
        'locality'    => 'l',
        'department'  => 'departmentNumber',
        'notes'       => 'description',
        'photo'       => 'jpegPhoto',
    ),
    'sort'          => 'cn',
    'scope'         => 'sub',

//因為人員採用 OU 方式,會跑出一些不該出現的帳號,所以在 filter 時過濾掉不該出現的帳號
    //'filter'        => "(&(objectclass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))",
    'filter'        => '(&(objectClass=Person)(!(objectClass=computer))(!(cn=dns*))(!(cn=Admin*))(!(cn=Guest*))(!(cn=krbtgt)))',    //應該有更簡單的過濾方式,目前先這樣用
    'fuzzy_search'  => true,
    'vlv'           => false,
    'sizelimit'     => '0',
    'timelimit'     => '0',
    'referrals'     => false,

'group_filters' => array(
        'departments' => array(
            'name'    => 'AD 群組',
            'scope'   => 'sub',
            'base_dn' => 'dc=tw,dc=example',
            //'filter'  => '(&(|(objectclass=mailList)(objectClass=mailAlias))(accountStatus=active)(enabledService=displayedInGlobalAddressBook))',
            'filter'  => '(&(|(cn=HRGroup)(cn=RDGroup)))',    //不知道怎樣才能過濾掉一大堆 DC 伺服器的群組,乾脆直接取出固定的群組清單,反正修改也是一下子的時間而已
            'name_attr' => 'cn',
            'email'     => 'mail',
        ),
    ),
);

roundcube 通訊錄:


搞定,後續觀察是否有其他問題。

補充:
syslog 出現訊息:
vmail roundcube: <clji923d> PHP Error: LDAP: ldap_search failed for dn=.........................

使用者在郵件地址欄位每輸入一個字符,Roundcube ldap 便立即查詢,但無法找到相符的資料,所以會出現此訊息。這個訊息是可以忽略。



沒有留言:

張貼留言

Nutanix平台虛擬機(UBUNTU),利用Veeam備份移轉至VMware平台,安裝套件、系統更新出現錯誤

 mount: /var/lib/grub/esp: special device /dev/disk/by-id/scsi-SNUTANIX_VDISK_NFS_4_0_7672_2d41cbaa_025e_4fac_849c_9e620eff5bff-part1 does n...