站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

OpenLDAP-Samba Auth With LDAP 設定

前言

[Samba] 為啟動 SMB/CIFS (Server Message Block/Common Internet File System) 網路協定使 Microsoft Windows 機器能透過此一網路協定來存取 [Samba] Server 上所分享的檔案系統資源 (ex. 檔案、印表機...等),本篇實作為設定 [Samba] 將使用者相關資訊轉移至 LDAP ObjectClass (物件類別) sambaSamAccount 內,並透過 OpenLDAP 來認證使用者帳號及密碼。

對於不同作業系統之間如何進行檔案系統資源的分享,簡述如下:

實作環境

安裝及設定

本篇實作為使用 FreeBSD 擔任檔案伺服器角色讓 Windows 使用者能透過 SMB/CIFS 協定來存取 FreeBSD 上檔案,將使用者資訊寫入 LDAP ObjectClass (物件類別) sambaSamAccount,本篇並不討論 Samba with PDC 部份 (因為沒時間測試這一段了 *:g*)。

步驟1.安裝 samba3 套件

切換至 Ports Tree 路徑安裝 Samba3 套件

 #cd /usr/ports/net/samba3                    //切換至安裝路徑
 #make install clean                          //安裝套件並清除安裝過程中產生不必要檔案,此次實作勾選項目如下
 [X] LDAP         With LDAP support 
 [X] CUPS         With CUPS printing support 
 [X] WINBIND      With WinBIND support 
 [X] QUOTAS       With Disk quota support
 [X] UTMP         With UTMP accounting support
 [X] POPT         With system-wide POPT library 

安裝提示說存放 Samba 驗證的密碼檔路徑已經改變了

 NOTICE: This version of port has changed location of Samba password
 NOTICE: (smbpasswd) directory. Files in '/usr/local/private'
 NOTICE: have moved to '/usr/local/etc/samba'.

步驟2.複製 Samba Schema (綱要) 至 LDAP

複製 Samba Schema (綱要 )至 LDAP Schema (綱要) 存放處,以使 LDAP 支援 ObjectClass (物件類別) sambaSamAccount

 #cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema/    

步驟3.修改 LDAP 設定檔 (slapd.conf)

修改 LDAP 設定檔 slapd.conf 內容如下

 #vi /usr/local/etc/openldap/slapd.conf                          //修改 LDAP 設定檔
 include         /usr/local/etc/openldap/schema/samba.schema     //加入此行 (支援 Samba Schema)
 access to attrs=userPassword                                    //修改前
 access to attrs=userPassword,sambaLMPassword,sambaNTPassword    //修改後 (隱藏密碼部份)
 index   sambaSID,sambaSIDList,sambaGroupType    eq,pres         //並加入此行 (建立 LDAP Samba 索引,加快查詢效率及速度)

修改完成後我們必須重建 LDAP 索引 (因為加入 sambaSID ...等選項) 及重新啟動 LDAP 服務

 #/usr/local/etc/rc.d/slapd stop                                 //停止 LDAP 服務 (重建 slapindex 索引前記得先停止 slapd 服務)
 #slapindex -f /usr/local/etc/openldap/slapd.conf                //重建 slapindex 索引
 #/usr/local/etc/rc.d/slapd start                                //啟動 LDAP 服務 

步驟4.修改 Samba 設定檔 smb.conf

詳細設定請參考 [Wang, Chun-Pin twbsd.org 第二十章 SAMBA 網路芳鄰],下列 Samba 設定檔內容僅列出如何與 LDAP Server 溝通的部份。

 #vi /usr/local/etc/smb.conf
 ldap admin dn = "cn=Manager,dc=weithenn,dc=org"                 //Samba 服務連接 LDAP 時所使用的 DN
 ldap ssl = start tls                                            //指定 Samba 連接 LDAP 方式 (採用 TLS)
 ldap delete dn = no                                             //刪除 Samba 帳號時不會刪除 LDAP DN
 ldap suffix = dc=weithenn,dc=org                                //Samba 查尋 LDAP 時的尾碼
 ldap user suffix = ou=People                                    //Samba 查尋 LDAP 使用者的 OU
 ldap group suffix = ou=Group                                    //Samba 查尋 LDAP 群組的 OU
 ldap passwd sync = yes                                          //系統使用者密碼與 Samba 使用者密碼同步
 passdb backend = ldapsam:ldap://filecenter.weithenn.org         //用來認證使用者密碼的方式 (此台 Samba 主機名稱為 filecenter.weithenn.org)

