何謂安全性識別碼
微軟Windows作業系統環境中,安全性識別碼 (Security Identifier,SID)是一個獨一無二的變動長度識別碼,藉以驗證與授權某一安全性主體(Security Principal),而所謂安全性主體則是一個可被電腦系統驗證或授權的單位或實體,通常指的是使用者,群組或電腦。換言之,Windows系統利用安全性識別碼來代表每個安全性主體(Security Principals),因此Windows系統下的每部機器(Machine)、每個網域電腦帳戶(Domain computer
account)、使用者(Users)和安全性群組(Security Type Groups)都會有一個唯一的安全性識別碼以做為主體日後驗證和存取控制之用。
機器SID結構
SID本質上是一個變動長度的數值,其資料結構與格式如下圖所示:
- 由S字元開始
- 修訂版 (Revision):目前的修訂版為1
- 識別碼授權: 幾個內建的授權ID為:
- SECURITY_NULL_SID_AUTHORITY: 0
- SECURITY_WORLD_SID_AUTHORITY: 1
- SECURITY_LOCAL_SID_AUTHORITY: 2
- SECURITY_CREATOR_SID_AUTHORITY: 3
- SECURITY_NT_AUTHORITY: 5
- 次授權:多個次授權,而最後一部份稱為相對識別碼 (Relative Identifier;RID),用以辨識同一部機器或網域內的不同安全性主體,而內建帳戶的RID為預先定義的固定值,例如內建的管理員帳戶 administrator的 RID固定為500。
您可以利用微軟sysinternals網站下戴 psgetsid工具程式來檢視SID值,如下圖圖例所示,您可以看到機器的SID以 S字元為啟始,接下來依序為修正版1,識別碼授權為5(NT Authority) ,代表是Windows SID--5,而後的四個次授權,除了第一個為固定值21 (SECURITY_NT_NON_UNIQUE),用以指出接續為Domain ID,而其後三個次授權為隨機產生以確保網路上的唯一性。
上述的SID的結構有些複雜而難以理解,幸好所有安全性主體的SID都是在創造時被自動產生,管理員並不需要手動產生與特別處理。
使用者和群組的SID
Windows 系統安裝完成後內建一些本機使用者帳戶(例如administrator、guest)以及本機群組帳戶(例如administrators、guests),此外為了存取控制之目的,還存在為數不少且無法由管理員控制成員權的特殊ID(例如 everyone 、Creator Owner.....),這些內建帳戶或ID的SID或最末端的RID值基本上是固定(不論哪一部機器),常見的重要例子如下:
- 內建本機使用者帳戶:S-1-5-21-<Domain>-RID,
- RID=500為內建的administrator帳戶
- RID=501為內建的guest帳戶
- 內建本機群組SID:S-1-5-32-RID,
- RID=544為內建的administrators群組
- RID=545為內建的users群組
- RID=546為內建的administrators群組
- RID=547為內建的Power users群組
- ...............
- 內建的特殊ID :S-1-X-X
- Everyone:S-1-1-0
- Console Logon:S-1-2-1
- Creator Owner:S-1-3-0
- Network:S-1-5-2
- Authenticated Users:S-1-5-11
- .......................
另一方面,架設Active Directory目錄服務的環境,目錄資料庫內存有內建網域使用者,內建全域群組(Global Group)、網域本機群組 (Domain Local Group)與萬用群組(Universal Group)等內建帳戶亦各自有一致性的RID。
- 內建全域群組:S-1-5-21-<Domain>-RID
- RID=512為內建的Domain Admins 全域群組
- RID=513為內建的Domain Users 全域群組
- RID=516內建的Domain Controllers全域群組
- .....................
- 內建萬用群組:S-1-5-21-<Root Domain>-RID
- RID=518為內建的Schema Admins萬用群組
- RID=519為內建的Enterprise Admins萬用群組
上述均是Windows所使用的內建帳戶的安全性識別碼,而管理員手動自行新增的本機使用者帳戶和本機群組帳戶則會以其機器安全性識別碼為基礎,再附加額外的大於1000的數值(RID)成為其SID。
下面圖例說明了使用者可以利用whoami /user命令來查看自己的SID,利用wmis useraccounts 指令可顯示目前所有使用者的SID,
底下的圖例示範亦可看出一旦新增一個使用者帳戶david,則新增的使用者會取得一個機器SID後,再附加上一個唯一且大於1000的RID值做為此新增帳戶使用者的SID。
變更機器SID
每部Windows機器的SID均由安裝程式自動隨機產生,因此具有唯一性,日後如有需要變動則可以透過微軟系統準備工具 (%windir%\system32\sysprep\sysprep.exe)的一般化選項來重新產生另一個SID。
需要變更SID的情況大多是使用映像檔複製部署的環境以確保網路環境中的每部機器的SID不會重複。
Active Directory 網域環境下的SID探討
Active Directory目錄服務環境下,每部加入網路的機器會被建立一個網域電腦帳戶(預設上在Computers容區下),因此網域內的電腦除了機器本身的SID之外,還會多一個網域電腦帳戶的SID,您可以利用 psgetsid顯示本機機器SID,利用 psgetsid %computername%$ 來顯示網域電腦帳戶的SID。
網域控制站(Domain Controller)的SID則是另一則不同的故事,網域內第一部網域控制站本身的機器SID會被做為網域之SID,第二部以後的複本網域控制站的原始機器SID會被捨棄而改為第一部網域控制站的SID,因此網域內的每一部網域控制站將擁有一樣的機器SID,但它們如何區分呢,自然是利用網域電腦帳戶SID內的RID來區別,下圖以一個實例說明了網域內控制站與工作站的SID,您需要了解機器SID與電腦帳戶SID的不同與變化。
- 第一部網域控制站的機器SID是相當特殊而重要的,因為它用來產生網域的SID。
- 所有網域控制站均會擁有一模一樣的機器SID,亦即使用第一部網域控制站的機器SID。
- 每部網域控制站的電腦帳戶內的RID均不相同而可辨別。
- 即使採用映像複製的機器在加入網域之後,雖然其機器SID一樣,但其電腦帳戶SID內之尾端的RID仍不相同而可區分。
基於以上的了解,Active Directory目錄服務環境下一個SID重複問題而導致發生錯誤的情境為:倘若您採用映像複製方式而產生了二部機器SID相同的電腦,日後將一部設定為網域的第一部網域控制站,而另一部企圖加入這個網域做為其成員伺服器,不過此機器SID將會和所有網域控制站一樣而無法有效區分,這就會產生錯誤而無法順利加入網域。
相同的道理,若使用和第一部網域控制站相同SID的電腦(因拷貝自同一個系統映象範本)來新增複本網域控制站,也會發生無法新增複本網域控制站的錯誤結果。
SID唯一性問題
在傳統的Windows 文件與教材大多要求每部機器的SID需具有唯一性,但很少有文件或實例告知或證實,一旦網路上出現二部機器具有相同的SID時會產生何種不良影響或發生何種錯誤。
就存取控制層面而言,若二部機器SID相同是否會產生存取上的安全性疑慮,由於機器的SID並不會傳送出本機以外之範籌,故似乎並不會有偽裝或未經授權存取的安全疑慮。
在Active Directory目錄服務環境下,所有網域控制站原本就設計使用相同的機器SID,但利用電腦帳戶的RID即可順利區別不同網域控制站的身份,另一方面,即使二部網域內的成員伺服器由於採用映像檔複製方式(沒有執行sysprep)而導致機器SID一樣,但網域內執行存取或授權時通常並不會使用本機帳戶,而是利用加入網域後的電腦帳戶SID,因其RID並不相同而可被區分。總之,只要網域控制站的機器SID與成員伺服器的機器SID不相同就不會有問題。
筆者在上述網域環境下執行相同SID機器上的存取測試亦未見有任何存取上的異常或非預期現象,所以筆者認為有重複機器SID的環境下若會發生問題可能只存在於某些應用程式,因為這些應用程式利用機器SID做為電腦列舉、辨識之依據,目前就經驗而言,Windows Server上的Windows 伺服器更新服務 (WSUS)若在存在有重複SID的機器時似乎就會出現問題而無法正確更新。
最佳實務建議
Windows 機器SID 相同重複可能導致嚴重後果已是很久的「傳聞」,但事實上並未證實發生,不過由於類似WSUS應用程式使用機器SID登錄與辨識可以更新的機器,因此導致某些複製映像的機器可能無法順利更新或產生正確報表,雖然這類應用程式不多,卻也無法預測是否有如此的應用程式會出現在您的網路環境中,因此微軟的政策仍是建議,用以映像部署的範本系統,仍應在部署複製前先執行sysprep工具的一般化處理,以便部署後會重新產生一個新的SID以確保日後不會發生任何非預期的現象。