“Unix 至少設立了三層内部邊界來防範惡意使用者或有缺陷的程式。一層是記憶體管理:Unix 用硬體自身的記憶體管理單元(MMU)來保證各自的程序不會侵入到其它程序的記憶體位址空間。第二層是為多使用者設定的真正權限組——普通使用者(非 root使用者)的程序未經允許,就不能更改或者讀取其他使用者的檔案。第三層是把涉及關鍵安全性的功能限制在盡可能小的可信代碼塊上。在 Unix 中,即使是 shell(系統指令解釋器)也不是什麼特權程式。”----《Unix程式設計藝術》:小即是美,這個詞有兩個例子可以證明,一個是古希臘的城邦,另一個是unix的程序設計原則。小,對于協作,可以最大化最簡易地排列組合(DNA/兩儀-四象-八卦);對于故障,可以最小化的影響其它;對于恩惠,可以最小化聚集和最大化擴散...小,可以更容易地由簡入繁,由繁化簡,在功能強大之後更簡單地尋求高效。
unix/linux中的pam機制是通過動态庫來實作的,之是以采用動态庫是因為它的“可替換性”,然後同樣的事情在windows卻成了盡量要避免的了,很多windows上開發的軟體都有認證功能,很多有經驗的人都會建議說,不要用dll實作認證,因為惡意者會替換掉這個實作認證的dll,這種說法也不無道理,看起來動态庫認證的可替換性在unix/linux和windows上的價值截然不同,一個因之使用它而另一個卻因之避免使用它,這就不得不扯到兩類系統的設計原則。unix/linux有着嚴格的使用者/組-權限的映射,而windows要麼不實作,要麼實作得很弱,如果不談使用者群習慣的話,這裡已經可以說明windows的設計弊端了,可是深入研究一下就會發現,windows如此實作還是有道理的,那就是使用者體驗簡單。windows的使用者主要個人使用者,使用作業系統的人很多時候就是一個人,而微軟在設計windows的時候并沒有将網絡考慮在内,最起碼沒有在網絡上花太大的力氣,是以windows中的使用者當然就不包括那些通過網絡連接配接進來的人們了,微軟作業系統的使用者的概念就是那個正在使用計算機的人的抽象,而unix中使用者卻隻是一個抽象的執行者,想 建立檔案,讀檔案,寫檔案,遠端登入等都需要一個合法的使用者,在這等意義上,windows當然就沒有必要去完善使用者-權限的映射了,如果說unix/linux是和網絡綁定在一起的話,那麼windows則是和不聯網的單台計算機綁定在一起的,是以一般的人都會使用administrator來登入機器,甚至計算機主人的朋友也會得到這個使用者的密碼,甚至windows機器是可以不設定密碼就可以登入的(linux則必須輸入root密碼)。是以在windows上工作,學習或者娛樂,如果你拔掉網線,然後清除一下病毒和木馬,接下來的經曆将是美好的,如果你插上了網線,那幾乎是噩夢的開始,任何東西都是不安全的,這是因為如此,實作認證的dll才會被輕易的替換掉,如此一來,可替換性反倒成了一個容易攻破的漏洞了。在unix/linux上工作時,由于這作業系統在設計和改良之初本身就內建了網絡,是以使用計算機的使用者可就不僅僅是機器前面的那個人了,早在unix設計之初,終端的意義非常之大,實作一個分時的作業系統目的就是讓很多使用者可以通過終端連接配接在一台處理機上,可見unix的使用者概念的持久性和重要性,linux就更不必說了,後來者的優勢在于省去了當初unix內建TCP/IP時的那些争論,在unix/linux上,使用者,權限,程序間通信,套接字,網絡這些概念是一體的,而不是分離的。既然unix/linux中有如此強大的使用者-權限映射功能,那麼“可替換性”也就是成了一種靈活性而不是一個漏洞了。
在unix/linux中,如果你删除/修改一個檔案失敗,那麼原因幾乎就是一個“無權限”,而在windows中,答案就是“此檔案正在被使用”了,被誰使用呢?哪個程序,目前是哪個使用者使用了它?...總之,很多因素揉在了一起。同樣一個機制,在設計原則不同的情況下,一個系統視此機制為禍,而另一個系統卻視此機制為福...兩類系統有時也會互相影響,比如用慣了windows的人總受不了linux的限制,于是他們總是使用root來登入系統。
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271825