步驟5.將 LDAP Admin 密碼存入 Samba secrets.tdb 內

此次實作中將 LDAP Admin 密碼存入 Samba secrets.tdb 內,方便之後 Samba 服務 (smbd) 對 LDAP 做相關存取動作。

 #smbpasswd -w 1234                                              //假設您的 LDAP Admin Manager的密碼為 1234 (-w PASSWORD ldap admin password)
 Setting stored password for "cn=Manager,dc=weithenn,dc=org" in secrets.tdb

步驟6.修改 rc.conf

修改 /etc/rc.conf 設定檔以便系統重開機時能自動帶起 Samba 相關服務

 #vi /etc/rc.conf
 samba_enable="YES"                                              //啟動 Samba 服務
 nmbd_enable="YES"                                               //NetBIOS 名稱服務 (ex. Client 可用 \\filecenter 來進行連接)
 smbd_enable="YES"                                               //帳號密碼驗證及分享資料 Daemon 

步驟7.啟動 samba 服務

再啟動 Samba 服務之前可以使用 testparm 指令來檢查您所修改的 Samba 設定檔 (smb.conf) 內語法是否正確

 #testparm /usr/local/etc/smb.conf                               //檢查設定檔內語法是否正確
 Load smb config files from smb.conf
 Loaded services file OK.                                        //檢查完成沒有任何錯誤
 Server role: ROLE_STANDALONE

檢查設定檔無誤之後請鍵入如下指令來啟動 Samba 服務

 #/usr/local/etc/rc.d/samba start                                //啟動 Samba 服務
 Performing sanity check on Samba configuration: OK
 Starting nmbd.
 Starting smbd.

檢查 smbd (Listen 139 Port) 及 nmbd (Listen 137,138 Port) 服務是否啟動成功

 #sockstat | grep mbd
 root     smbd       42238 5  tcp4   192.168.1.8:139      *:*
 root     smbd       42238 21 dgram  -> /var/run/logpriv
 root     nmbd       34791 8  udp4   192.168.1.8:137      *:*
 root     nmbd       34791 9  udp4   192.168.1.8:138      *:* 

步驟8.建立 Samba Account 至 LDAP

建立 Samba Account 名稱 weithenn 至 LDAP 中,但在建立之前請先確定你 LDAP 及 Samba 相關設定檔已設定完成,且 LDAP 也查得到 weithenn DN。

 #smbpasswd -a weithenn                                    //建立 Samba Account weithenn
 New SMB password:                                         //輸入 weithenn 的 samba 密碼
 Retype new SMB password:                                  //再次確認密碼
 Added user weithenn.                                      //顯示新增使用者完成

帳號新增完成後此時您可以使用 ldapsearch 指令來查詢 weithenn DN 應該會多了 Samba 相關屬性,以下的 ldapsearch 查尋結果只貼關於新增屬性的部份。

 #ldapsearch -x -b "uid=weithenn,ou=People,dc=weithenn,dc=org"   
 objectClass: sambaSamAccount
 sambaSID: S-1-5-21-30203025-2334184562-489102932-13394
 sambaPwdCanChange: 1164615611
 sambaPwdMustChange: 2147483647
 sambaLMPassword: B757BF5C0D87772FAAD3B435B51404EE         //LanManager 密碼雜湊值
 sambaNTPassword: 7CE21F17C0AEE7FB9CEBA532D0546AD6         //NT 密碼雜湊值
 sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000
 00000000
 sambaPwdLastSet: 1164619611
 sambaAcctFlags: [U          ]

若您在 slapd.conf 有加上隱藏密碼部份則 ldapsearch 應該不會出現 sambaLMPassword 及 sambaNTPassword。

步驟9.測試 Samba 能否透過 LDAP 進行驗證使用者

步驟9-1.測試 Samba 能否認證新增的使用者

