跳轉到內容

作業系統設計/安全演變:能力

來自華夏公益教科書

關鍵定義

[編輯 | 編輯原始碼]

參與者是指可能執行操作的實體。這通常是使用者、程序、執行緒或類似的實體。

被執行者物件是指可能被參與者操作的實體。它可能是檔案、登錄檔項、關係資料庫條目、硬體裝置或類似的實體。通常,它是資料。參與者通常也可以作為物件;一個程序(作為參與者)可以殺死另一個程序(作為物件)。

操作許可權是指參與者可以對物件執行的操作。示例操作包括讀取和寫入。

安全系統通常實現一個有用的三維矩陣子集,矩陣的維度是參與者、物件和操作。出於效能和可用性的原因,永遠不會實現完整的矩陣。

主流作業系統安全主要基於訪問控制列表。對於每個物件,我們可以維護一個參與者列表,這些參與者可以操作它。

基於能力的系統(不要與將特殊管理能力稱為能力的系統混淆)以另一種方式反轉了這些東西。對於每個參與者,他們維護一個物件列表,參與者可以對其進行操作。

主流作業系統安全是可選擇的。也就是說,物件所有者可以決定誰可以訪問該物件。

強制訪問控制是非可選擇的。一組規則用於執行安全,設定使用者無法覆蓋的許可權。這可以阻止內部人員成為有效的間諜,將設計出售給競爭對手,與媒體分享醫療記錄,執行間諜軟體,以及防止許多型別的使用者錯誤。

上述方法中沒有一個方法排除任何其他方法。DG/UX 具有能力、可選 ACL 和強制訪問控制。Linux 提供可選 ACL 和幾種強制訪問控制選擇。所有類 Unix 系統上都可用的檔案描述符可以用作能力。

第一次安全嘗試是保護方案,它控制程式訪問敏感區域,例如第 0 頁(通常儲存作業系統呼叫的軟體中斷以進行高效呼叫)或作業系統區域(作業系統程式碼在執行時保留的地方)。這種能力是分時必不可少的,因為新手程式設計師有時會覆蓋作業系統,導致整個計算機關閉,因為他們不理解定址系統。像 Z80 這樣的 CPU 開始被設計為設定 aside "系統" 區域,以便它們不會被錯誤地覆蓋。

一種方法是為系統建立單獨的名稱空間並控制對它的訪問。通常,訪問受保護模式的文件很少,或者在流行的書籍中缺失,試圖透過模糊性來保護它。事實證明,這相對毫無用處,因為它意味著為資訊建立了地下市場,只有破解者才能確定他們是如何入侵作業系統的。

一些 CPU 將複雜的軟體中斷設定為受保護模式記憶體和使用者區域之間的閘道器。每個使用者區域都有自己的軟體中斷區域,該區域對受保護的系統區域執行系統呼叫,因為中斷區域位於使用者空間,因此中斷向量可以隨意覆蓋,而不會影響任何其他程式對作業系統的使用。這是一個有用的機制,因為外圍驅動程式傾向於為特定外圍裝置提供自己的中斷服務例程。

像 Windows 這樣的應用程式可以建立其自身的虛擬化版本,並修改該單個虛擬版本中的中斷,而不會影響作業系統的其餘部分。這通常是 286 和 386 受保護模式之間的區別,Windows 的虛擬副本具有修改其自身中斷向量而不影響機器其餘部分的能力。在 386 受保護模式之前,所有程式共享相同的中斷向量,一個程式的錯誤處理或惡意軟體對中斷的破壞可能會導致整個系統崩潰。

訪問控制列表

[編輯 | 編輯原始碼]

傳統的 Unix 訪問控制是一種可選 ACL。許多可能的動作被歸類為四類:讀取、寫入、執行和特殊操作,這些操作通常保留給物件所有者。與每個物件相關聯的參與者列表相當受限,簡化了實現和使用者體驗。列出了三個參與者:所有者、組和其他。參與者獲得其符合條件的第一個參與者的許可權。所有者始終獲得其他人沒有的特殊操作。組是對其他地方指定的參與者列表的間接引用,因此是一種壓縮形式。“其他”就是這樣,所有其他參與者。透過建立組,傳統的 Unix 訪問控制可以提供很大的力量。但是,建立組通常有限制,通常需要人類批准的管理操作。

動作類別可能或多或少細粒度。Netware 使用讀取、寫入、建立、擦除、修改、檔案掃描、訪問控制和管理員。系統可以將正常的“寫入”類別分成覆蓋和追加。系統可能缺乏“執行”類別,而是簡單地要求讀取訪問許可權來執行檔案。

許多系統允許將相當任意的參與者列表與每個物件相關聯。這包括 Windows、現代類 Unix 系統(包括 Linux)和 Netware。列表可能支援十幾個條目或數百個條目,具體取決於效能和控制之間的良好折衷方案。

