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)。
- NFS:Unix-Like 間用來互相分享檔案系統資源的協定 (Unix-Like <-> Unix-Like)。
- Samba:Unix-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、參考
- The Official Samba-3 HOWTO and Reference Guide
- Samba & LDAP
- Samba 和 Shell Script 的應用
- twbsd.org 第二十章 SAMBA 網路芳鄰
- Copy-Left » 關於 Samba 新舊版的帳號及密碼管理
- passdb backend G 3.0.9
- LDAP Account Manager
- SourceForge.net: Files IDX-smbldap-tools
- SMBLDAP-TOOLS Installation Guide
- 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
- Smbpasswd -a USERNAME PASSWORD -- no longer works in samba 3.0.9!!!
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