確定 LDAP 已新增剛才加入的 Samba Account (weithenn) 之後,我們著手測試看該使用者帳號 (weithenn) 能否存取 Samba 資源,此次實作中 Samba 主機名稱為 filecenter

 #smbclient -L filecenter -U weithenn                      //-L HOST -U USERNAME
 Password:                                                 //輸入 weithenn 的 samba 密碼
 Domain=[FILECENTER] OS=[Unix] Server=[Samba 3.0.23c]
        Sharename       Type      Comment
        ---------       ----      -------
        public          Disk      Public Stuff
        IPC$            IPC       IPC Service (Samba Server)
        weithenn        Disk      Home Directories
 Domain=[FILECENTER] OS=[Unix] Server=[Samba 3.0.23c]
        Server               Comment
        ---------            -------
        Workgroup            Master
        ---------            -------
        WGROUP

若出現如上訊息的 Samba 資訊則恭喜您!! 您已經成功讓 Samba 可透過 LDAP 來認證使用者帳號及密碼資訊,之後也可使用 smbstatus 指令來查看 Samba Version 及 Client 之間的連線情況。

若在上述測試過程中輸入錯誤的 Samba 密碼則會出現類似如下訊息

 #smbclient -L filecenter -U weithenn                      //-L HOST -U USERNAME
 Password:                                                 //輸入錯誤密碼
 session setup failed: NT_STATUS_LOGON_FAILURE             //認證失敗

步驟9-2.測試刪除 Samba 帳號後該 LDAP 帳號屬性變化

由於此次實作中我們在 Samba 設定檔 (smb.conf) 中有設定 (ldap delete dn = no) 也就是若刪除 Samba Account 時不會連 LDAP 的 DN 記錄一起刪除 (僅刪除該 DN 記錄中有關 Samba 的屬性部份),因此測試此功能是否生效,下例中我們刪除 Samba Account (weithenn) 後利用 ldapsearch 指令查看該帳號 (weithenn) 在 LDAP 中的 DN 記錄。

 #smbpasswd -x weithenn                                    //刪除 weithenn Samba Account
 Deleted user weithenn. 

利用 ldapsearch 指令查看 weithenn DN 資料,應該會發現有關 samba 的屬性都會砍掉

 #ldapsearch -x -b "uid=weithenn,ou=People,dc=weithenn,dc=org"

步驟10.使用者能透過 Web Mail 修改他們的 Samba 密碼

因為此次實作中我們所建立的 Samba 並沒有設定 ([PDC],也就是網域) 的功能,因此使用者該如何自行變更他們的密碼呢? 在 OpenLDAP-SquirrelMail Auth With LDAP 設定 這篇文章中我們有安裝 [SquirrelMail - Change LDAP Password Plugin],此一 Plugin 可同時更改在 LDAP 的 userPassword、sambaLMPassword、sambaNTPassword,因此可以解決使用者想要自行修改密碼 (在 LDAP 中) 的需求。

步驟10-1.安裝 mkntpwd 套件

簡單說 mkntpwd 這個工具可以幫我們把 明文 的密碼轉換為 Microsoft Windows 使用的 LanManager 密碼雜湊值 (sambaLMPassword) 及 NT 密碼雜湊值 (sambaNTPassword),所以透過 mkntpwd 產生 LanManager、NT 密碼雜湊值之後在傳送給 LDAP 來達成修改 Samba 密碼的需求。

 #fetch http://www.nomis52.net/data/mkntpwd.tar.gz    //下載 mkntpwd
 #tar -zxvf mkntpwd.tar.gz -C .                       //解開 mkntpwd
 #cd mkntpwd                                          //切換至解開套件目錄
 #make                                                //產生 mkntpwd 執行檔
 #cp mkntpwd /usr/local/bin                           //複製到系統執行路徑 
 #mkntpwd 1234                                        //將密碼 1234 轉換為 Lanmanager 及 NT 密碼雜湊值
 B757BF5C0D87772FAAD3B435B51404EE:7CE21F17C0AEE7FB9CEBA532D0546AD6

步驟10-2.修改 Change LDAP Password Plugin 設定檔 (config.php)

安裝好 mkntpwd 之後請修改 [SquirrelMail - Change LDAP Password Plugin] 設定檔 config.php,修改完設定檔後記得重新啟動 Web Server (此例為 Apache) 修改後的設定檔才會生效。

 #vi /home/web/squirrelmail/plugins/change_ldappass/config.php
 //$change_ldapsmb=false;                             //預設值
 $change_ldapsmb=true;                                //修改後
 //$mkntpwd='/usr/bin/mkntpwd';                       //預設值
 $mkntpwd='/usr/local/bin/mkntpwd';                   //修改後
 $ldapsmb_lmpassword='sambalmpassword';               //確定此行未註解
 $ldapsmb_ntpassword='sambantpassword';               //確定此行未註解
 $debug = false;                                      //除錯模式預設不啟動 (若無法成功在啟動進行除錯吧)