ACL 中的一個有趣創新是層次參與者。例如,VSTa OS 使用十進位制、點分隔的參與者識別符號。在這個方案中,使用者 ID 是由點分隔的一系列十進位制數字(例如,1.85.23.323.888),如果使用者擁有一個使用者 ID,該使用者 ID 與物件的 user ID 一致,直到其結尾,那麼使用者擁有該物件。因此,例如,擁有 user ID 1.85.23 的使用者將擁有分配給 1.85.23.323.888 的任何物件,而該物件本身(無論是其他使用者還是程式)將無法訪問 1.85.23 擁有的其他物件。此方案允許動態建立使用者和子使用者的層次結構。可以透過提供一種機制讓類 Unix 系統的使用者建立和控制組來實現與大量 POSIX 軟體相容的這種較弱的形式。

能力是不可偽造的物件引用,允許其持有者訪問在該物件上定義的一組定義明確的操作。

有許多不同的東西可以作為能力。有被稱為“密碼”的人類可讀能力,人們使用它。有實驗性作業系統核心實現的扁平、低階、集中式能力。有 Kerberos 伺服器授予的票證。有 Unix 風格的檔案描述符,它們可以從一個程序傳遞到另一個程序以提供訪問許可權。

KeyKOS 和 EROS 等作業系統使用扁平、低階和高度集中式的能力,將人類有用的能力的實現留給更高階的層。

這種方案中的能力是**扁平的**,因為它們無法被查詢。你無法向這樣的能力詢問諸如它何時被建立或被訪問了多少次之類的資訊。這些能力也不具備可以被修改的內部狀態。通常,你可以從你擁有的能力中建立一個新的降級能力,但你不能降級或以任何方式改變原始能力本身。這些能力不是物件,而是原始資料型別。

這種方案中的能力是**低階的**,因為它們不提供高階的安全抽象。在 KeyKOS 中,能力只有兩種型別:讀和讀寫,儘管 KeyKOS 能力可以包含其他資訊來實現服務級別和其他類似的功能。這種方案中的能力不會自然地聚合其他能力(一種非常簡單且非常有用的安全抽象),必須人為地在它們之間建立一個唯一職責是聚合它們的中間物件。請注意,某些安全抽象(例如動態許可權繼承)在低階系統之上幾乎無法實現。

這種方案中的能力是**集中化的**,因為核心,且僅核心,管理所有能力。而不是每個模組都匯出自己的能力,核心中只有唯一的可用能力。這實際上是使用低階能力的結果。如果能力足夠高階以提供訊息傳遞服務,那麼強迫每個模組使用所有透過單個受保護核心能力路由的二級能力是可行的。相反,KeyKOS 中的每個模組(稱為域)最多隻能訪問 16 個在核心保護的特殊槽中且只能透過特殊呼叫訪問的特殊能力。

強制訪問控制

[編輯 | 編輯原始碼]

傳統的強制訪問控制或**MAC**以美國政府處理機密資訊的方式為模型。更具體地說,這是**強制敏感性控制**或**MSEN**。存在安全級別,如最高機密、機密、機密和非機密。存在基於知情權或特殊程式訪問的類別。擁有機密訪問許可權的參與者禁止讀取最高機密資料,但可能被允許寫入它。(儘管可能存在額外的可選 ACL 來阻止這種情況)。你可能能夠從較低的安全級別讀取,並寫入較高安全級別。可能存在汙染的概念,允許擁有機密訪問許可權的參與者寫入非機密資料,只要沒有讀取機密或機密資料。

強制完整性控制(**MINT**)則反過來,防止原始物件被垃圾汙染。在這種情況下,所有參與者都允許讀取最受信任的資料。嘗試執行從不受信任的來源下載的內容的參與者將被阻止,或者將失去寫入更受信任物件的許可權。

更現代的系統將 MSEN 和 MINT 的功能結合到具有角色的狀態轉換模型中。當參與者執行操作時,它們的狀態可能會改變。在具有基於角色的訪問控制的類 Unix 系統中,執行新的可執行檔案是狀態轉換髮生的一個特別重要的點。基於角色的安全對於執行隱私法規(例如 HIPPA(美國醫療資訊法)和歐盟隱私法)特別有用。這兩種流行的實現是 SE Linux 和 RSBAC,兩者都可用於 Linux。

加密訪問控制

[編輯 | 編輯原始碼]

國際網路的出現將安全問題擴充套件到作業系統的通常領域之外,擴充套件到透過網路進出系統的移動資料。模仿有效資料包的能力意味著資料可以在途中透過簡單地重新路由有效資料包並用無效資料包替換它來更改。因此,安全不僅必須擴充套件到本地系統,還必須擴充套件到系統之間所有關鍵的通訊。最初,透過將原始資料的摘要作為資料流的一部分發送來實現這些機制,假設更改後的資料包將不適合原始摘要。但是,發現摘要在密碼學上不安全,可以被欺騙成認為資料是有效的,而實際上並非如此。此外,以明文傳送資料意味著介入系統中的某人可以使用資料包嗅探器讀取資料包,並瞭解資訊是什麼。

當確定了這一點時,想法變成了對資料進行加密保護,這至少可以希望減緩郵件的讀取速度,並對摘要進行加密保護,以便它不會那麼容易被欺騙。

華夏公益教科書