[轉載]ACM(訪問控制模型),Security Identifiers(SID),Security Descriptors(安全描述符),ACL(訪問控制列表),Access Tokens(訪問令牌

對於《windows核心編程》中的隻言片語沒法驅散心中的疑惑。就讓MSDN中的解釋給咱們一盞明燈吧。若是要很詳細的介紹,仍是到MSDN仔細的看吧,我只是大致用容易理解的語言描述一下。mysql

 

windows的安全訪問控制(ACM,access control mode)是由兩部分組成的。一個是訪問令牌(access tokens),另外一個是安全描述符(security identifiers)。程序員

 

訪問令牌是欲進行訪問的進程使用的代表本身身份和特權的信息數據。算法

安全描述符是欲被訪問的安全對象的相關安全信息。如什麼樣的用戶的什麼訪問請求能夠被容許,什麼樣的用戶或者組的什麼訪問要被拒絕。sql

  • Security Identifiers(SID)

常常聽到SID,那麼什麼是SID呢,MSDN中說,SID是用來標識信任方的惟一的數值,其長度可變。而信任方就是用戶,組,會話。因此基本上能夠把SID理解爲是一個用戶名,一個組名,會話名。只是他們是通過安全認證,且不會重複,也就是安全可靠的。若是咱們提到張三這個用戶的SID,那麼咱們就能夠理解爲「張三(真)「。數據庫

  • Security Descriptors(安全描述符)

MSDN說安全描述符包含了描述一個安全對象的安全信息。其實這句話說的很對,只是是大概上的。讓咱們具體看看安全描述符到底描述了哪些東西?編程

 

安全描述符包括:windows

1.與安全描述符關聯的安全對象的擁有者的SID和此擁有者所在主羣的SID安全

2.一個DACL(discretionary access control list)數據結構

3.一個SACL(system access control list)ide

4.和安全描述符意思相符的控制位集合

 

第一點不用說了,第二,三點看下面的ACL有詳細解釋,DACL和SACL分別是ACL的一種類型。第四點暫且不詳。 

  • ACL(訪問控制列表,access control list)

 一提到像訪問控制列表這樣的東西,就會比較畏懼。其實一開始本身也很畏懼。由於之前一直對那些計算機理論術語很沒感情。不過理解以後仍是挺不錯的。

ACL包括兩種類型的訪問控制列表,但不論是哪一種列表它們的基本格式是同樣的,那就是列表,列表入口(也叫訪問控制入口,ACE,access control entry)。這兩種安全控制列表分別是:

 

1.DACL(自由訪問控制列表)

就像它的名字同樣,DACL就是一個代表其它全部人的自由的(相應的)訪問控制列表。這是什麼意思呢?讓咱們具體看看DACL裏面是什麼東西吧。看下圖你就比較明白了。

 

 DACL

 

相信看了這個圖能明白一大半。一個DACL是一個列表,每一個列表入口(ACE)都是一個對某個SID的訪問控制說明,描述這個SID是被拒絕仍是被容許,若是容許的話,對這個SID給予什麼權限。固然這個圖很形象,但實際中ACE裏面不是一個一個的字符串,這個ACE是怎麼樣的呢?

ACE其實由四部分組成,只是上面的圖畫的太好了。

這四部分分別是:

 

1.可能訪問本ACE某個用戶SID(對應Andrew)

2.該用戶的訪問權限的掩碼(Read,write,execute)

3.ACE的類型,總共有三種。Access-denied ACE,Access-allowed ACE,System-audit ACE。前兩種是DACL類型,最後一種是SACL類型。

4.這個ACE是否能夠被其餘安全對象繼承。

 

那麼DACL是如何工做的?

就想上圖顯示的同樣,線程訪問安全對象,要出示本身的令牌(說的很人性化似地,實際上是有操做系統查看線程access tokens數據結構),將access tokens的用戶SID,所屬組羣SID以及相應的權限與DACL裏面的每一個ACE相應的數據項進行比較,直到比較到一個ACE明確容許這個線程的所需操做,或者明確拒絕這個線程的訪問要求,再或者沒有找到上面任何一種狀況比較結束了,那麼就默認的拒絕。這個鏈表的比較是順序的,從頭至尾。若是鏈表的順序變了,或許原來訪問請求的結果就樣了。

例如將上圖中ACE3和ACE1的順序調換過來,Thread A的請求就會被容許。因此順序很重要。因此若是要構建一個安全描述符的DACL的話,用API添加ACE的時候,程序員要謹慎處理。注意API函數添加ACE始終實在鏈表末尾添加的。

 

ACE繼承沒有徹底研究,暫且擱淺!

 

2.SACL(系統訪問控制列表)

 

SACL是什麼呢?其實就是一個審計中心,這個列表裏面列舉着那些類型的訪問請求須要被系統記錄。一旦有用戶訪問一個安全對象,其請求的訪問權限和SACL中的一個ACE符合,那麼系統會記錄這個用戶的請求是被拒絕了仍是被容許了。MSDN說起說,未來可能會實現安全對象會對未經受權的用戶訪問發出警告信息。

  • Access Tokens(訪問令牌)

咱們能夠這樣理解訪問令牌,不過仍是先把完整概念介紹一下。

訪問令牌是包含12項,分別是:

  1. 當前用戶的安全ID(稍後介紹),
  2. 當前用戶所屬組的安全ID。
  3. 當權會話安全ID。
  4. 用戶全部的特權列表(包括用戶自己,和其所屬組)。
  5. 令牌擁有者安全ID。
  6. 用戶所屬主組羣安全ID。
  7. 默認的自由訪問控制列表(稍後介紹)。
  8. 源訪問令牌
  9. 代表此令牌是源令牌仍是模擬令牌
  10. 可選的鏈表,代表此令牌限制哪些SID
  11. 當前模擬令牌的級別
  12. 其餘數據資料

看到這麼多數據項,你該知道安全措施須要付出多大的代價了吧。

訪問令牌描述了一個進程或線程的相關的安全信息。這些信息代表與這個進程或者線程關聯的用戶的標識符和特權。當用戶登錄系統是,將用戶密碼和系統內數據庫內的響應密碼對比,若是驗證經過,系統給用戶產生一個訪問令牌。之後這用戶打開的全部線程都是繼承與這個令牌。拿着這個令牌去訪問安全對象。(Windows vista以後已經不同了,若是是管理員登錄的話,管理員獲得的訪問令牌,和管理員啓動的進行所擁有的令牌不同,進程的令牌是被篩選的,或者說是下降權限的,進程要得到管理員的訪問令牌(或者會所權限),就必須發出申請,系統顯示一個對話框,是否容許這個程序以這種方式啓動。)

 

每一個進程至少有一個訪問令牌,那就是主訪問令牌,爲何是主呢?由於有些進程可能模擬另外一個用戶,並會或者另外一個用戶的令牌,而那個令牌就是模擬令牌。而系統在將進程的訪問和安全對象進行審覈是,使用的是主訪問令牌。具體的暫且未知。

 

這樣基本上初步瞭解了一下,windows 的ACM了。

相關文章
相關標籤/搜索