設定完成後以後使用者只要透過 [SquirrelMail - Change LDAP Password Plugin] 修改密碼即代表同時修改 LDAP 及 Samba 密碼,這才是我們整合 OpenLDAP ([SSO] 的主要目地)。

步驟10-3.手動設定 Samba 密碼 (自行選擇)

若是想手動修改 Samba 密碼則可執行如下指令來手動設定 Samba 密碼, 您或許會問為何是使用 echo 把密碼灌進去? 因為使用 smbpasswd 設定密碼會造成問題,詳細原因請參考 [ Smbpasswd -a USERNAME PASSWORD -- no longer works in samba 3.0.9!!!]

 #(echo 1234 ; echo 1234) | /usr/local/bin/smbpasswd -s -a weithenn

參考

[The Official Samba-3 HOWTO and Reference Guide]

[Samba-PDC LDAP howto]

[Samba & LDAP]

[Samba (v.3) PDC LDAP howto]

[用于 Samba 的基于LDAP 的身份验证(1)]

[酷!學園 samba 3.0 使用 LDAP 目錄認證(使用 RH 9.0)]

[Samba 和 Shell Script 的應用]

[twbsd.org 第二十章 SAMBA 網路芳鄰]

[Copy-Left » 關於 Samba 新舊版的帳號及密碼管理]

[passdb backend G 3.0.9]

[LDAP Account Manager]

[Bibby的學習筆記:Samba+OpenLDAP - Wiki.bsdlife.org]

[BUG s Living Diary - SAMBA as Primary Domain Controller, PDC]

[BUG s Living Diary - SAMBA Server With LDAP Password Backend Manual]

[FreeBSD Hypertext Man Pages smb.conf]

[原創 OpenLDAP + DNS + Samba + Postfix + OpenWebmail - ChinaUnix.net]

[游志峰的網路架設筆記 LDAP]

[SourceForge.net: Files IDX-smbldap-tools]

[smbldap-howto]

[SMBLDAP-TOOLS Installation Guide]

[酷!學園 :: 觀看文章 - 分享samba+ldap on freebsd 4.7 還請大家指正我的觀念]

[Samba 3 come PDC di una rete Windows]

[Jui-Nan Lin’s Blog » Blog Archive » Cracking Windows Passwords]

[Debian Samba 3 / LDAP / PHP LDAP Admin HOWTO]

[mkntpwd.tar.gz]

[ Smbpasswd -a USERNAME PASSWORD -- no longer works in samba 3.0.9!!!]

