OpenLDAP - Samba Auth With LDAP 設定

1、前言

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


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

  • 網路上的芳鄰: Microsoft Windows 機器間用來互相分享檔案系統資源 (Windows <-> Windows)。
  • NFSUnix-Like 間用來互相分享檔案系統資源的協定 (Unix-Like <-> Unix-Like)。
  • SambaUnix-Like 用來分享檔案系統資源給 Windows 機器存取的協定 (FreeBSD <-> Windows)。





文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.安裝 samba3 套件
          步驟2.複製 Samba Schema (綱要) 至 LDAP
          步驟3.修改 LDAP 設定檔 (slapd.conf)
          步驟4.修改 Samba 設定檔 smb.conf
          步驟5.將 LDAP Admin 密碼存入 Samba secrets.tdb 內
          步驟6.修改 rc.conf
          步驟7.啟動 samba 服務
          步驟8.建立 Samba Account 至 LDAP
          步驟9.測試 Samba 能否透過 LDAP 進行驗證使用者
          步驟10.使用者能透過 Web Mail 修改他們的 Samba 密碼
4、參考
5、Me FAQ
          Q1.使用 smbpasswd -a 無法建 samba 帳號?
          Q2.使用 smbclient 時 samba 無法認證使用者?
          Q3.當 Samba 透過 LDAP 認證使用者時 ldap.log 發現索引有問題?
          Q4.使 Samba 字元編碼支援 Big5 或 UTF-8?
          Q5.smbpasswd 指令無法變更 Samba 密碼?





2、實作環境

  • FreeBSD 6.1-RELEASE-p10
  • samba-3.0.23c_2,1





3、安裝及設定

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

步驟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 內容如下,在 include 中加入路徑以支援 Samba Schema,在 access 部份為隱藏密碼,最後加上 index 建立 LDAP Samba 索引,加快查詢效率及速度。
vi /usr/local/etc/openldap/slapd.conf
 include   /usr/local/etc/openldap/schema/samba.schema          //加入此行
 access to attrs=userPassword                                   //修改前
 access to attrs=userPassword,sambaLMPassword,sambaNTPassword   //修改後
 index   sambaSID,sambaSIDList,sambaGroupType    eq,pres        //加入此行

修改完成後我們必須重建 LDAP 索引 (因為加入 sambaSID ...等選項),先停止 LDAP 服務以準備重建 slapindex 索引前,完成重建後再啟動 LDAP 服務。
/usr/local/etc/rc.d/slapd stop                       //停止 LDAP 服務
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 做相關存取動作,下列為假設您的 LDAP Admin Manager的密碼為 1234 (-w PASSWORD ldap admin password)。
smbpasswd -w 1234     //LDAP Admin Manager的密碼為 1234
 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 名稱服務 (UNC Path)
 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





4、參考






5、Me FAQ

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

Error Message:
執行 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 Message:
執行 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 Message:
執行 smbclient 指令時雖然 Samba 可以透過 LDAP 正確認證使用者但發現 ldap.log 內似乎出現有關 Samba 屬性及索引的失敗訊息?
Dec 11 09:44:23 filecenter slapd34091: <= bdb_equality_candidates: (sambaGroupType) index_param failed (18)
Dec 11 09:44:23 filecenter slapd34091: <= bdb_equality_candidates: (sambaSIDList) index_param failed (18)
Dec 11 09:44:23 filecenter slapd34091: <= bdb_equality_candidates: (sambaSID) index_param failed (18)
Dec 12 15:18:23 filecenter slapd34554: <= bdb_equality_candidates: (sambaDomainName) index_param failed (18)

Ans:
此訊息為提示您將 Samba 相關常用屬性製作 LDAP 索引,若未製作該 LDAP 索引則雖然可以正確認證使用者,但會造成 LDAP 查詢效能及時間上負載加重,因此建議您還是建立相關的 LDAP Samba 索引吧。
vi /usr/local/etc/openldap/slapd.conf
 index   sambaSID,sambaSIDList,sambaGroupType    eq,pres    //加入此行

修改完成後我們必須重建 LDAP 索引 (因為加入 sambaSID ...等選項) 及重新啟動 LDAP 服務
/usr/local/etc/rc.d/slapd stop                    //停止 LDAP 服務
slapindex -f /usr/local/etc/openldap/slapd.conf //重建 slapindex 索引
/usr/local/etc/rc.d/slapd start                   //啟動 LDAP 服務 




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

Error Message:
由於之後有整合 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 Message:
使用 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