天天看點

ACM(通路控制模型),Security Identifiers(SID),Security Descriptors(安全描述符),ACL(通路控制清單),Access Tokens(通路令牌)

對于《windows核心程式設計》中的隻言片語無法驅散心中的疑惑。就讓MSDN中的解釋給我們一盞明燈吧。如果要很詳細的介紹,還是到MSDN仔細的看吧,我隻是大體用容易了解的語言描述一下。

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

通路令牌是欲進行通路的程序使用的表明自己身份和特權的資訊資料。

安全描述符是欲被通路的安全對象的相關安全資訊。如什麼樣的使用者的什麼通路請求可以被允許,什麼樣的使用者或者組的什麼通路要被拒絕。

Security Identifiers(SID)

經常聽到SID,那麼什麼是SID呢,MSDN中說,SID是用來辨別信任方的唯一的數值,其長度可變。而信任方就是使用者,組,會話。是以基本上可以把SID了解為是一個使用者名,一個組名,會話名。隻是他們是經過安全認證,且不會重複,也就是安全可靠的。如果我們提到張三這個使用者的SID,那麼我們就可以了解為“張三(真)“。

Security Descriptors(安全描述符)

MSDN說安全描述符包含了描述一個安全對象的安全資訊。其實這句話說的很對,隻是是大概上的。讓我們具體看看安全描述符到底描述了哪些東西?

安全描述符包括:

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

2.一個DACL(discretionary access control list)

3.一個SACL(system access control list)

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

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

ACL(通路控制清單,access control list)

 一提到像通路控制清單這樣的東西,就會比較畏懼。其實一開始自己也很畏懼。因為以前一直對那些計算機理論術語很沒感情。不過了解之後還是挺不錯的。

ACL包括兩種類型的通路控制清單,但不管是哪種清單它們的基本格式是一樣的,那就是清單,清單入口(也叫通路控制入口,ACE,access control entry)。這兩種安全控制清單分别是:

1.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項,分别是:

目前使用者的安全ID(稍後介紹),

目前使用者所屬組的安全ID。

當權會話安全ID。

使用者所有的特權清單(包括使用者本身,和其所屬組)。

令牌擁有者安全ID。

使用者所屬主組群安全ID。

預設的自由通路控制清單(稍後介紹)。

源通路令牌

表明此令牌是源令牌還是模拟令牌

可選的連結清單,表明此令牌限制哪些SID

目前模拟令牌的級别

其他資料資料

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

通路令牌描述了一個程序或線程的相關的安全資訊。這些資訊表明與這個程序或者線程關聯的使用者的辨別符和特權。當使用者登陸系統是,将使用者密碼和系統内資料庫内的響應密碼對比,如果驗證通過,系統給使用者産生一個通路令牌。以後這使用者打開的所有線程都是繼承與這個令牌。拿着這個令牌去通路安全對象。(Windows vista之後已經不一樣了,如果是管理者登陸的話,管理者得到的通路令牌,和管理者啟動的進行所擁有的令牌不一樣,程序的令牌是被篩選的,或者說是降低權限的,程序要獲得管理者的通路令牌(或者會所權限),就必須發出申請,系統顯示一個對話框,是否允許這個程式以這種方式啟動。)

每個程序至少有一個通路令牌,那就是主通路令牌,為什麼是主呢?因為有些程序可能模拟另一個使用者,并會或者另一個使用者的令牌,而那個令牌就是模拟令牌。而系統在将程序的通路和安全對象進行稽核是,使用的是主通路令牌。具體的暫且未知。

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

繼續閱讀