[Tsung's Blog: Samba utf8 設定]

Me FAQ

Q1.使用 smbpasswd -a 無法建 samba 帳號?

Error Meaage:

執行 smbpasswd -a weithenn 指令後無法建立 Samba 帳號並出現如下錯誤訊息?

 #smbpasswd -a weithenn                           //建立 Samba Account weithenn
 New SMB password:                                //輸入 weithenn 的 Samba 密碼
 Retype new SMB password:                         //再次確認密碼
 failed to bind to server ldap://filecenter.weithenn.org 
 with dn="cn=Manager,dc=weithenn,dc=org" Error: Invalid credentials
 Connection to LDAP server failed for the 1 try!
 Connection to LDAP server failed for the 2 try!
 Connection to LDAP server failed for the 3 try!
 Connection to LDAP server failed for the 4 try!
 Connection to LDAP server failed for the 5 try! 

Ans:

原因為在 smbpasswd -w 也就是要設定 LDAP Admin 的密碼時打錯了,所以當 Samba 要建 Account 時因為剛才 LDAP Admin 輸入的密碼錯誤而造成無法新增 Samba Account 資訊至 LDAP 內,重新執行上面【步驟5.將 LDAP Admin 密碼存入 Samba secrets.tdb 內】即可。

Q2.使用 smbclient 時 samba 無法認證使用者?

Error Meaage:

執行 smbclient -L filecenter -U weithenn 指令時 Samba 無法認證使用者並出現如下錯誤訊息?

 Error connecting to 192.168.1.8 (Connection refused)
 Connection to filecenter failed

並發現 Samba (smbd) 服務似乎沒啟動成功?

 #/usr/local/etc/rc.d/samba restart
 Performing sanity check on Samba configuration: OK
 smbd not running? (check /var/run/smbd.pid).          //發現 smbd 沒啟動成功
 Stopping nmbd.
 Removing stale Samba tdb files: ........ done
 Starting nmbd.
 Starting smbd.

Ans:

查後看發現 smb.conf 設定檔沒設定好,造成 smbd 服務並沒有啟動成功,所以當你執行 smbclient 時當然無法認證成功,請再啟動 Samba 服務之前可以使用 testparm 指令來檢查您所修改的 Samba 設定檔 (smb.conf) 內語法是否正確

 #testparm /usr/local/etc/smb.conf                    //檢查設定檔內語法是否正確

Q3.當 Samba 透過 LDAP 認證使用者時 ldap.log 發現索引有問題?

Error Meaage:

執行 smbclient 指令時雖然 Samba 可以透過 LDAP 正確認證使用者但發現 ldap.log 內似乎出現有關 Samba 屬性及索引的失敗訊息?

 Dec 11 09:44:23 filecenter slapd[34091]: <= bdb_equality_candidates: (sambaGroupType) index_param failed (18)
 Dec 11 09:44:23 filecenter slapd[34091]: <= bdb_equality_candidates: (sambaSIDList) index_param failed (18)
 Dec 11 09:44:23 filecenter slapd[34091]: <= bdb_equality_candidates: (sambaSID) index_param failed (18)
 Dec 12 15:18:23 filecenter slapd[34554]: <= bdb_equality_candidates: (sambaDomainName) index_param failed (18)

Ans:

此訊息為提示您將 Samba 相關常用屬性製作 LDAP 索引,若未製作該 LDAP 索引則雖然可以正確認證使用者,但會造成 LDAP 查詢效能及時間上負載加重,因此建議您還是建立相關的 LDAP Samba 索引吧。

 #vi /usr/local/etc/openldap/slapd.conf                          //修改 LDAP 設定檔
 index   sambaSID,sambaSIDList,sambaGroupType    eq,pres         //加入此行

修改完成後我們必須重建 LDAP 索引 (因為加入 sambaSID ...等選項) 及重新啟動 LDAP 服務

 #/usr/local/etc/rc.d/slapd stop                                 //停止 LDAP 服務 (重建 slapindex 索引前記得先停止 slapd 服務)
 #slapindex -f /usr/local/etc/openldap/slapd.conf                //重建 slapindex 索引
 #/usr/local/etc/rc.d/slapd start                                //啟動 LDAP 服務 

Q4.使 Samba 字元編碼支援 Big5 或 UTF-8?

Error Meaage:

由於之後有整合 FTP 服務至 LDAP 中,而採用的 [twbsd.org - SmbFTPD] 目前似乎尚未支援 UTF-8 字元編碼,因此此前實作中設定 Samba 字元編碼為 Big5。

Ans:

修改 Samba 設定檔 smb.conf 支援 Big5

 #vi /usr/local/etc/smb.conf
 display charset = big5                    //Samba 上所顯示的編碼
 unix charset = big5                       //FreeBSD 上所顯示的編碼
 dos charset = cp950                       //Windows 用戶端的編碼 (可正確顯示中文)

若要使 Samba 支援 UTF-8 就設定成這樣

 #vi /usr/local/etc/smb.conf
 display charset = UTF8                    //Samba 上所顯示的編碼
 unix charset = UTF8                       //FreeBSD 上所顯示的編碼
 dos charset = UTF8                        //Windows 用戶端的編碼 (可正確顯示中文)

Q5.smbpasswd 指令無法變更 Samba 密碼?

Error Meaage:

使用 smbpasswd 指令欲變更使用者的 Samba 密碼但失敗了?

 #smbpasswd -a weithenn 1234

Ans:

或許會問為何是使用 echo 把密碼灌進去? 詳細原因請參考 [ Smbpasswd -a USERNAME PASSWORD -- no longer works in samba 3.0.9!!!]

 #(echo 1234 ; echo 1234) | /usr/local/bin/smbpasswd -s -a weithenn
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com