天天看點

從通路控制的觀點談windows的多使用者

前面從曆史的角度簡單談了一下linux的多使用者機制,主要了解到linux的多使用者是與生俱來的的,而且unix的多使用者也是曆史促就的,也是生來就有的,但是如果從通路控制的角度來闡釋多使用者概念的話,那說的就該多了,畢竟從某種意義上來講,之是以引出多使用者的概念,就是因為需要通路控制,也就是為了“不是自己的東西不要亂動”,其實也正是因為有很多使用者要操作計算機才需要通路控制。如果要從通路控制的角度談多使用者的話,那麼就要說說windows的多使用者機制了,也就是它的基于角色的多使用者機制,不過在說windows之前,還是先說說linux的通路控制。

linux的多使用者是基于對資源進行保護的,這裡面抽象出來幾個概念,一個是主體,就是通路對象即資源的執行緒,可以了解為程序(unix/linux程序的意義),一個是主角,也就是主體代理的實體,主角可以了解為使用者,另一個就是對象,也就是linux中的資源,是被通路控制限制通路的被動實體,在linux中一切皆檔案,那麼這裡的對象也就是檔案了。這裡面的事實是,一切操作都是程序來進行的,一切資源也是程序來通路的,說哪些資源哪些程序不能通路是沒有意義的,隻有當使用者(主角)綁定到程序(主體)時,通路控制才開始起作用,這時使用者即主角和對象即資源之間就有了通路控制,這裡面有兩層意思,一層是在使用者這邊,說明一個使用者可以通路以及如何通路資源,另一層意思就是一個資源可以被哪些使用者通路以及如何通路,這兩層意思裡面第一層意思就是unix傳統的“能力”的概念,第二個意思就是“通路控制清單(ACL)”,注意,通路控制和程序沒有太大的關系,隻是在使用者和資源之間展開,就好像兇手殺人和刀沒有關系,隻是和持刀的人和被殺的人有關,劊子手和殺人犯都拿同樣的刀,殺的都是人,然而意義不一樣,是以程序也就是個主體而已,它必須代表某一個主角後才可以行使權力,進行操作。以上的unix/linux上的通路控制和多使用者就引出了windows上的基于角色的多使用者的概念。

windows的多使用者其實不是與生俱來的,因為它不需要面臨多終端,它也不用承擔大型計算,它生來直接就是面向最終使用者的,是以多使用者在windows上的意義也就是一個通路控制,而和多終端,虛拟化,多道程式設計沒有關系。但是它的基于角色的通路控制的多使用者卻比unix複雜的多的多,熟悉人-機标尺的人應該都知道,windows的安全政策應該處于人-機标尺的人的這一端,而unix/linux的應該是機器那一端。在linux中,能力機制和資源的acl這兩個關卡就可以攔住一切,之是以可以做到就是因為unix/linux在機器那一端,它保護的是統一的vfs的檔案,而不是大千世界的種種。簡單的說,windows的通路控制政策就是unix能力機制的超級版本,因為windows是通過限制主體/主角的方式來進行通路控制的,在windows中為了實作這樣的通路控制,先将操作分類,然後将一批操作以允許或者拒絕的方式給一個“角色”,表示該角色可以或者不可以進行這個操作,一旦有主體(線程)啟動,也就是調用了CreateThread,那麼首先要初始化一個安全描述符,關于細節我們一會再談,然後初始化一個通路令牌,要通路被動對象時,先看令牌中有沒有允許,允許的話再看被動對象的安全描述符中的ace中是否允許該主體通路之,如果允許,則繼續通路,否則出錯。

在linux中,一個程序即主體拿着一個使用者辨別就可以走天下了,因為它要通路的就是檔案(一切皆檔案),而這個使用者能否通路盡在檔案的acl中了,但是到了windows下,一個主體即程序/線程通路一個對象,就不是拿着一個使用者辨別了,而是一個令牌,這個令牌擁有比linux中使用者辨別更多的資訊,包括SID,然後主體在通路一個對象的時候,安全管理機構會将令牌中的SID和被通路對象的安全描述符中的ACE中的SID相比較,然後查出該SID可以許給的所有操作,最終完成通路控制。windows的多使用者的概念就是由此引出的,就是為了通路控制,一個windows登入使用者擁有一個唯一的SID,然後登入後的使用者得到一個shell(很多情況下是explorer.exe),随之産生的使用者程序(主體)均由此SID産生通路令牌,然後通路對象,比如檔案,裝置,程序等等。windows在建立新使用者的時候就為該使用者初始化好了一個結構體,用于在該使用者登入的時候生成安全相關的結構,這就是windows的多使用者機制,看到了吧,基于角色的,這裡一個角色就是一個操作的集合,windows并不是嘗試在被動的被通路對象上設定單一的一次性設定完畢的通路控制清單來永久生效通路控制,而是在實際要通路的時候通過主體的令牌和對象的安全描述符動态監測通路控制,令牌也好,安全描述符也好,都是建立對象的時候動态生成的,而不像linux那樣通過chmod等等靜态設定的。這裡正好引出windows的一個很特别的特性,如果說unix/linux是一切皆檔案的話,那麼windows就是“一切皆對象”了,每個對象都可以擁有自己獨特的安全資訊,這樣的話就可以符合豐富(繁複)的應用需求。

