從訪問控制的觀點談windows的多使用者

科技小能手發表於2017-11-12

前面從歷史的角度簡單談了一下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


相關文章