- 论坛徽章:
- 0
|
解放微軟下的王國
由 HK.Samba.Org 成立到現在,自己和不同的會員都有談及 Samba 的發展和發展方向。
但是往往發覺會員最不能了解的部份就是 Samba 中 Domain Control 的部份。
其實也難怪的,因為 Samba 中有關 Domain Control 的部份是 Samba 3 發展歷程
中重要一環,相比在 Samba 2 的世界下, Domain Control 的發展可以算是一個巨大的
跳躍。
另外 Domain Control 中也可算是 Samba 3 中最難理解的一部份,因為內含有與其它
服務的配合,例如︰ Kerberos (這一隻看守地獄的三頭狗,也可以算是在 Unix 界中最
難攪的服務。),又例如︰ LDAP (這又是另一令人又愛且恨的服務。因為在 Unix 界中
,這也是可以算是第一或第二今人頭痛的服務。這包括設定和資料維護,可算是一項不輕的工
作。)這更加深了 Samba 3 在 Domain Control 上的神秘感。
但是這一場演講會下,我們嘗試就這一方面作了一定量的了解。
首先我們還是先看一看這演講會的講題︰ Free Microsoft Kingdom 。
這令我想起一個大問題?究景微軟下的王國是一個什麼樣的王國?如果不能回答這個問題,
那又可言「解放」?
當我們想起微軟王國,這其實有很多不同的人對這王國有不同的思考,這都是合理的;如果你的
腦海浮起了這樣的圖片可以說是一點也不出奇怪的。
一個對建制的迷思。
但是如果我們只抱著這個取向來認識他,那可能我們一直也不能真了解他。所以我們還是要問我們要怎樣理解
才合理。
我想我們還是不能離開一個最重要的問題,這也是這王國最基本的組成部份 —— Domain (網域)
如果你們要問我一個問題,
這是一個很淺\白的問題︰「如果微軟比 Unix 優勝的話,那優勝的地方在那裏?」
當然這問題也會有很多不同的答案!例如︰使用者環境...這都是不爭的事實,但是最令我著迷的是 Domain (網域)
的理念。(如果你是 Unix 或 Linux 死硬派的話,請原諒我在這裏稱讚 Microsoft 。)
在我們還未進入考慮網域的理念時,我們先作一個更大的思考。一個稱為 Trust Domain (信任網域)的思考!
在微軟王國中基本的單位是網域,但只是這樣的在網域之間還可以產生一定的關係和聯係的。
這可以稱作信任網域。當然在 Active Directory 中的理念下這會有所不同,因為在
Active Directory ,你可以用另一眼光來看網域這問題;比較合理的是把它看作一個巨大的
樹木,而這樹木中,你可以把不同的分支分割出來,然後讓不同的 Domain Control (網域控制伺服器)來作管理,而所
管理的部份又各自連接於這樹木下。(在這文中所言的信任網域的結構是根躆 NT4 網域
結構而言的。)
在信任網域下,你或許可以把它思考成為不同的大蛇;各自把尾巴連結起來。
在這結構下,每一網域控制伺服器皆把在網域下的資料與其它的網域控制伺服器作分享。
但跟著來的問題有兩個︰
第一個問題是︰在網域下有什麼資料?他們可以作分享。
第二個問題是︰如何分別在不同網域下的資料?網域控制伺服器如何分別這一筆資料是屬於網域 A ,而不是網域 B ?
說實在第二個問題比較容易回答。要分別不同網域下的資料,其實依從的不同網域下的 SID
(Security Identifier) 就可以辦到了。你可以嘗試在 Samba 3 下執行這個指令;那你就可以提
取你 Samba 網域下的 SID 了。
# net getlocalsid
SID for domain KRB is: S-1-5-21-2539658682-2581673518-1142642392
#
這裏你或許應該留意這是一很長的一組號碼,而且每一網域下的 SID 也不同。另外在網域下
每一帳號都是以網域的 SID 作起始,而產生其它不同物件的 SID 。因此這就很容分別出這筆資料或是物件屬A 網域還是屬於 B 網域了。你可以用以下的指令查詢 Samba 伺服器下帳號之資料,而其中更包含了帳號 SID 。
# pdbedit -L
root:0:root
# pdbedit -v root
Unix username: root
NT username:
Account Flags: [U ]
User SID: S-1-5-21-2539658682-2581673518-1142642392-1000
Primary Group SID: S-1-5-21-2539658682-2581673518-1142642392-1001
Full Name: root
Home Directory: \\\\krb\\root
HomeDir
Drive:
Logon Script:
Profile Path: \\\\krb\\root\\profile
Domain: KRB
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Sat, 14 Dec 1901 04:45:51 GMT
Kickoff time: Sat, 14 Dec 1901 04:45:51 GMT
Password last set: Mon, 23 Feb 2004 11:33:24 GMT
Password can change: Mon, 23 Feb 2004 11:33:24 GMT
Password must change: Sat, 14 Dec 1901 04:45:51 GMT
#
這裏你可看見使用者帳號 root 的 SID 是 S-1-5-21-2539658682-2581673518-1142642392-1000
而這 SID 的開始亦是和 Domain 的 SID 是相同的。只有最後的一組數字不同,這不同的就是
1000 ;這不同的一組數字可稱作 RID 。在這裏 root 的 RID 是 1000 。
第二個問題就比較上複雜,也難以回答;或許我們還是回到 Samba 下尋找答案。當你執行 smbpasswd
時,你或許會發現有如下的 options .
$ smbpasswd -h
...
......
options:
...
......
extra options when run by root or in local mode:
-a add user
...
......
-i interdomain trust account
-m machine trust account
...
......
$
在 smbpasswd 下,你可以找到三種不同的使用者帳號。
使用者帳號 ( user account )
信任電腦帳號 ( machine trust account )
信任網域帳號 ( interdomain trust account )
在這裏你可以思考就是使用者帳號之存在問題,首先使用者帳號是相關於使用者的帳號模
式;這不只存在於 Microsoft 網域世界,其實這也存在於 Unix 的世界內。
這是當一使用者希望提取一服務時,服務器必須確認提取服務的就是使用者帳號下所登錄
的使用者,而不是一個惡意的攻擊者。
服務器如何能分辨這個差異?這主要就是倚靠服務器本身首先登錄使用者的資料,然後
如果使用者能夠在提取這個服務的時候,能提供的資料和服務器本身所登錄之資料吻合的
話,服務器本身就會為正確提供資料的使用者服務。
這不只在於 Microsoft 網域,其實當你去任何一網上服務者,而它又要求代登入使用的
時候,你也會面對使用者帳號的使用和管理的問題。
另外什麼是信任電腦帳號?
要了解信任電腦帳號的話,你或許要先理解在 Microsoft 下的 Domain Logons (網域登入) 服務。
Microsoft 下的網域登入服務
Microsoft 網域下是把伺服器和桌面系統完全分開的。這不像 Linux 伺服器,因為
你可以想像 Linux 的桌面系統下可以安裝不同的伺服器系統,例如︰Mandrake 和
Debian 下,他們完全可以在安裝程式時安裝不同的伺服器系統和桌面用戶程式。
其實在某些 Linux 的版本下,他們是把桌面系統和伺服器系統分開的,例如︰
紅旗 Linux ,他把桌面系統和伺服器系統分開在不同的安裝光碟上,但是這也不是如
Microsoft 形式下的把伺服系統和桌面系統不同的分別。因為在這上面的分別只是安裝
上的分別,而 Microsoft 在這裏的分別是在於網域登入上。
做一個簡單而有關網絡身分的實驗
在 /etc/samba/smb.conf 下的 [global] 部分中加入或修改這樣的幾行。
[global]
...
......
domain master = yes
preferred master = yes
domain logons = yes
security = user
......
...
然後你可以執行 testparm 來測試你的 samba 系統。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions
......
你可以在這裏看見你的 Samba 會把自己看作是 PDC ,當然這也是 Microsoft 網域下
的網域控制服務器。
第二步驟,修改 /etc/samba/smb.conf ;只要把 domain logons 的設定作 no 。其它的設定也不需要作出更改。
[global]
...
......
domain master = yes
preferred master = yes
domain logon = no
security = user
......
...
這樣當你再次執行 testparm 來測試你的 samba 系統。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
......
這時你可以看見你的 Samba 伺服器己改變了身份。在這裏它己變成了 STANDALONE 的機器,而失去了網域控制伺服器的尊貴身份。
再次修改你的 smb.conf 檔案︰
[global]
...
......
domain master = yes
preferred master = yes
domain logon = no
security = domain
......
...
這次只修改了 security 的設定,而其它的卻不作修改。現在你可以再用 testparm 來
檢查你的 samba 系統。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions
......
這次得出來的結果顯示了 Samba 不再是 STANDALONE 了,而又變身成為
DOMAIN_MEMBER 。
Microsoft 網域下的 DOMAIN_CONTROLER 和 DOMAIN_MEMBER (網域成員)
Microsoft 網域下的網域控制伺服器就是以 DOMAIN CONTROLER 的身份存在在網域下。
(而 PDC 就是其中一類形的 DOMAIN CONTROLER ,而 BDC 又是另一類形的
DOMAIN CONTROLER ,下文會再言 BDC 的設定。)
Microsoft 網域下的桌面系系統就是以 DOMAIN_MEMBER 的身份存在在網域下。
(例如 NT workstation,或者 Windows 2000 Prefessinal 和 Windows XP Prefessinal
。他們就是以 DOMAIN_MEMBER (網域成員)的身份存在。
DOMAIN_MEMBER 和 DOMAIN CONTROLER 有什麼分別?讓我們從使用者的角度下
思考這問題。
使用者和 DOMAIN_MEMBER
當使用者使用 Microsoft 網域下的資源時,他們一定會使用某台電腦的(或電腦類形
的配備,或許未來執行 CE 的手帳也可以作網絡登入之用!)。他們絕不可能在只是坐在椅上而不需要透過使用電腦就可以使用網域下的檔案目錄吧!
當使用者使用某台電腦時,很多時候在開始使用時,他們也需要輸入使用者名稱和
使用者帳戶所登錄的密碼。就如使用者帳號下所記錄的!但是問題卻在如果使用者在登入的
時候選擇了某網域作為登入的話,那他所登入的電腦本身就很有可能是沒有記錄這使用者帳號
的資料,而記錄這資料的責任卻是遠端地存放在 PDC 和 BDC 內的,好了讓我們站在
DOMAIN_CONTROLER (網域控制伺服器)的角度來想想這事情。
DOMAIN_CONTROLER 和 DOMAIN_MEMBER
當我們站在 DOMAIN_CONTROLER 的角度下來想這事情的話;就好像在網域下有一台電腦
拿著某人的資料包括這人的登入名稱和密碼來向你作出登入的要求!好了如果這台電腦是一台含有惡意的電腦,
而且它是被一個惡意的攻擊者所控制(或許這真是一個信任的使用者,但卻坐在一台你不能信任的電腦下!),那這個惡者攻擊者很有可以是為了破解某人的使用
者密碼而來,所以 DOMAIN_CONTROLER 是不能在任何電腦對他作詢問時,他都坦誠\以告的。
如何可以分辦 DOMAIN_MEMBER 是否可以信靠的電腦?這個答案就是信任電腦帳號。
信任電腦帳號的組成
如何在 Microsoft 網域下達成信任電腦的關係?(我想你可以把它看作成一個
關係,因為如果網域下有兩台 Microsoft 或者 Samba 伺服器,但這不能算是能夠達成
信任電腦帳號,因為這兩台電腦可以獨立成為 STANDALONE 級數的伺服器,而不是構成
信任電腦的關係即 DOMAIN CONTROLER 和 DOMAIN MEMBER 的關係;不使用這關係的話;會引致很多不良的影響!這可以普遍見於不同大少的公司。(他們都可以在不同部們,不同的
分公司的地址下都有很多不同的電腦在運\作;但是當中卻沒有把它們的權責分別清楚,
這些伺服器都需要保存一組的使用的電腦帳號,而且當一些使用者會同一時間,或不同
的時間下接觸多於一台伺服器時,這些伺服器甚至需要把使用者的資料作多於一次的登
錄,當然每多一次的登錄,這會使得使用者在修改自己的密碼時,他就要到不同的伺服器下修
改他們帳號內的使用者密碼。這些都會加深管理的難度!)
在建立信任電腦帳號的關係時,在 Microsoft 的網域下需要有起碼兩台電腦。一台是
PDC ,另外一台成為 DOMAIN_MEMBER 。還有一個很重要的步驟,就是 join DOMAIN 的
步驟。
信任電腦帳號的組成 (PDC)
在這裏先設定你的 PDC 。也先看看你的 /etc/samba/smb.conf 。
[global]
...
......
domain master = yes
preferred master = yes
domain logons = yes
security = user
add machine script = /usr/sbin/useradd %u
......
...
以上的設定是把你的 Samba 設定成為 PDC ,後再加上一 add machine script 的
option . 這會使到你的 DOMAIN_MEMBER 作 join DOMAIN 時,使你的 PDC 自動地在 Unix 或 Linux 系統下產生你 DOMAIN_MAMBER 的電腦帳號。
信任電腦帳號的組成 (DOMAIN_MEMBER)
好了另外我們要來看一看 DOMAIN_MEMBER 內的 /etc/samba/smb.conf 的設定︰
[global]
...
......
domain master = no
preferred master = no
domain logons = no
security = domain
add user script = /usr/sbin/useradd %u
......
...
基本上如果你的 Samba 是作 DOMAIN_MEMBER 的話,原則性地你的 Samba 就不需要成
為 domain master (網域控制伺服器),亦不需要成為 preferred master ,當然你亦不需要作 domain logons (在網域上提供網域登入)
伺服器。你亦可以不把這些 Options 作出設定的,但要記得把 security 的設定設定作
domain ,就可以了。(這也是使你的 Samba 成為網域成員的最重要一環,這代表著你的 Samba 願意提供服務給網域控制器下所登錄的使用者。)
增加使用者程式 (add user script)
另外有個設定,你可能需要加在你網域成員的 smb.conf 內的
\"add user script\" 。
為什麼要加入這設定?(其實你可以使用 winbind 來取替這設定的。)
或許你會思想一個問題,如果在網域的 PDC 帳號內有某使用者 frankie 的帳號,但是
這帳號卻不存在在網域成員的 Unix 或 Linux 帳號內,那你的網域成員(如果它是執行 Samba 系統)就不能容
容 frankie 提取網域成員機器內在網域上所分享的網域資源。因為 frankie 在提取
網域成員下的資源時,你的 Samba 卻不知道 frankie 應在 Unix 或 Linux 下
應使用什麼使用者和群組的權力來提取資源。所以沒有它途,只有就是不提供服務給 frankie 。但是如
果在你 Samba 下的 /etc/samba/smb.conf 下加入 add user script 的時候,
那當網域成員( Samba )發現 frankie 是存在於網域控制伺服器內,更能通過認証;卻又發現在
自己 Unix 或 Linux 系統下卻沒有 frankie 使用者存在,那網域成員 Samba 就會用 \"add user
script\" 的程式來在 Unix 系統內加建 frankie 的帳號,這樣 frankie 就能在 unix
系統下存在了。因此網域成員在遇上 frankie 來提取網絡資源時,就可以使用
新增的帳號的使用者權限和群組權限來提取。
參加 ( Join ) 網域
當你設定好主網域控制伺服器和網域成員這兩台(Samba)伺服器,那你還需要一個簡單的步驟;這簡單的步驟就是參
加網域(Join Domain)的過程。(暫時集中在討論 rpc 級數的 Join Domain,另外亦集中論討在 Samba 3 下 Join Domain 的情況。)
在 Samba 3 中如果要達成參加網域的動作時,你首先要理解三件事。
-> 首先你要把你的網域成員加入到什麼 Domain 下。其實你也能理解,如果你要加入到 HKSAMBA
Domain 下,和當你加入到 GODCLICK Domain 下,這是兩件不同的事情的。要設定你的網域成員要加入何網域,這可以在網域成員下的 /etc/samba/smb.conf 的 workgroup 設定作修改。
-> 另外你要知道在那主網域控制伺服器(PDC)下,最高權力者的使用者帳號密碼。在不同的伺服器系統下這個最高權力者的帳號名稱各有不同,例如︰在 Microsoft 下,最高權力者是 Administrator ,而在 Samba 系統下最高權力者,即是 Unix 或 Linux 下的最高權力者︰ root 。
-> 第三樣事情就是當加入網域時所選擇的保案級數。(在 Samba 3 下
你可以選擇的保案級數是 rpc、 rap 和 ads 。在這裏暫時只集中在 rpc 保案級數上。)
在這裏保安級數不同於 smb.conf 下的 security 的設定。
在這裏我們嘗試把我們的 Samba 伺服器 ( DOMAIN_MEMBER )加入網域中。
# net rpc join -U root -w 123456
Joined domain HKSAMBA.
#
在這裏你需要使用在你 Samba 機器下,使用 root 的帳號,然後執行 net 的指令。
net 的指令下,你需要選擇保安級數,這裏所選擇的保安級數為 rpc 。(這是和 NT4 同等
級數。),後使用 join 的指令,表示你打算把你的 Samba 伺服器加入到網域下,之後你要在 net 指令下告訴你的 Samba 系統,當他打算 Join 入 Domain 時,使用什
麼使用者帳號。因在此你打算把你的 Samba 伺服器加入到 Samba 所管理的網域,所以最高權力的使用者帳號為 root ,而 -w 這個設定所加入的是這個帳的使用者密碼。(這密碼不是 root 下的系統密碼,而是 Samba passdb 下的使用者密碼。所以很有可能需要你先把 root 的帳號加到你的 Samba passdb 下,你可以使用 \'pdbedit -a root\' 來達致。)
當你的 Samba 伺服器能成功參與該網域,你就會接收到你成功參與的信息。
另外你也可以嘗試使用主網域控制伺服器下的使用者帳號資料來登入你網域成員的電腦。(這不需要理會這網域成員下的 Samba 伺服器有否這使用者帳號,也不會理會這網域成員下這使用者帳號的密碼有否和主網域控制器下的相同與否,也會完全使用網域控制器下的 passdb 使用者帳號資料作 Samba 認証之用。
發生在參與網域行為下
當你實現了參與網域行為,即把網域成員參與了網域後,有什麼特別的事情會發生?
要了解這事情,你可以從網域控制器下去了解它,另一方面亦需要從網域成員的角度下去了解它。
發生在參與網域行為下的網域控制器
當你的網域成員參與了網域時,你可以發現在網域的網域主控伺服器下自動地加入了一個信任電腦帳號。你可以用 pdbedit 瀏覽你網域 PDC 下的帳號戶口列表。
# pdbedit -L -w
member$:1001:BB6FA10D4DD129BA7CD0EAC7B36D5E5C:
70595DCF510FD294D987EBFB004FA75F:[W ]:LCT-4092041F:
root:0:44EFCE164AB921CAAAD3B435B51404EE:
32ED87BDB5FDC5E9CBA88547376818D4:[U ]:LCT-40920331:
#
在這裏你可以發現你的網域控制伺服器下加入了一個帳號,而這個帳號是信任電腦帳號,而這個帳號的名稱為 member$ 。(如果不是使用者帳號的話, Samba 是會在這個帳號的結尾加上一個 \'$\' 的字原的,而另外在 Samba 下,每一個帳號都有一個旗號的,而這 member$ 的帳號旗號為 \'W\' ,即表示這帳號為一信任電腦帳號。這也是所有發生在網域控制伺服器下的事情,當然要令網域控制伺服器能成功建立這一帳號,也是需要像前文所說在 /etc/samba/smb.conf 中加入 \'add machine script\' 的設定。
發生在參與網域行為下的網域成員
另一方面可能你也會可翻查在網域成員的改變,但是我想你還是先思考當中的可能轉變。
有什麼是可能轉變的?我想只有兩項。
-> 記錄著主網域控制伺服器下對這帳號所設定的密碼。
-> 所登入網域的 SID ,這兩項資料。( SID 是網域中最基本的資料,所以網域成員也自然要知道這資料,好分別他是加入何網域的。)
但是這密碼究景收在那檔案內。如何可以發現這密碼?先首要了解 Samba 大部資料是收在 tdb 資料檔案下的,這信任電腦密碼也不例外。你可以翻查不同 tdb 檔案,看密碼收在那檔案下。(在這裏可以先告訴你這密碼是收在 /var/lib/samba/secrets.tdb 下,另外你可以用 tdbdump 來查看這檔案。)
# tdbdump /var/lib/samba/secrets.tdb
{
key = \"SECRETS/MACHINE_LAST_CHANGE_TIME/HKSAMBA\"
data = \">\\04\\92@\"
}
{
key = \"SECRETS/MACHINE_SEC_CHANNEL_TYPE/HKSAMBA\"
data = \"\\02\\00\\00\\00\"
}
{
key = \"SECRETS/MACHINE_PASSWORD/HKSAMBA\"
data = \"-gguYvmRBBx6IH\\00\"
}
{
key = \"SECRETS/SID/MEMBER\"
data = \"\\01\\04\\00\\00\\00\\00\\00\\05\\15\\00\\00\\00\\0F\\DF\\D9\\0DB\\B3\\AE\\
D0\\CC\\FEK\\C8\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00
\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"SECRETS/SID/HKSAMBA\"
data = \"\\01\\04\\00\\00\\00\\00\\00\\05\\15\\00\\00\\00\\
D9\\D7\\E0D\\01;x\\B3\\ED\\844\\17\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00
\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"INFO/random_seed\\00\"
data = \"O\\07\\00\\00\"
}
#
當然有了這樣的一個密碼後,網域成員就可以提取了在網域控制伺服器下所記錄的使用者資料了。
什麼是信任網域帳號?
要了解信任網域帳號,你可以依從了解信任電腦的邏輯來了解它。
另外在這裏有一些持別地方可以加以注意的。首先在兩個互相信任的網域下,大家應有相同的級別。還記得蛇咬著蛇這個圖案嗎?他們大家是平等共存的。在這前題下,你可以想像的就是在不同的信任網域下皆需要為不同的信任網域加上另一信任網域的〔信任網域帳號〕,另外亦需要作申請信任的動作。
其實也可以作單方面的信任,即 A 網域建立了 B 網域的〔信任網域帳號〕,而在 B 網域卻沒有建立 A 網域的〔信任網域帳號〕,另外 B 網域申請了 A 網域的信任,但是 A 網域卻沒有申請 B 網域的信任,這情況絕對會存在的!如是這樣,那 A 網域的使用者帳號資料就可以給 B 網域來取用,而 B 網域的使用者帳號資料卻不能被 A 網域取用;這意味著 A 網域的使用者可透過 B 網域下的網域成員來登入 A 網域,也作表著 B 網域下的網絡資源也可分配合 A 網域下的使用者使用。反之卻不能。
新增信任網域帳號
如果你想理解信任網域帳號,或許你可以從新增網域帳號來理解它。
這是沒有自動新增信任網域帳號的程序呼叫的,你需要手動地增加它。在這過程中你會有幾個不同的過程,你需要依從的。
在這例子裏有兩個網域,一個網域稱為 GODCLICK ,而另一個網域稱為 HKSAMBA ,現在打算使 HKSAMBA 網域信任 GODCLICK 的網域。
-> 首先第一步先在 HKSAMBA 的主網域控制伺服下的 Unix 或 Linux 系統下新增一個使用者帳號代表著這個信任網域。(如何設定主網域控制伺服器,你可以留意前文的內容。)
# useradd godclick\\$
#
在這裏加入的使用者帳號是信任的網域名稱。(現在的例子是︰ GODCLICK )但記緊在信任的網域名稱後加上 \'$\' 字原。(但因為 \'$\' 字原在 Unix 或 Linux 的 Shell 下是一特別的字原,因此需要在這字原後加上另一保留字原 \'\\\' 。)
當你完成了這一個 Unix 下的使用者帳號後,你可以檢查一下這使用者帳號是否被建立成功。
$ getent passwd | grep godclick
godclick$:x:1003:100::/home/godclick$:/bin/bash
$
另一步驟就是建立信任網域帳號在 HKSAMBA 的主網域控制伺服器之 Samba 伺服器的 pdbedit 內。
# smbpasswd -a -i godclick
New SMB password:
Retype new SMB password:
Added user godclick$.
這一次的加帳號指令是 smbpasswd 而不是 pdbedit ,而且一定要使用主網域控制伺服器下的 root 帳號來新增信任網域帳號,另外這裏的網域名稱是不需要再加上 \'$\' 字原在最後部份的。但是當 smbpasswd 知道你在新增信任網域帳號時,他就會在這個帳號的最後方加上 \'$\' 的字原。另外記得在這裏你是需要加入密碼的,這密碼也是在 GODCLICK 網域申請加入 HKSAMBA 網域時所必須要提交的的
做完這些預備功夫後,你可進行信任網域的過程了。
信任網域過程
好了在 GODCLICK 之 PDC 執行 net 指令如下︰
# net rpc trustdom establish hksamba
Password:
[2004/05/03 15:49:20, 0] utils/net_rpc.c:rpc_trustdom_establish(2106)
Success!
#
這裏你會發現在 net 指令是需要你加上密碼的,但是要加上什麼密碼?
在這裏你所加上的密碼是你在執行 \'# smbpasswd -a -i godclick.net\' 所加上的密碼。
另外你在這裏接收到 Success 的信息時,即表示你已成功地把建立了網域信任的關係,
但是你要留意在此時,網域 godclick 能夠查詢 hksamba 的網域使用者資料,但是 hksamba 卻仍不能查詢 godclick 網域之資料,因為這裏只建立了 hksamba 對 godclick 的信任,
卻沒有建立 godclick 對 hksamba 的信任。
測試信任網域
我想當你建立了信任網域時,或許你需要作這方面的測試。
你可以先在網域 GODCLICK 的 PDC 下作使用 smbclient 來作測試。
# pdbedit -L
Unable to open/create TDB passwd
# smbclient -W HKSAMBA -U root -L localhost
Password:
Domain=[GODCLICK] OS=[Unix] Server=[Samba 3.0.2-Debian]
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
IPC$ IPC IPC Service
(workstation-178 server (Samba 3.0.2-Debian))
ADMIN$ IPC IPC Service
(workstation-178 server (Samba 3.0.2-Debian))
root Disk Home Directories
Domain=[GODCLICK] OS=[Unix] Server=[Samba 3.0.2-Debian]
Server Comment
--------- -------
WORKSTATION-178 workstation-178 server (Samba 3.0.2-Debian)
Workgroup Master
--------- -------
GODCLICK
#
你可以先使用 pdbedit 來檢查你的使用者帳號,在這裏你會發覺在你 GODCLICK 是完全
沒有使用者帳號的,所以在這裏回報了一個錯誤的信息(Unable to open/create TDB passwd )但是你卻可以使用 root 的使用者帳號來查詢 PDC 的網域資源。在
smbclient 下,你會發覺加上了 \'-W hksamba\' 的設定,這設定告訴 smbclient 在查詢帳號時使用 HKSAMBA 網域的使用者帳號。
在信任網域下的帳號密碼
在這裏或許有朋友會詢問為何 GODCLICK 網域下沒有使用者帳號,但是仍能查詢 HKSAMBA 網域下的使用者帳號,那麼信任網域帳號在 GODCLICK 下存在在何處?以致它能查詢 HKSAMBA 網域之資料。
當你在 GODCLICK 之 PDC 下執行了 \'net rpc trustdom establish\' 後,你可以在
/var/lib/samba/secrets.tdb 檔案下找到這帳號的碼密資料。
# tdbdump /var/lib/samba/secrets.tdb
{
key = \"SECRETS/SID/GODCLICK\"
data = \"\\01\\04\\00\\00\\00\\00\\00\\05\\15\\00\\00\\00:\\84\\9A\\15S\\
F6\\ED\\5C\\BF\\B22U\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"SECRETS/$DOMTRUST.ACC/HKSAMBA\"
data = \"\\08\\00\\00\\00H\\00K\\00S\\00A\\00M\\00B\\00A\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\06\\00\\00\\00123456\\00\\80\\F9\\95@\\01\\04\\00\\00\\00\\
00\\00\\05\\15\\00\\00\\00\\D9\\D7\\E0D\\01;x\\B3\\ED\\844\\17\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"INFO/random_seed\\00\"
data = \"O\\07\\00\\00\"
}
#
在這裏你會發覺在這裏 Key 的 \"SECRETS/$DOMTRUST.ACC/HKSAMBA\" 所指著的 Data 這是這個信任網域的密碼。
一些特別的事情有關信任網域
首先你要理解信任網域是在不同的網域下的使用者可以使用不同網域下的資源,如果這是事是發生在 Microsoft 的網域下的話,這會因為使用者擁有唯一而且不同的 SID ,以作分別;所以不同的網域下的使用者帳號有完全不同的使用者權力。但是在 Samba 網域下卻有一問題,就是因為不同的使用者帳號需是有不同的 SID ,但是在 Samba 伺服器下卻會把這個使用者帳號轉換成 Unix 使用者帳號,在這裏很多時候不是依從 SID 來處理,而是使用使用者的帳號的登入名稱來轉換,因此在 HKSAMBA 網域下的使用者 root 和 GODCLICK 網域下的使用者 root 在同一台 GODCLICK 之網域主控伺服器的 Samba 在 Unix 或 Linux 系統的層面上卻擁有了相同的使用者權力,因為這兩帳號在登入時都是使用了 root 來作帳號登入名稱。
Samba 的網域資料和 tdb files
Samba 的網域控制伺服器 PDC ,當中有不少的使用者帳號的資料結構;當中有很大情度是與 Unix 伺服器是有很大的差別的,因此 Samba 在這方面有它自己不同的資料庫,這主要是把資料放在 tdbsam 內的,也是 tdb file 內。這是一個很簡單的資料結構檔案,是由 Key 和 Data 來組成的,而在每一個 tdb files 內的 Key 是唯一的。即是說沒有任何一筆資料是擁有相同的 Key 的,另外你可以使用 tdbdump 這工具指令來翻查 tdb 資料庫的內容。(如上文所示)
Samba 有很大量之資料是使用 tdb 資料庫來存放,而且在未來的日子裏 samba 仍會大量使用 tdb 來存放資料,但是在使用 tdb 來存放資料,卻會面對不同的問題:
-> tdb 資料庫不是一網絡形態之資料庫,因此在使用 tdb 資料庫時,只能在單一台 Samba 中使用,而另一台 Samba 伺服器卻不容易查詢另一台 Samba 下的 tdb 資料庫內的內容。
(但你可以想像的就是網域下某些資料是不完全隸屬於此一網域下的網域控制器,而是隸屬於這整個網域。例如︰使用者帳號,群組資料和 SID 對 Unix id 的對比表格。)
-> tdb 資料庫亦沒有提供一簡易的備份方法,當然更沒有主伺服器和副伺服器資料處理上的分別。
因此要可能要管理者另外建立一方式來完成 PDC 和 BDC 伺服器的備份和設定。
-> tdb 資料庫的結構是不容理解的,亦不容易透過直接修改資料庫的資料內容以作維護的。(當然 Samba 仍提供不同的指令讓你修改當中的內容,而且直接修改資料庫的資料內容,亦容易產生不必要的錯誤。)
OpenLDAP 與 Samba 的網域資料
在 Samba 下,除了使用 tdb database 來存放網域之資料外,亦可使用
OpenLDAP
來存放這方面的資料。
為什麼使用 OpenLDAP 來存放網域資料
因為
OpenLDAP
是一善於存放網域資料的伺服器,它亦是一網絡形態的伺服器;所以在網絡下不同的 Samba 亦可以同一時間查詢
OpenLDAP
內的資料內容,達致資料同步的目的。
另外在服務結構上,OpenLDAP 是有主和副伺服器之分工,而且當 Samba 無法查詢主伺服器時,他可以自動地查詢副伺服器;這使得備份和失效處理上更容易辦到。
另外主網域控制器和副網域控制器能同時查詢
OpenLDAP
內之資料庫,產生平衡負載的效果;這使得查詢服務的時間縮短。
Samba 下的 samba.schema
要讓
OpenLDAP
能給予 Samba 作查詢,首先要考慮的就是如何把 Samba 網域資料存放在
OpenLDAP
內。
在這方面,你需要先理解的就是
OpenLDAP
下如果需要存放不同的資料,首先要在
OpenLDAP
伺服器定義這資料結構,這方面稱作 Schema 。當然 Samba 的 Schema 資料結構是不需要自
己來定義它!在網絡上,你可以找到這 Schema ,或許你在安裝 Samba 時;你的 Linux 或 Unix 系統亦會替你安裝在你的伺服器檔案系統下。另外你可以把 Samba 的原程式碼的 tar.gz 檔案內找到。
./examples/LDAP/samba.schema
另一方面你要留意的是這 samba.schema 在 Samba 2.2.* 和 Samba3 是不同的,亦有不同的結構,所以不要 Samba 2.2.* 的 samba.schema ,使用在 Samba 3 下。(在這裏主要是集中在 Samba 3 下來討論它。)
Samba 下的 samba.schema 結構
如果你打開 samba.schema 來看看的話,(我十分鼓勵你看看這檔案。)你會發現在這檔案下定義了不同的 objectclass .
-> sambaSamAccount 這是你會遇上的第一個 objectclass ,這是用來存放網域下的使用者資料的。
-> sambaGroupMapping 這是用來存放網域下群組資料及對應到 Unix 系統下的 gid 的對應表。
-> sambaDomain 這是用來存放網域下的 SID 和 RID 之資料。(這方面之資料有助建立主和副網域控制器。)
-> sambaUnixIdPool,sambaIdmapEntry 這兩個 Objectclass 是用來存放網域上的 SID 和相對應之 Unix 下的 uid 之資料,這主要是給予 Winbind 作查詢之用。
Samba 下 OpenLDAP 的基本設定
在這裏開始設定
OpenLDAP
伺服器,容讓 Samba 來進行查詢和維護。
OpenLDAP
伺服器的名稱為 slapd ,而它的設定檔案存放在 /etc/openldap/slapd.conf
或者在 /etc/ldap/slapd.conf 。
這裏是我 Linux 下的 /etc/ldap/slapd.conf 。
allow bind_v2
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/samba.schema
schemacheck on
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd.args
loglevel 0
modulepath /usr/lib/ldap
moduleload back_bdb
backend bdb
database bdb
suffix \"dc=swpearl,dc=com\"
directory \"/var/lib/ldap\"
index objectClass eq
lastmod on
access to attribute=userPassword
by dn=\"cn=admin,dc=swpearl,dc=com\" write
by anonymous auth
by self write
by * none
access to * by
dn=\"cn=admin,dc=swpearl,dc=com\" write
by * read
在這裏你可以留意在 include 的關鍵字下你可以發現這一行:
include /etc/ldap/schema/samba.schema
這一行的意義就是說把 /etc/ldap/schema/samba.schema 加入
OpenLDAP
的 schema 資料庫內。
另外也把我伺服器下的 ldap 資料庫的資料列舉如下:
# ldapsearch -xw 123456 -D \'cn=admin,dc=swpearl,dc=com\' \\
> -LLL -b \'dc=swpearl,dc=com\'
dn: dc=swpearl,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: swpearl.com
dc: swpearl
dn: cn=admin,dc=swpearl,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e2NyeXB0fTBWS3J4Q8hBYXVlQVk=
#
暫時這個資料庫仍是十分簡單,只有兩筆資料;而且在查詢過程中,你可以發現你的最高權力的 dn 為︰cn=admin,dc=swpearl,dc=com ,另外他的密碼為 123456 。另外的伺服下的 suffix 是 dc=swpearl,dc=com 這些資料對你設定 ldapsam 是十分重要的。因為 Samba 是需要知道應使用什麼使用者和密碼來查詢 LDAP 伺服器的,另一方面亦需要知道網域資料應放在何子葉下的。
設定 Samba 使用 OpenLDAP 作網域資料存放
設定好了
OpenLDAP
伺服器,然後要再到設定 Samba 。如果要設定 Samba 伺服器,當然你還是要修改 /etc/samba/smb.conf 來達到。
這是有關 ldapsam 的設定。( ldapsam 是指把網域下的帳號資料存放入 LDAP 伺服器中,也可以說是使用 LDAP 來查詢帳號資料。)
[global]
workgroup = GODCLICK
passdb backend = ldapsam:ldap://localhost
domain logons = Yes
preferred master = Yes
domain master = Yes
ldap suffix = dc=swpearl,dc=com
ldap admin dn = cn=admin,dc=swpearl,dc=com
ldap ssl = no
...
......
這些就是最基本有關 ldapsam 的設定了;但是你可以發現在這裏是沒有記錄 \'ldap admin password\',其實在 smb.conf 中亦沒有這個設定。所以跟著來的步驟你是需要把 \'ldap admin dn\' 的 password 加以設定的。
設定 \'ldap admin dn\' 的密碼
如果你要完成 ldapsam ,那你就要作這最後一步的設定了。
# smbpasswd -w 123456
Setting stored password for \"\'cn=admin,dc=swpearl,dc=com\'\" in secrets.tdb
#
在設定密碼的時候,請你使用 smbpasswd 這指令,而另一方面你需要加上 \'-w\' 的 Option ,那你會發現 samba 會把 \'cn=admin,dc=swpearl,dc=com\' 的密碼存放在
/var/lib/samba/secrets.tdb 中。你可以用 tdbdump 來檢查這個檔案。
# tdbdump /var/lib/samba/secrets.tdb
{
key = \"SECRETS/LDAP_BIND_PW/\'cn=admin,dc=swpearl,dc=com\'\"
data = \"123456\\00\"
}
......
你可以發現 Samba 會使用 plain-text 形式來存放你的密碼,所以請保持 /var/lib/samba/secrets.tdb 檔案只有 root 能閱讀它。
網域 SID 與 ldapsam
好了,現在你可以從新啟動 Samba 。然後再檢查你的 ldap database.
# /etc/init.d/samba restart
Stopping Samba daemons: nmbd smbd.
Starting Samba daemons: nmbd smbd.
# ldapsearch -xw 123456 -LLLD \'cn=admin,dc=swpearl,dc=com\' \\
> -b \'dc=swpearl,dc=com\'
...
......
dn: sambaDomainName=GODCLICK,dc=swpearl,dc=com
sambaDomainName: GODCLICK
sambaSID: S-1-5-21-362447930-1559098963-1429385919
sambaAlgorithmicRidBase: 1000
objectClass: sambaDomain
#
在這時你可以發現你 Samba 主網域控制伺服器在
OpenLDAP
資料庫下自動地新增了一筆資料,這筆資料是用來存放網域下的 SID 的和 RID 。
為何要把這網域的 SID 加在
OpenLDAP
的資料庫內。這是有利於主和副網域控制伺服器的設定,因為在網域中所有的網域控制伺服器是需要有相同網域的 SID ,所以 Samba 把這資料放在
OpenLDAP
下,是有利於這方面的查詢和設定的。
在 ldapsam 中建立使用者
Samba 能自行管理使用者帳號的,當然使用者帳號在 ldapsam 下亦不例外。現在你可以先用 \'pdbedit -Lw\' 來查詢 Samba 使用者的帳號資料,後你可以再使用 \'pdbedit -a root\' 來建立使 root 的使用者帳號,後你可以再查詢 ldapsam 內的資料。
# pdbedit -Lw
# pdbedit -a root
new password:
retype new password:
Unix username: root
NT username: root
Account Flags: [U ]
User SID: S-1-5-21-362447930-1559098963-1429385919-1000
Primary Group SID: S-1-5-21-362447930-1559098963-1429385919-1001
Full Name: root
...
......
# ldapsearch -xw 123456 -D \'cn=admin,dc=swpearl,dc=com\' \\
> -b \'dc=swpearl,dc=com\'
...
dn: uid=root,dc=swpearl,dc=com
uid: root
sambaSID: S-1-5-21-362447930-1559098963-1429385919-1000
sambaPrimaryGroupSID: S-1-5-21-362447930-1559098963-1429385919-1001
displayName: root
sambaPwdCanChange: 1083653650
sambaPwdMustChange: 2147483647
sambaLMPassword: 44EFCE164AB921CAAAD3B435B51404EE
sambaNTPassword: 32ED87BDB5FDC5E9CBA88547376818D4
sambaPwdLastSet: 1083653650
sambaAcctFlags: [U ]
objectClass: sambaSamAccount
objectClass: account
...
在這裏你可以發現 Samba 把你的使用者帳號加到
OpenLDAP
伺服器當中了。
在 Samba ldapsam 下達致的主和副網域控制伺服器的設定 (PDC 和 BDC)
其實這方面是十分容易的;當我們要設定 PDC 和 BDC 前,或許我們要先討論一下什麼是 PDC ,什麼是 BDC ,什麼是網域資料庫?(其實在講 ldapsam 時,已有和大家介紹過什麼是網域資料庫了。)但是當中和 PDC 和 BDC 的關係又是什麼?
在 Microsoft 的網域環境下,PDC 是負責存放網域資料的,另外還提供了一很重要的服務︰網域登入,其次 Microsoft 的網域下之 PDC 亦負責把網域資料分發給網域下之 BDC ,當 BDC 接收到這網域內的資料時,它亦可以依這資料來提供網域登入的服務給使用者。
在 Samba ldapsam 下,其本上 PDC 和 BDC 皆沒有直接存放網域資料,這些網域資料存放在
OpenLDAP
下。當然把這些資料的存放工作和分發工作亦是交由
OpenLDAP
的負責!所以在資料存放這層面上 Samba ldapsam 的 PDC 和 BDC 是同級的。
另一方面網域下的 PDC 和 BDC 亦有一個很重要的分別︰就是在增加使用者帳號或者加入信任電腦和信任網域帳號時,只會向 PDC 提交申請,而不會向 BDC 申請的!因為 BDC 只是一備分網域控制器!它完全不會用來負擔管理網域資料的責任,但是在持別的情況下,管理者是可以直接在 BDC 下使用 pdbedit 或者 smbpasswd 來新增或修改使用者帳號的。
設定 Samba ldapsam 下之 BDC 網域控制器
還記得你 PDC 的 smb.conf 的設定嗎?
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Processing section \"[print$]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions
# Global parameters
[global]
workgroup = GODCLICK
server string = %h server (Samba %v)
passdb backend = ldapsam:ldap://10.0.2.178
domain logons = Yes
preferred master = Yes
domain master = Yes
ldap suffix = dc=swpearl,dc=com
ldap admin dn = cn=admin,dc=swpearl,dc=com
ldap ssl = no
[homes]
......
這是你 BDC 下的 smb.conf 的設定。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Processing section \"[print$]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_BDC
Press enter to see a dump of your service definitions
# Global parameters
[global]
workgroup = GODCLICK
server string = %h server (Samba %v)
passdb backend = ldapsam:ldap://10.0.2.178
domain logons = Yes
preferred master = Yes
domain master = No
dns proxy = No
ldap suffix = dc=swpearl,dc=com
ldap admin dn = cn=admin,dc=swpearl,dc=com
ldap ssl = no
[homes]
...
.......
在這裏你可以發覺 PDC 和 BDC 的 smb.conf 之差別只在於 \'domain master\' 這個設定。其它的設定可以說是完全一樣,另外因為 BDC 也會查詢 openLDAP 內的資料,因此你也是需要在 BDC 下執行 \'smbpasswd -w\' ,讓 BDC 也記錄了如何查詢 openLDAP 的資料。
# smbpasswd -w 123456
Setting stored password for \"cn=admin,dc=swpearl,dc=com\" in secrets.tdb
# pdbedit -Lw
root:0:44EFCE164AB921CAAAD3B435B51404EE:
32ED87BDB5FDC5E9CBA88547376818D4:[U ]:LCT-40973E12:
#
這樣你就可以使用 BDC 來查詢
OpenLDAP
內的帳號資料。
你也可以嘗試一下,如果網域成員能否在主網域控制伺服器查詢失敗時,會否轉而查詢副網域控制伺服器下的使用者帳號資料。
Samba 的 Domain Member
說到這裏 Samba 作網域控制器,已作了一非常簡單的介紹了;當然還有很多很有意思的主題還未在這裏提及的,例如︰ groupmap 和 idmap 等主題,當然還有 posixAccount 和 sambaSAMAccount 的聯合使用的問題,但是回到這文件的編寫目的,就是為 Samba 的網域結構作一定的簡介。(這裏可算是達到了!)
但是 Samba 在網域成員角色方面卻仍有一些十分重要的部分未在這裏作介紹。
這裏是 Samba 和 Microsoft 在 Active Directory 上互動關係。(暫時 Active Directory 和 Samba 的配搭上只出現在 Samba 成為網域成員的角色上,而不能出現在 Samba 的網域控制伺服器的角色上,這方面的研究將會出現在 Samba4 的發展上。)
Active Directory 的結構
Active Directory 在 Microsoft 下的出現,其實對網域結構和網域保安都提供了一很重要的改進。
首先 Active Directory 的組成上是由四個很重要的伺服器所組成︰ DNS 伺服器,DHCP 伺服器,LDAP 伺服器和 Kerberos 伺服器所組成。他們有良好的分工,這使得 Active Directory 有良好的保安結構,而且在管理上亦為輕易。例如使用 Kerberos 伺服器,這使得 Active Directory 在帳號認証時,不會直接把密碼在網絡上傳送,而是使用 Kerberos 的傳票形式來認証,這會使得網絡上的入侵者,無法捕捉使用者的密碼資料。
另外 Active Directory 在使用 LDAP 來存放網域資料,這方面使得網域結構更為彈性和富有變化。例如︰在 LDAP 的結構下,網域的控制可以不只有信任網域結構下來作出分工,另外亦可以由分葉的結構下來作出分工,亦即是說︰在你的網域下可以有一 Active Directory 網域為 samba.org ,而另外可以在另 Active Directory 網域為 hk.samba.org
而這網域是在 samba.org 之下的,但卻又可以獨立地加以管理。
Samba 的 security ADS
Samba 和 Active Directory 的合作模式暫時只在於和 Microsoft 的 Kerberos 服務器溝通,這方面可以看作是保安上的一大進步。但是在網域結構上卻仍沒有很大的改進,暫時 Samba 亦是停留在 NT4 的結構上。
但是這卻是下一大版本 Samba4 躍進上的目標。
Samba4 的目標
在 Active Directory 的結構下,Samba4 要面對的問題可以說是有兩大方面︰
-> 能接收 LDAP 的通信協定方式來發放網域下的資料內容,這亦是 Active Directory 內的網域資料發放方式。
-> 為何 Samba4 要從新建立這方面的資料發放的方式。
=> 先要了解的是 Samba 現在仍是大量倚重 tdb 資料檔案;但是這資料檔案卻亦有很大的問題,可看前文的分解,tdb 是不能接收 LDAP 形式的資料查詢。(其實現在的 Samba 伺服器已能夠把資料放在不同的資料庫下,如 mysql 和 postgresql 中;但是這些資料庫仍是無法接收 LDAP 通信協定的查詢。)當然
OpenLDAP
能夠接收這方面的查詢,但是又要面對另一問題,就是如果要放資料進入
OpenLDAP
的資料庫內;必須要依從 schema 的設定。(見上文)而這方面 schema 的設定卻是令
OpenLDAP
要完全代替 Active Directory 的 LDAP 功能成為巨大的阻力。因為現時 Active Directory 的基本 schema 結構已能填滿一本厚厚的巨著了,如果 Samba 由現在開始要從新重寫這方面的資料;一定是一件吃力又不討好的工作!(如果有自願人士為這方面努力,可以聯絡本會。)
=> 所以 Samba-term 正在開始設計另一資料存取的方式,這方式就是 ldb ,它將會是一個建立在不同的資料庫上的共同通信層面,這層面會使得存在在不同資料庫下的資料能共同使用這層面而達致資料庫內的資料能使用 LDAP 的通信協定來查詢。因此就可以使資料存放富更大的彈性,另外又可以符合 Active Directory 的模式而被 Microsoft 的使用者查詢。
Samba4 的目標(二)
在 Active Directory 的結構下,還有另一個問題,就是如何讓 Microsoft 的信任電腦查詢 Unix 下的 Kerberos ,提取票據?
要明白這方面的問題,首先要理解 Microsoft 網域下的信任電腦在查詢 Micorsoft Kerberos 時,他們在提取票據時使用 Microsoft RPC 傳呼的,而在 Unix 的 Kerberos 在為他的服務器提供票據時,卻是使用 keytab 的方式;固定地存放在服務器的檔案系統下。這方面的差別就是 Samba 另一個需要努力的地方。
未來 Samba 的展望
其實現在 Samba 已能完全實現 NT4 級數的網域伺服器,而且現在大部分的小型公司仍在使用 NT4 作其網域伺服器。加上 Microsoft 更停止對 NT4 的支援服務,因此亦是時候把你公司內的伺服器升級作 Samba 網域控制器了。
另外在未來的日子,Samba 亦會使用 Microsoft 的 Active Directory 的網域結構下提供網域控制伺服器的服務,因此你的公司亦更可以對 Samba 的未來投下更大的信任一票。
回到上一連結
http://www.linuxeden.com/"http://hk.samba.org/inside-samba/tiny.cgi/"
Frankie Chow
解放微軟下的王國
由 HK.Samba.Org 成立到現在,自己和不同的會員都有談及 Samba 的發展和發展方向。
但是往往發覺會員最不能了解的部份就是 Samba 中 Domain Control 的部份。
其實也難怪的,因為 Samba 中有關 Domain Control 的部份是 Samba 3 發展歷程
中重要一環,相比在 Samba 2 的世界下, Domain Control 的發展可以算是一個巨大的
跳躍。
另外 Domain Control 中也可算是 Samba 3 中最難理解的一部份,因為內含有與其它
服務的配合,例如︰ Kerberos (這一隻看守地獄的三頭狗,也可以算是在 Unix 界中最
難攪的服務。),又例如︰ LDAP (這又是另一令人又愛且恨的服務。因為在 Unix 界中
,這也是可以算是第一或第二今人頭痛的服務。這包括設定和資料維護,可算是一項不輕的工
作。)這更加深了 Samba 3 在 Domain Control 上的神秘感。
但是這一場演講會下,我們嘗試就這一方面作了一定量的了解。
首先我們還是先看一看這演講會的講題︰ Free Microsoft Kingdom 。
這令我想起一個大問題?究景微軟下的王國是一個什麼樣的王國?如果不能回答這個問題,
那又可言「解放」?
當我們想起微軟王國,這其實有很多不同的人對這王國有不同的思考,這都是合理的;如果你的
腦海浮起了這樣的圖片可以說是一點也不出奇怪的。
一個對建制的迷思。
但是如果我們只抱著這個取向來認識他,那可能我們一直也不能真了解他。所以我們還是要問我們要怎樣理解
才合理。
我想我們還是不能離開一個最重要的問題,這也是這王國最基本的組成部份 —— Domain (網域)
如果你們要問我一個問題,
這是一個很淺\白的問題︰「如果微軟比 Unix 優勝的話,那優勝的地方在那裏?」
當然這問題也會有很多不同的答案!例如︰使用者環境...這都是不爭的事實,但是最令我著迷的是 Domain (網域)
的理念。(如果你是 Unix 或 Linux 死硬派的話,請原諒我在這裏稱讚 Microsoft 。)
在我們還未進入考慮網域的理念時,我們先作一個更大的思考。一個稱為 Trust Domain (信任網域)的思考!
在微軟王國中基本的單位是網域,但只是這樣的在網域之間還可以產生一定的關係和聯係的。
這可以稱作信任網域。當然在 Active Directory 中的理念下這會有所不同,因為在
Active Directory ,你可以用另一眼光來看網域這問題;比較合理的是把它看作一個巨大的
樹木,而這樹木中,你可以把不同的分支分割出來,然後讓不同的 Domain Control (網域控制伺服器)來作管理,而所
管理的部份又各自連接於這樹木下。(在這文中所言的信任網域的結構是根躆 NT4 網域
結構而言的。)
在信任網域下,你或許可以把它思考成為不同的大蛇;各自把尾巴連結起來。
在這結構下,每一網域控制伺服器皆把在網域下的資料與其它的網域控制伺服器作分享。
但跟著來的問題有兩個︰
第一個問題是︰在網域下有什麼資料?他們可以作分享。
第二個問題是︰如何分別在不同網域下的資料?網域控制伺服器如何分別這一筆資料是屬於網域 A ,而不是網域 B ?
說實在第二個問題比較容易回答。要分別不同網域下的資料,其實依從的不同網域下的 SID
(Security Identifier) 就可以辦到了。你可以嘗試在 Samba 3 下執行這個指令;那你就可以提
取你 Samba 網域下的 SID 了。
# net getlocalsid
SID for domain KRB is: S-1-5-21-2539658682-2581673518-1142642392
#
這裏你或許應該留意這是一很長的一組號碼,而且每一網域下的 SID 也不同。另外在網域下
每一帳號都是以網域的 SID 作起始,而產生其它不同物件的 SID 。因此這就很容分別出這筆資料或是物件屬A 網域還是屬於 B 網域了。你可以用以下的指令查詢 Samba 伺服器下帳號之資料,而其中更包含了帳號 SID 。
# pdbedit -L
root:0:root
# pdbedit -v root
Unix username: root
NT username:
Account Flags: [U ]
User SID: S-1-5-21-2539658682-2581673518-1142642392-1000
Primary Group SID: S-1-5-21-2539658682-2581673518-1142642392-1001
Full Name: root
Home Directory: \\\\krb\\root
HomeDir
Drive:
Logon Script:
Profile Path: \\\\krb\\root\\profile
Domain: KRB
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Sat, 14 Dec 1901 04:45:51 GMT
Kickoff time: Sat, 14 Dec 1901 04:45:51 GMT
Password last set: Mon, 23 Feb 2004 11:33:24 GMT
Password can change: Mon, 23 Feb 2004 11:33:24 GMT
Password must change: Sat, 14 Dec 1901 04:45:51 GMT
#
這裏你可看見使用者帳號 root 的 SID 是 S-1-5-21-2539658682-2581673518-1142642392-1000
而這 SID 的開始亦是和 Domain 的 SID 是相同的。只有最後的一組數字不同,這不同的就是
1000 ;這不同的一組數字可稱作 RID 。在這裏 root 的 RID 是 1000 。
第二個問題就比較上複雜,也難以回答;或許我們還是回到 Samba 下尋找答案。當你執行 smbpasswd
時,你或許會發現有如下的 options .
$ smbpasswd -h
...
......
options:
...
......
extra options when run by root or in local mode:
-a add user
...
......
-i interdomain trust account
-m machine trust account
...
......
$
在 smbpasswd 下,你可以找到三種不同的使用者帳號。
使用者帳號 ( user account )
信任電腦帳號 ( machine trust account )
信任網域帳號 ( interdomain trust account )
在這裏你可以思考就是使用者帳號之存在問題,首先使用者帳號是相關於使用者的帳號模
式;這不只存在於 Microsoft 網域世界,其實這也存在於 Unix 的世界內。
這是當一使用者希望提取一服務時,服務器必須確認提取服務的就是使用者帳號下所登錄
的使用者,而不是一個惡意的攻擊者。
服務器如何能分辨這個差異?這主要就是倚靠服務器本身首先登錄使用者的資料,然後
如果使用者能夠在提取這個服務的時候,能提供的資料和服務器本身所登錄之資料吻合的
話,服務器本身就會為正確提供資料的使用者服務。
這不只在於 Microsoft 網域,其實當你去任何一網上服務者,而它又要求代登入使用的
時候,你也會面對使用者帳號的使用和管理的問題。
另外什麼是信任電腦帳號?
要了解信任電腦帳號的話,你或許要先理解在 Microsoft 下的 Domain Logons (網域登入) 服務。
Microsoft 下的網域登入服務
Microsoft 網域下是把伺服器和桌面系統完全分開的。這不像 Linux 伺服器,因為
你可以想像 Linux 的桌面系統下可以安裝不同的伺服器系統,例如︰Mandrake 和
Debian 下,他們完全可以在安裝程式時安裝不同的伺服器系統和桌面用戶程式。
其實在某些 Linux 的版本下,他們是把桌面系統和伺服器系統分開的,例如︰
紅旗 Linux ,他把桌面系統和伺服器系統分開在不同的安裝光碟上,但是這也不是如
Microsoft 形式下的把伺服系統和桌面系統不同的分別。因為在這上面的分別只是安裝
上的分別,而 Microsoft 在這裏的分別是在於網域登入上。
做一個簡單而有關網絡身分的實驗
在 /etc/samba/smb.conf 下的 [global] 部分中加入或修改這樣的幾行。
[global]
...
......
domain master = yes
preferred master = yes
domain logons = yes
security = user
......
...
然後你可以執行 testparm 來測試你的 samba 系統。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions
......
你可以在這裏看見你的 Samba 會把自己看作是 PDC ,當然這也是 Microsoft 網域下
的網域控制服務器。
第二步驟,修改 /etc/samba/smb.conf ;只要把 domain logons 的設定作 no 。其它的設定也不需要作出更改。
[global]
...
......
domain master = yes
preferred master = yes
domain logon = no
security = user
......
...
這樣當你再次執行 testparm 來測試你的 samba 系統。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
......
這時你可以看見你的 Samba 伺服器己改變了身份。在這裏它己變成了 STANDALONE 的機器,而失去了網域控制伺服器的尊貴身份。
再次修改你的 smb.conf 檔案︰
[global]
...
......
domain master = yes
preferred master = yes
domain logon = no
security = domain
......
...
這次只修改了 security 的設定,而其它的卻不作修改。現在你可以再用 testparm 來
檢查你的 samba 系統。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions
......
這次得出來的結果顯示了 Samba 不再是 STANDALONE 了,而又變身成為
DOMAIN_MEMBER 。
Microsoft 網域下的 DOMAIN_CONTROLER 和 DOMAIN_MEMBER (網域成員)
Microsoft 網域下的網域控制伺服器就是以 DOMAIN CONTROLER 的身份存在在網域下。
(而 PDC 就是其中一類形的 DOMAIN CONTROLER ,而 BDC 又是另一類形的
DOMAIN CONTROLER ,下文會再言 BDC 的設定。)
Microsoft 網域下的桌面系系統就是以 DOMAIN_MEMBER 的身份存在在網域下。
(例如 NT workstation,或者 Windows 2000 Prefessinal 和 Windows XP Prefessinal
。他們就是以 DOMAIN_MEMBER (網域成員)的身份存在。
DOMAIN_MEMBER 和 DOMAIN CONTROLER 有什麼分別?讓我們從使用者的角度下
思考這問題。
使用者和 DOMAIN_MEMBER
當使用者使用 Microsoft 網域下的資源時,他們一定會使用某台電腦的(或電腦類形
的配備,或許未來執行 CE 的手帳也可以作網絡登入之用!)。他們絕不可能在只是坐在椅上而不需要透過使用電腦就可以使用網域下的檔案目錄吧!
當使用者使用某台電腦時,很多時候在開始使用時,他們也需要輸入使用者名稱和
使用者帳戶所登錄的密碼。就如使用者帳號下所記錄的!但是問題卻在如果使用者在登入的
時候選擇了某網域作為登入的話,那他所登入的電腦本身就很有可能是沒有記錄這使用者帳號
的資料,而記錄這資料的責任卻是遠端地存放在 PDC 和 BDC 內的,好了讓我們站在
DOMAIN_CONTROLER (網域控制伺服器)的角度來想想這事情。
DOMAIN_CONTROLER 和 DOMAIN_MEMBER
當我們站在 DOMAIN_CONTROLER 的角度下來想這事情的話;就好像在網域下有一台電腦
拿著某人的資料包括這人的登入名稱和密碼來向你作出登入的要求!好了如果這台電腦是一台含有惡意的電腦,
而且它是被一個惡意的攻擊者所控制(或許這真是一個信任的使用者,但卻坐在一台你不能信任的電腦下!),那這個惡者攻擊者很有可以是為了破解某人的使用
者密碼而來,所以 DOMAIN_CONTROLER 是不能在任何電腦對他作詢問時,他都坦誠\以告的。
如何可以分辦 DOMAIN_MEMBER 是否可以信靠的電腦?這個答案就是信任電腦帳號。
信任電腦帳號的組成
如何在 Microsoft 網域下達成信任電腦的關係?(我想你可以把它看作成一個
關係,因為如果網域下有兩台 Microsoft 或者 Samba 伺服器,但這不能算是能夠達成
信任電腦帳號,因為這兩台電腦可以獨立成為 STANDALONE 級數的伺服器,而不是構成
信任電腦的關係即 DOMAIN CONTROLER 和 DOMAIN MEMBER 的關係;不使用這關係的話;會引致很多不良的影響!這可以普遍見於不同大少的公司。(他們都可以在不同部們,不同的
分公司的地址下都有很多不同的電腦在運\作;但是當中卻沒有把它們的權責分別清楚,
這些伺服器都需要保存一組的使用的電腦帳號,而且當一些使用者會同一時間,或不同
的時間下接觸多於一台伺服器時,這些伺服器甚至需要把使用者的資料作多於一次的登
錄,當然每多一次的登錄,這會使得使用者在修改自己的密碼時,他就要到不同的伺服器下修
改他們帳號內的使用者密碼。這些都會加深管理的難度!)
在建立信任電腦帳號的關係時,在 Microsoft 的網域下需要有起碼兩台電腦。一台是
PDC ,另外一台成為 DOMAIN_MEMBER 。還有一個很重要的步驟,就是 join DOMAIN 的
步驟。
信任電腦帳號的組成 (PDC)
在這裏先設定你的 PDC 。也先看看你的 /etc/samba/smb.conf 。
[global]
...
......
domain master = yes
preferred master = yes
domain logons = yes
security = user
add machine script = /usr/sbin/useradd %u
......
...
以上的設定是把你的 Samba 設定成為 PDC ,後再加上一 add machine script 的
option . 這會使到你的 DOMAIN_MEMBER 作 join DOMAIN 時,使你的 PDC 自動地在 Unix 或 Linux 系統下產生你 DOMAIN_MAMBER 的電腦帳號。
信任電腦帳號的組成 (DOMAIN_MEMBER)
好了另外我們要來看一看 DOMAIN_MEMBER 內的 /etc/samba/smb.conf 的設定︰
[global]
...
......
domain master = no
preferred master = no
domain logons = no
security = domain
add user script = /usr/sbin/useradd %u
......
...
基本上如果你的 Samba 是作 DOMAIN_MEMBER 的話,原則性地你的 Samba 就不需要成
為 domain master (網域控制伺服器),亦不需要成為 preferred master ,當然你亦不需要作 domain logons (在網域上提供網域登入)
伺服器。你亦可以不把這些 Options 作出設定的,但要記得把 security 的設定設定作
domain ,就可以了。(這也是使你的 Samba 成為網域成員的最重要一環,這代表著你的 Samba 願意提供服務給網域控制器下所登錄的使用者。)
增加使用者程式 (add user script)
另外有個設定,你可能需要加在你網域成員的 smb.conf 內的
\"add user script\" 。
為什麼要加入這設定?(其實你可以使用 winbind 來取替這設定的。)
或許你會思想一個問題,如果在網域的 PDC 帳號內有某使用者 frankie 的帳號,但是
這帳號卻不存在在網域成員的 Unix 或 Linux 帳號內,那你的網域成員(如果它是執行 Samba 系統)就不能容
容 frankie 提取網域成員機器內在網域上所分享的網域資源。因為 frankie 在提取
網域成員下的資源時,你的 Samba 卻不知道 frankie 應在 Unix 或 Linux 下
應使用什麼使用者和群組的權力來提取資源。所以沒有它途,只有就是不提供服務給 frankie 。但是如
果在你 Samba 下的 /etc/samba/smb.conf 下加入 add user script 的時候,
那當網域成員( Samba )發現 frankie 是存在於網域控制伺服器內,更能通過認証;卻又發現在
自己 Unix 或 Linux 系統下卻沒有 frankie 使用者存在,那網域成員 Samba 就會用 \"add user
script\" 的程式來在 Unix 系統內加建 frankie 的帳號,這樣 frankie 就能在 unix
系統下存在了。因此網域成員在遇上 frankie 來提取網絡資源時,就可以使用
新增的帳號的使用者權限和群組權限來提取。
參加 ( Join ) 網域
當你設定好主網域控制伺服器和網域成員這兩台(Samba)伺服器,那你還需要一個簡單的步驟;這簡單的步驟就是參
加網域(Join Domain)的過程。(暫時集中在討論 rpc 級數的 Join Domain,另外亦集中論討在 Samba 3 下 Join Domain 的情況。)
在 Samba 3 中如果要達成參加網域的動作時,你首先要理解三件事。
-> 首先你要把你的網域成員加入到什麼 Domain 下。其實你也能理解,如果你要加入到 HKSAMBA
Domain 下,和當你加入到 GODCLICK Domain 下,這是兩件不同的事情的。要設定你的網域成員要加入何網域,這可以在網域成員下的 /etc/samba/smb.conf 的 workgroup 設定作修改。
-> 另外你要知道在那主網域控制伺服器(PDC)下,最高權力者的使用者帳號密碼。在不同的伺服器系統下這個最高權力者的帳號名稱各有不同,例如︰在 Microsoft 下,最高權力者是 Administrator ,而在 Samba 系統下最高權力者,即是 Unix 或 Linux 下的最高權力者︰ root 。
-> 第三樣事情就是當加入網域時所選擇的保案級數。(在 Samba 3 下
你可以選擇的保案級數是 rpc、 rap 和 ads 。在這裏暫時只集中在 rpc 保案級數上。)
在這裏保安級數不同於 smb.conf 下的 security 的設定。
在這裏我們嘗試把我們的 Samba 伺服器 ( DOMAIN_MEMBER )加入網域中。
# net rpc join -U root -w 123456
Joined domain HKSAMBA.
#
在這裏你需要使用在你 Samba 機器下,使用 root 的帳號,然後執行 net 的指令。
net 的指令下,你需要選擇保安級數,這裏所選擇的保安級數為 rpc 。(這是和 NT4 同等
級數。),後使用 join 的指令,表示你打算把你的 Samba 伺服器加入到網域下,之後你要在 net 指令下告訴你的 Samba 系統,當他打算 Join 入 Domain 時,使用什
麼使用者帳號。因在此你打算把你的 Samba 伺服器加入到 Samba 所管理的網域,所以最高權力的使用者帳號為 root ,而 -w 這個設定所加入的是這個帳的使用者密碼。(這密碼不是 root 下的系統密碼,而是 Samba passdb 下的使用者密碼。所以很有可能需要你先把 root 的帳號加到你的 Samba passdb 下,你可以使用 \'pdbedit -a root\' 來達致。)
當你的 Samba 伺服器能成功參與該網域,你就會接收到你成功參與的信息。
另外你也可以嘗試使用主網域控制伺服器下的使用者帳號資料來登入你網域成員的電腦。(這不需要理會這網域成員下的 Samba 伺服器有否這使用者帳號,也不會理會這網域成員下這使用者帳號的密碼有否和主網域控制器下的相同與否,也會完全使用網域控制器下的 passdb 使用者帳號資料作 Samba 認証之用。
發生在參與網域行為下
當你實現了參與網域行為,即把網域成員參與了網域後,有什麼特別的事情會發生?
要了解這事情,你可以從網域控制器下去了解它,另一方面亦需要從網域成員的角度下去了解它。
發生在參與網域行為下的網域控制器
當你的網域成員參與了網域時,你可以發現在網域的網域主控伺服器下自動地加入了一個信任電腦帳號。你可以用 pdbedit 瀏覽你網域 PDC 下的帳號戶口列表。
# pdbedit -L -w
member$:1001:BB6FA10D4DD129BA7CD0EAC7B36D5E5C:
70595DCF510FD294D987EBFB004FA75F:[W ]:LCT-4092041F:
root:0:44EFCE164AB921CAAAD3B435B51404EE:
32ED87BDB5FDC5E9CBA88547376818D4:[U ]:LCT-40920331:
#
在這裏你可以發現你的網域控制伺服器下加入了一個帳號,而這個帳號是信任電腦帳號,而這個帳號的名稱為 member$ 。(如果不是使用者帳號的話, Samba 是會在這個帳號的結尾加上一個 \'$\' 的字原的,而另外在 Samba 下,每一個帳號都有一個旗號的,而這 member$ 的帳號旗號為 \'W\' ,即表示這帳號為一信任電腦帳號。這也是所有發生在網域控制伺服器下的事情,當然要令網域控制伺服器能成功建立這一帳號,也是需要像前文所說在 /etc/samba/smb.conf 中加入 \'add machine script\' 的設定。
發生在參與網域行為下的網域成員
另一方面可能你也會可翻查在網域成員的改變,但是我想你還是先思考當中的可能轉變。
有什麼是可能轉變的?我想只有兩項。
-> 記錄著主網域控制伺服器下對這帳號所設定的密碼。
-> 所登入網域的 SID ,這兩項資料。( SID 是網域中最基本的資料,所以網域成員也自然要知道這資料,好分別他是加入何網域的。)
但是這密碼究景收在那檔案內。如何可以發現這密碼?先首要了解 Samba 大部資料是收在 tdb 資料檔案下的,這信任電腦密碼也不例外。你可以翻查不同 tdb 檔案,看密碼收在那檔案下。(在這裏可以先告訴你這密碼是收在 /var/lib/samba/secrets.tdb 下,另外你可以用 tdbdump 來查看這檔案。)
# tdbdump /var/lib/samba/secrets.tdb
{
key = \"SECRETS/MACHINE_LAST_CHANGE_TIME/HKSAMBA\"
data = \">\\04\\92@\"
}
{
key = \"SECRETS/MACHINE_SEC_CHANNEL_TYPE/HKSAMBA\"
data = \"\\02\\00\\00\\00\"
}
{
key = \"SECRETS/MACHINE_PASSWORD/HKSAMBA\"
data = \"-gguYvmRBBx6IH\\00\"
}
{
key = \"SECRETS/SID/MEMBER\"
data = \"\\01\\04\\00\\00\\00\\00\\00\\05\\15\\00\\00\\00\\0F\\DF\\D9\\0DB\\B3\\AE\\
D0\\CC\\FEK\\C8\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00
\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"SECRETS/SID/HKSAMBA\"
data = \"\\01\\04\\00\\00\\00\\00\\00\\05\\15\\00\\00\\00\\
D9\\D7\\E0D\\01;x\\B3\\ED\\844\\17\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00
\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"INFO/random_seed\\00\"
data = \"O\\07\\00\\00\"
}
#
當然有了這樣的一個密碼後,網域成員就可以提取了在網域控制伺服器下所記錄的使用者資料了。
什麼是信任網域帳號?
要了解信任網域帳號,你可以依從了解信任電腦的邏輯來了解它。
另外在這裏有一些持別地方可以加以注意的。首先在兩個互相信任的網域下,大家應有相同的級別。還記得蛇咬著蛇這個圖案嗎?他們大家是平等共存的。在這前題下,你可以想像的就是在不同的信任網域下皆需要為不同的信任網域加上另一信任網域的〔信任網域帳號〕,另外亦需要作申請信任的動作。
其實也可以作單方面的信任,即 A 網域建立了 B 網域的〔信任網域帳號〕,而在 B 網域卻沒有建立 A 網域的〔信任網域帳號〕,另外 B 網域申請了 A 網域的信任,但是 A 網域卻沒有申請 B 網域的信任,這情況絕對會存在的!如是這樣,那 A 網域的使用者帳號資料就可以給 B 網域來取用,而 B 網域的使用者帳號資料卻不能被 A 網域取用;這意味著 A 網域的使用者可透過 B 網域下的網域成員來登入 A 網域,也作表著 B 網域下的網絡資源也可分配合 A 網域下的使用者使用。反之卻不能。
新增信任網域帳號
如果你想理解信任網域帳號,或許你可以從新增網域帳號來理解它。
這是沒有自動新增信任網域帳號的程序呼叫的,你需要手動地增加它。在這過程中你會有幾個不同的過程,你需要依從的。
在這例子裏有兩個網域,一個網域稱為 GODCLICK ,而另一個網域稱為 HKSAMBA ,現在打算使 HKSAMBA 網域信任 GODCLICK 的網域。
-> 首先第一步先在 HKSAMBA 的主網域控制伺服下的 Unix 或 Linux 系統下新增一個使用者帳號代表著這個信任網域。(如何設定主網域控制伺服器,你可以留意前文的內容。)
# useradd godclick\\$
#
在這裏加入的使用者帳號是信任的網域名稱。(現在的例子是︰ GODCLICK )但記緊在信任的網域名稱後加上 \'$\' 字原。(但因為 \'$\' 字原在 Unix 或 Linux 的 Shell 下是一特別的字原,因此需要在這字原後加上另一保留字原 \'\\\' 。)
當你完成了這一個 Unix 下的使用者帳號後,你可以檢查一下這使用者帳號是否被建立成功。
$ getent passwd | grep godclick
godclick$:x:1003:100::/home/godclick$:/bin/bash
$
另一步驟就是建立信任網域帳號在 HKSAMBA 的主網域控制伺服器之 Samba 伺服器的 pdbedit 內。
# smbpasswd -a -i godclick
New SMB password:
Retype new SMB password:
Added user godclick$.
這一次的加帳號指令是 smbpasswd 而不是 pdbedit ,而且一定要使用主網域控制伺服器下的 root 帳號來新增信任網域帳號,另外這裏的網域名稱是不需要再加上 \'$\' 字原在最後部份的。但是當 smbpasswd 知道你在新增信任網域帳號時,他就會在這個帳號的最後方加上 \'$\' 的字原。另外記得在這裏你是需要加入密碼的,這密碼也是在 GODCLICK 網域申請加入 HKSAMBA 網域時所必須要提交的的
做完這些預備功夫後,你可進行信任網域的過程了。
信任網域過程
好了在 GODCLICK 之 PDC 執行 net 指令如下︰
# net rpc trustdom establish hksamba
Password:
[2004/05/03 15:49:20, 0] utils/net_rpc.c:rpc_trustdom_establish(2106)
Success!
#
這裏你會發現在 net 指令是需要你加上密碼的,但是要加上什麼密碼?
在這裏你所加上的密碼是你在執行 \'# smbpasswd -a -i godclick.net\' 所加上的密碼。
另外你在這裏接收到 Success 的信息時,即表示你已成功地把建立了網域信任的關係,
但是你要留意在此時,網域 godclick 能夠查詢 hksamba 的網域使用者資料,但是 hksamba 卻仍不能查詢 godclick 網域之資料,因為這裏只建立了 hksamba 對 godclick 的信任,
卻沒有建立 godclick 對 hksamba 的信任。
測試信任網域
我想當你建立了信任網域時,或許你需要作這方面的測試。
你可以先在網域 GODCLICK 的 PDC 下作使用 smbclient 來作測試。
# pdbedit -L
Unable to open/create TDB passwd
# smbclient -W HKSAMBA -U root -L localhost
Password:
Domain=[GODCLICK] OS=[Unix] Server=[Samba 3.0.2-Debian]
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
IPC$ IPC IPC Service
(workstation-178 server (Samba 3.0.2-Debian))
ADMIN$ IPC IPC Service
(workstation-178 server (Samba 3.0.2-Debian))
root Disk Home Directories
Domain=[GODCLICK] OS=[Unix] Server=[Samba 3.0.2-Debian]
Server Comment
--------- -------
WORKSTATION-178 workstation-178 server (Samba 3.0.2-Debian)
Workgroup Master
--------- -------
GODCLICK
#
你可以先使用 pdbedit 來檢查你的使用者帳號,在這裏你會發覺在你 GODCLICK 是完全
沒有使用者帳號的,所以在這裏回報了一個錯誤的信息(Unable to open/create TDB passwd )但是你卻可以使用 root 的使用者帳號來查詢 PDC 的網域資源。在
smbclient 下,你會發覺加上了 \'-W hksamba\' 的設定,這設定告訴 smbclient 在查詢帳號時使用 HKSAMBA 網域的使用者帳號。
在信任網域下的帳號密碼
在這裏或許有朋友會詢問為何 GODCLICK 網域下沒有使用者帳號,但是仍能查詢 HKSAMBA 網域下的使用者帳號,那麼信任網域帳號在 GODCLICK 下存在在何處?以致它能查詢 HKSAMBA 網域之資料。
當你在 GODCLICK 之 PDC 下執行了 \'net rpc trustdom establish\' 後,你可以在
/var/lib/samba/secrets.tdb 檔案下找到這帳號的碼密資料。
# tdbdump /var/lib/samba/secrets.tdb
{
key = \"SECRETS/SID/GODCLICK\"
data = \"\\01\\04\\00\\00\\00\\00\\00\\05\\15\\00\\00\\00:\\84\\9A\\15S\\
F6\\ED\\5C\\BF\\B22U\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"SECRETS/$DOMTRUST.ACC/HKSAMBA\"
data = \"\\08\\00\\00\\00H\\00K\\00S\\00A\\00M\\00B\\00A\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\06\\00\\00\\00123456\\00\\80\\F9\\95@\\01\\04\\00\\00\\00\\
00\\00\\05\\15\\00\\00\\00\\D9\\D7\\E0D\\01;x\\B3\\ED\\844\\17\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\
00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\"
}
{
key = \"INFO/random_seed\\00\"
data = \"O\\07\\00\\00\"
}
#
在這裏你會發覺在這裏 Key 的 \"SECRETS/$DOMTRUST.ACC/HKSAMBA\" 所指著的 Data 這是這個信任網域的密碼。
一些特別的事情有關信任網域
首先你要理解信任網域是在不同的網域下的使用者可以使用不同網域下的資源,如果這是事是發生在 Microsoft 的網域下的話,這會因為使用者擁有唯一而且不同的 SID ,以作分別;所以不同的網域下的使用者帳號有完全不同的使用者權力。但是在 Samba 網域下卻有一問題,就是因為不同的使用者帳號需是有不同的 SID ,但是在 Samba 伺服器下卻會把這個使用者帳號轉換成 Unix 使用者帳號,在這裏很多時候不是依從 SID 來處理,而是使用使用者的帳號的登入名稱來轉換,因此在 HKSAMBA 網域下的使用者 root 和 GODCLICK 網域下的使用者 root 在同一台 GODCLICK 之網域主控伺服器的 Samba 在 Unix 或 Linux 系統的層面上卻擁有了相同的使用者權力,因為這兩帳號在登入時都是使用了 root 來作帳號登入名稱。
Samba 的網域資料和 tdb files
Samba 的網域控制伺服器 PDC ,當中有不少的使用者帳號的資料結構;當中有很大情度是與 Unix 伺服器是有很大的差別的,因此 Samba 在這方面有它自己不同的資料庫,這主要是把資料放在 tdbsam 內的,也是 tdb file 內。這是一個很簡單的資料結構檔案,是由 Key 和 Data 來組成的,而在每一個 tdb files 內的 Key 是唯一的。即是說沒有任何一筆資料是擁有相同的 Key 的,另外你可以使用 tdbdump 這工具指令來翻查 tdb 資料庫的內容。(如上文所示)
Samba 有很大量之資料是使用 tdb 資料庫來存放,而且在未來的日子裏 samba 仍會大量使用 tdb 來存放資料,但是在使用 tdb 來存放資料,卻會面對不同的問題:
-> tdb 資料庫不是一網絡形態之資料庫,因此在使用 tdb 資料庫時,只能在單一台 Samba 中使用,而另一台 Samba 伺服器卻不容易查詢另一台 Samba 下的 tdb 資料庫內的內容。
(但你可以想像的就是網域下某些資料是不完全隸屬於此一網域下的網域控制器,而是隸屬於這整個網域。例如︰使用者帳號,群組資料和 SID 對 Unix id 的對比表格。)
-> tdb 資料庫亦沒有提供一簡易的備份方法,當然更沒有主伺服器和副伺服器資料處理上的分別。
因此要可能要管理者另外建立一方式來完成 PDC 和 BDC 伺服器的備份和設定。
-> tdb 資料庫的結構是不容理解的,亦不容易透過直接修改資料庫的資料內容以作維護的。(當然 Samba 仍提供不同的指令讓你修改當中的內容,而且直接修改資料庫的資料內容,亦容易產生不必要的錯誤。)
OpenLDAP 與 Samba 的網域資料
在 Samba 下,除了使用 tdb database 來存放網域之資料外,亦可使用
OpenLDAP
來存放這方面的資料。
為什麼使用 OpenLDAP 來存放網域資料
因為
OpenLDAP
是一善於存放網域資料的伺服器,它亦是一網絡形態的伺服器;所以在網絡下不同的 Samba 亦可以同一時間查詢
OpenLDAP
內的資料內容,達致資料同步的目的。
另外在服務結構上,OpenLDAP 是有主和副伺服器之分工,而且當 Samba 無法查詢主伺服器時,他可以自動地查詢副伺服器;這使得備份和失效處理上更容易辦到。
另外主網域控制器和副網域控制器能同時查詢
OpenLDAP
內之資料庫,產生平衡負載的效果;這使得查詢服務的時間縮短。
Samba 下的 samba.schema
要讓
OpenLDAP
能給予 Samba 作查詢,首先要考慮的就是如何把 Samba 網域資料存放在
OpenLDAP
內。
在這方面,你需要先理解的就是
OpenLDAP
下如果需要存放不同的資料,首先要在
OpenLDAP
伺服器定義這資料結構,這方面稱作 Schema 。當然 Samba 的 Schema 資料結構是不需要自
己來定義它!在網絡上,你可以找到這 Schema ,或許你在安裝 Samba 時;你的 Linux 或 Unix 系統亦會替你安裝在你的伺服器檔案系統下。另外你可以把 Samba 的原程式碼的 tar.gz 檔案內找到。
./examples/LDAP/samba.schema
另一方面你要留意的是這 samba.schema 在 Samba 2.2.* 和 Samba3 是不同的,亦有不同的結構,所以不要 Samba 2.2.* 的 samba.schema ,使用在 Samba 3 下。(在這裏主要是集中在 Samba 3 下來討論它。)
Samba 下的 samba.schema 結構
如果你打開 samba.schema 來看看的話,(我十分鼓勵你看看這檔案。)你會發現在這檔案下定義了不同的 objectclass .
-> sambaSamAccount 這是你會遇上的第一個 objectclass ,這是用來存放網域下的使用者資料的。
-> sambaGroupMapping 這是用來存放網域下群組資料及對應到 Unix 系統下的 gid 的對應表。
-> sambaDomain 這是用來存放網域下的 SID 和 RID 之資料。(這方面之資料有助建立主和副網域控制器。)
-> sambaUnixIdPool,sambaIdmapEntry 這兩個 Objectclass 是用來存放網域上的 SID 和相對應之 Unix 下的 uid 之資料,這主要是給予 Winbind 作查詢之用。
Samba 下 OpenLDAP 的基本設定
在這裏開始設定
OpenLDAP
伺服器,容讓 Samba 來進行查詢和維護。
OpenLDAP
伺服器的名稱為 slapd ,而它的設定檔案存放在 /etc/openldap/slapd.conf
或者在 /etc/ldap/slapd.conf 。
這裏是我 Linux 下的 /etc/ldap/slapd.conf 。
allow bind_v2
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/samba.schema
schemacheck on
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd.args
loglevel 0
modulepath /usr/lib/ldap
moduleload back_bdb
backend bdb
database bdb
suffix \"dc=swpearl,dc=com\"
directory \"/var/lib/ldap\"
index objectClass eq
lastmod on
access to attribute=userPassword
by dn=\"cn=admin,dc=swpearl,dc=com\" write
by anonymous auth
by self write
by * none
access to * by
dn=\"cn=admin,dc=swpearl,dc=com\" write
by * read
在這裏你可以留意在 include 的關鍵字下你可以發現這一行:
include /etc/ldap/schema/samba.schema
這一行的意義就是說把 /etc/ldap/schema/samba.schema 加入
OpenLDAP
的 schema 資料庫內。
另外也把我伺服器下的 ldap 資料庫的資料列舉如下:
# ldapsearch -xw 123456 -D \'cn=admin,dc=swpearl,dc=com\' \\
> -LLL -b \'dc=swpearl,dc=com\'
dn: dc=swpearl,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: swpearl.com
dc: swpearl
dn: cn=admin,dc=swpearl,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e2NyeXB0fTBWS3J4Q8hBYXVlQVk=
#
暫時這個資料庫仍是十分簡單,只有兩筆資料;而且在查詢過程中,你可以發現你的最高權力的 dn 為︰cn=admin,dc=swpearl,dc=com ,另外他的密碼為 123456 。另外的伺服下的 suffix 是 dc=swpearl,dc=com 這些資料對你設定 ldapsam 是十分重要的。因為 Samba 是需要知道應使用什麼使用者和密碼來查詢 LDAP 伺服器的,另一方面亦需要知道網域資料應放在何子葉下的。
設定 Samba 使用 OpenLDAP 作網域資料存放
設定好了
OpenLDAP
伺服器,然後要再到設定 Samba 。如果要設定 Samba 伺服器,當然你還是要修改 /etc/samba/smb.conf 來達到。
這是有關 ldapsam 的設定。( ldapsam 是指把網域下的帳號資料存放入 LDAP 伺服器中,也可以說是使用 LDAP 來查詢帳號資料。)
[global]
workgroup = GODCLICK
passdb backend = ldapsam:ldap://localhost
domain logons = Yes
preferred master = Yes
domain master = Yes
ldap suffix = dc=swpearl,dc=com
ldap admin dn = cn=admin,dc=swpearl,dc=com
ldap ssl = no
...
......
這些就是最基本有關 ldapsam 的設定了;但是你可以發現在這裏是沒有記錄 \'ldap admin password\',其實在 smb.conf 中亦沒有這個設定。所以跟著來的步驟你是需要把 \'ldap admin dn\' 的 password 加以設定的。
設定 \'ldap admin dn\' 的密碼
如果你要完成 ldapsam ,那你就要作這最後一步的設定了。
# smbpasswd -w 123456
Setting stored password for \"\'cn=admin,dc=swpearl,dc=com\'\" in secrets.tdb
#
在設定密碼的時候,請你使用 smbpasswd 這指令,而另一方面你需要加上 \'-w\' 的 Option ,那你會發現 samba 會把 \'cn=admin,dc=swpearl,dc=com\' 的密碼存放在
/var/lib/samba/secrets.tdb 中。你可以用 tdbdump 來檢查這個檔案。
# tdbdump /var/lib/samba/secrets.tdb
{
key = \"SECRETS/LDAP_BIND_PW/\'cn=admin,dc=swpearl,dc=com\'\"
data = \"123456\\00\"
}
......
你可以發現 Samba 會使用 plain-text 形式來存放你的密碼,所以請保持 /var/lib/samba/secrets.tdb 檔案只有 root 能閱讀它。
網域 SID 與 ldapsam
好了,現在你可以從新啟動 Samba 。然後再檢查你的 ldap database.
# /etc/init.d/samba restart
Stopping Samba daemons: nmbd smbd.
Starting Samba daemons: nmbd smbd.
# ldapsearch -xw 123456 -LLLD \'cn=admin,dc=swpearl,dc=com\' \\
> -b \'dc=swpearl,dc=com\'
...
......
dn: sambaDomainName=GODCLICK,dc=swpearl,dc=com
sambaDomainName: GODCLICK
sambaSID: S-1-5-21-362447930-1559098963-1429385919
sambaAlgorithmicRidBase: 1000
objectClass: sambaDomain
#
在這時你可以發現你 Samba 主網域控制伺服器在
OpenLDAP
資料庫下自動地新增了一筆資料,這筆資料是用來存放網域下的 SID 的和 RID 。
為何要把這網域的 SID 加在
OpenLDAP
的資料庫內。這是有利於主和副網域控制伺服器的設定,因為在網域中所有的網域控制伺服器是需要有相同網域的 SID ,所以 Samba 把這資料放在
OpenLDAP
下,是有利於這方面的查詢和設定的。
在 ldapsam 中建立使用者
Samba 能自行管理使用者帳號的,當然使用者帳號在 ldapsam 下亦不例外。現在你可以先用 \'pdbedit -Lw\' 來查詢 Samba 使用者的帳號資料,後你可以再使用 \'pdbedit -a root\' 來建立使 root 的使用者帳號,後你可以再查詢 ldapsam 內的資料。
# pdbedit -Lw
# pdbedit -a root
new password:
retype new password:
Unix username: root
NT username: root
Account Flags: [U ]
User SID: S-1-5-21-362447930-1559098963-1429385919-1000
Primary Group SID: S-1-5-21-362447930-1559098963-1429385919-1001
Full Name: root
...
......
# ldapsearch -xw 123456 -D \'cn=admin,dc=swpearl,dc=com\' \\
> -b \'dc=swpearl,dc=com\'
...
dn: uid=root,dc=swpearl,dc=com
uid: root
sambaSID: S-1-5-21-362447930-1559098963-1429385919-1000
sambaPrimaryGroupSID: S-1-5-21-362447930-1559098963-1429385919-1001
displayName: root
sambaPwdCanChange: 1083653650
sambaPwdMustChange: 2147483647
sambaLMPassword: 44EFCE164AB921CAAAD3B435B51404EE
sambaNTPassword: 32ED87BDB5FDC5E9CBA88547376818D4
sambaPwdLastSet: 1083653650
sambaAcctFlags: [U ]
objectClass: sambaSamAccount
objectClass: account
...
在這裏你可以發現 Samba 把你的使用者帳號加到
OpenLDAP
伺服器當中了。
在 Samba ldapsam 下達致的主和副網域控制伺服器的設定 (PDC 和 BDC)
其實這方面是十分容易的;當我們要設定 PDC 和 BDC 前,或許我們要先討論一下什麼是 PDC ,什麼是 BDC ,什麼是網域資料庫?(其實在講 ldapsam 時,已有和大家介紹過什麼是網域資料庫了。)但是當中和 PDC 和 BDC 的關係又是什麼?
在 Microsoft 的網域環境下,PDC 是負責存放網域資料的,另外還提供了一很重要的服務︰網域登入,其次 Microsoft 的網域下之 PDC 亦負責把網域資料分發給網域下之 BDC ,當 BDC 接收到這網域內的資料時,它亦可以依這資料來提供網域登入的服務給使用者。
在 Samba ldapsam 下,其本上 PDC 和 BDC 皆沒有直接存放網域資料,這些網域資料存放在
OpenLDAP
下。當然把這些資料的存放工作和分發工作亦是交由
OpenLDAP
的負責!所以在資料存放這層面上 Samba ldapsam 的 PDC 和 BDC 是同級的。
另一方面網域下的 PDC 和 BDC 亦有一個很重要的分別︰就是在增加使用者帳號或者加入信任電腦和信任網域帳號時,只會向 PDC 提交申請,而不會向 BDC 申請的!因為 BDC 只是一備分網域控制器!它完全不會用來負擔管理網域資料的責任,但是在持別的情況下,管理者是可以直接在 BDC 下使用 pdbedit 或者 smbpasswd 來新增或修改使用者帳號的。
設定 Samba ldapsam 下之 BDC 網域控制器
還記得你 PDC 的 smb.conf 的設定嗎?
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Processing section \"[print$]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions
# Global parameters
[global]
workgroup = GODCLICK
server string = %h server (Samba %v)
passdb backend = ldapsam:ldap://10.0.2.178
domain logons = Yes
preferred master = Yes
domain master = Yes
ldap suffix = dc=swpearl,dc=com
ldap admin dn = cn=admin,dc=swpearl,dc=com
ldap ssl = no
[homes]
......
這是你 BDC 下的 smb.conf 的設定。
# testparm
Load smb config files from /etc/samba/smb.conf
Processing section \"[homes]\"
Processing section \"[printers]\"
Processing section \"[print$]\"
Loaded services file OK.
Server role: ROLE_DOMAIN_BDC
Press enter to see a dump of your service definitions
# Global parameters
[global]
workgroup = GODCLICK
server string = %h server (Samba %v)
passdb backend = ldapsam:ldap://10.0.2.178
domain logons = Yes
preferred master = Yes
domain master = No
dns proxy = No
ldap suffix = dc=swpearl,dc=com
ldap admin dn = cn=admin,dc=swpearl,dc=com
ldap ssl = no
[homes]
...
.......
在這裏你可以發覺 PDC 和 BDC 的 smb.conf 之差別只在於 \'domain master\' 這個設定。其它的設定可以說是完全一樣,另外因為 BDC 也會查詢 openLDAP 內的資料,因此你也是需要在 BDC 下執行 \'smbpasswd -w\' ,讓 BDC 也記錄了如何查詢 openLDAP 的資料。
# smbpasswd -w 123456
Setting stored password for \"cn=admin,dc=swpearl,dc=com\" in secrets.tdb
# pdbedit -Lw
root:0:44EFCE164AB921CAAAD3B435B51404EE:
32ED87BDB5FDC5E9CBA88547376818D4:[U ]:LCT-40973E12:
#
這樣你就可以使用 BDC 來查詢
OpenLDAP
內的帳號資料。
你也可以嘗試一下,如果網域成員能否在主網域控制伺服器查詢失敗時,會否轉而查詢副網域控制伺服器下的使用者帳號資料。
Samba 的 Domain Member
說到這裏 Samba 作網域控制器,已作了一非常簡單的介紹了;當然還有很多很有意思的主題還未在這裏提及的,例如︰ groupmap 和 idmap 等主題,當然還有 posixAccount 和 sambaSAMAccount 的聯合使用的問題,但是回到這文件的編寫目的,就是為 Samba 的網域結構作一定的簡介。(這裏可算是達到了!)
但是 Samba 在網域成員角色方面卻仍有一些十分重要的部分未在這裏作介紹。
這裏是 Samba 和 Microsoft 在 Active Directory 上互動關係。(暫時 Active Directory 和 Samba 的配搭上只出現在 Samba 成為網域成員的角色上,而不能出現在 Samba 的網域控制伺服器的角色上,這方面的研究將會出現在 Samba4 的發展上。)
Active Directory 的結構
Active Directory 在 Microsoft 下的出現,其實對網域結構和網域保安都提供了一很重要的改進。
首先 Active Directory 的組成上是由四個很重要的伺服器所組成︰ DNS 伺服器,DHCP 伺服器,LDAP 伺服器和 Kerberos 伺服器所組成。他們有良好的分工,這使得 Active Directory 有良好的保安結構,而且在管理上亦為輕易。例如使用 Kerberos 伺服器,這使得 Active Directory 在帳號認証時,不會直接把密碼在網絡上傳送,而是使用 Kerberos 的傳票形式來認証,這會使得網絡上的入侵者,無法捕捉使用者的密碼資料。
另外 Active Directory 在使用 LDAP 來存放網域資料,這方面使得網域結構更為彈性和富有變化。例如︰在 LDAP 的結構下,網域的控制可以不只有信任網域結構下來作出分工,另外亦可以由分葉的結構下來作出分工,亦即是說︰在你的網域下可以有一 Active Directory 網域為 samba.org ,而另外可以在另 Active Directory 網域為 hk.samba.org
而這網域是在 samba.org 之下的,但卻又可以獨立地加以管理。
Samba 的 security ADS
Samba 和 Active Directory 的合作模式暫時只在於和 Microsoft 的 Kerberos 服務器溝通,這方面可以看作是保安上的一大進步。但是在網域結構上卻仍沒有很大的改進,暫時 Samba 亦是停留在 NT4 的結構上。
但是這卻是下一大版本 Samba4 躍進上的目標。
Samba4 的目標
在 Active Directory 的結構下,Samba4 要面對的問題可以說是有兩大方面︰
-> 能接收 LDAP 的通信協定方式來發放網域下的資料內容,這亦是 Active Directory 內的網域資料發放方式。
-> 為何 Samba4 要從新建立這方面的資料發放的方式。
=> 先要了解的是 Samba 現在仍是大量倚重 tdb 資料檔案;但是這資料檔案卻亦有很大的問題,可看前文的分解,tdb 是不能接收 LDAP 形式的資料查詢。(其實現在的 Samba 伺服器已能夠把資料放在不同的資料庫下,如 mysql 和 postgresql 中;但是這些資料庫仍是無法接收 LDAP 通信協定的查詢。)當然
OpenLDAP
能夠接收這方面的查詢,但是又要面對另一問題,就是如果要放資料進入
OpenLDAP
的資料庫內;必須要依從 schema 的設定。(見上文)而這方面 schema 的設定卻是令
OpenLDAP
要完全代替 Active Directory 的 LDAP 功能成為巨大的阻力。因為現時 Active Directory 的基本 schema 結構已能填滿一本厚厚的巨著了,如果 Samba 由現在開始要從新重寫這方面的資料;一定是一件吃力又不討好的工作!(如果有自願人士為這方面努力,可以聯絡本會。)
=> 所以 Samba-term 正在開始設計另一資料存取的方式,這方式就是 ldb ,它將會是一個建立在不同的資料庫上的共同通信層面,這層面會使得存在在不同資料庫下的資料能共同使用這層面而達致資料庫內的資料能使用 LDAP 的通信協定來查詢。因此就可以使資料存放富更大的彈性,另外又可以符合 Active Directory 的模式而被 Microsoft 的使用者查詢。
Samba4 的目標(二)
在 Active Directory 的結構下,還有另一個問題,就是如何讓 Microsoft 的信任電腦查詢 Unix 下的 Kerberos ,提取票據?
要明白這方面的問題,首先要理解 Microsoft 網域下的信任電腦在查詢 Micorsoft Kerberos 時,他們在提取票據時使用 Microsoft RPC 傳呼的,而在 Unix 的 Kerberos 在為他的服務器提供票據時,卻是使用 keytab 的方式;固定地存放在服務器的檔案系統下。這方面的差別就是 Samba 另一個需要努力的地方。
未來 Samba 的展望
其實現在 Samba 已能完全實現 NT4 級數的網域伺服器,而且現在大部分的小型公司仍在使用 NT4 作其網域伺服器。加上 Microsoft 更停止對 NT4 的支援服務,因此亦是時候把你公司內的伺服器升級作 Samba 網域控制器了。
另外在未來的日子,Samba 亦會使用 Microsoft 的 Active Directory 的網域結構下提供網域控制伺服器的服務,因此你的公司亦更可以對 Samba 的未來投下更大的信任一票。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/13270/showart_69290.html |
|