在linux中,建立程序就是fork,建立線程就是clone,建立檔案就是open,看看它們的參數,一個比一個簡單,沒有任何安全相關的東西,也就是說在linux中,安全僅僅是一個對象的屬性,它的設定和建立該對象是分離的,再次顯示小顆粒的優勢(劣勢?);在windows中,所有東西都是對象,而在建立對象的時候,必然要有一個參數,那就是“安全描述符”的指針,也就是參數LPSECURITY_ATTRIBUTES lpSecurityAttributes,比如CreateFile,CreateProcess,CreateThread等等,安全是一切的首要因素,是以在建立對象的時候就要将添加安全屬性作為建立對象的一部分來進行,這樣就不會給任何不安全因素留下任何的空隙來鑽。在windows中,程序和線程不再像unix/linux中那樣被賦予很重要的地位,它們在windows中也僅僅是一個對象而已,從設計上講,一切皆對象也就不再反對程序之間互相直接通路了,其實原始的程序架構(其實就是unix的)就是指明程序之間要位址空間隔離,是十分反對程序之間直接互訪的,可是windows的一切皆對象将程序的意義向前推進,程序不是什麼特殊的東西,它就是個對象,隻要通路者獲得通路令牌,而且程序對象的安全描述符中允許通路者通路,那麼通路就是允許的,看來windows一切皆對象的思想改變了程序的意義,同時也改變了作業系統的意義。windows設計的先後順序就是一切皆對象是最基本的,其次在此基礎之上實作了基于角色的通路控制,然後為了友善産生了基于角色的使用者的概念。最後記住,windows的多使用者就是由通路控制而産生的,它不是由于真的需要多個使用者同時使用計算機這個需求而提出的概念,是以它的實作比較“政策”化一些。

接下來可以看一下linux和windows的“組”的概念,兩個系統都有這個概念,但是實作卻大相徑庭,在linux中,組就是一組使用者,比如web服務相關的配置檔案和程式被列為web組,在windows中,組就是一組特權,将一些操作列為一個組,然後配置設定一個安全結構,比如SID和其他結構,這其實是一個中間層,進一步分類罷了,之是以兩個系統有差別是因為它們在人-機标尺上的位置不同。

其實windows十分安全,它總是有問題是因為使用者,而不是因為作業系統本身。windows的安全就是對象的安全,而對象的安全全部都在封裝于對象的安全描述符中,而又有多少人真的在意過這個安全描述符,多少人甚至國人寫的windows的書上都忽略掉建立對象時的安全參數,如此一來一路的預設的危險設定,還怪系統不安全,不是系統不安全,而是人們沒有安全觀念。windows的政策就是使使用者迷失于複雜的操作,具有諷刺意味的是,人們對于安全性的複雜操作并不買賬,倒是有很多人會去讀ms word這樣的操作手冊來熟練那些複雜的文檔操作。想想看,windows的安全機制之是以在人-機标尺的左邊就是因為它兼顧了人的習慣,它是面向人的,而linux在人-機标尺的右邊,這樣的話,它在某種程度上對使用者是不可見的,透明的,對于windows使用者,必須十厘清楚這一點,否則這些人的系統将十分危險,面向機器的政策可以由系統完成,可是面向人的政策必然不能指望系統,看看對象建立函數的安全參數,那正是“面向人”的展現,如果你忽略了該安全參數,那麼系統安全也将忽略了你。

Windows的複雜的通路控制機制有的時候真的比linux的更加安全,比如windows中的使用者賬戶的sid是随即配置設定的,而linux的卻是根據提供的資訊建立的,也就是說,linux中的uid以及gid在提供資訊相同的情況下是相同的,而windows卻是通過一個僞随機數生成的sid,是以,當把一個賬戶删除以後,windows中也會删除這個使用者的一切權限,即使你用相同的資訊再建立一個相同名字的賬戶,那麼其權限資訊也将全部丢失,但是unix/linux中卻是無條件保留root賬戶,然後動态管理别的賬戶,如果我删除賬戶b,然後再建立b,那麼原來b的權限将全部保留,畢竟linux中是通過簡單的檔案系統的uid/gig的acl進行管理的,相反windows中就隻有兩類賬戶,一類是管理者賬戶一類是受限賬戶,所有的權限都是動态生成,如此看來,好像不好管理這些資訊,其實很簡單,windows中的受限賬戶的權限都是動态生成的,因為windows基于對象,是以對象的安全描述符起了很大的作用。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273453

繼續閱讀