安全、虛擬化與分散式系統 (Security, Virtualization, and Distributed Systems)
本系列文章內容參考自經典教材 Operating System Concepts, 10th Edition (Silberschatz, Galvin, Gagne)。本文對應章節:Section 1.6 Security and Protection、1.7 Virtualization、1.8 Distributed Systems。
1.6 保護與安全 (Security and Protection)
為什麼需要保護?
當一台電腦有多個使用者並且同時執行多個 Process 時,就會產生一個核心問題:誰可以存取什麼? 如果沒有任何管制,任何 Process 都能隨意讀寫其他 Process 的記憶體、搶奪 CPU 時間,甚至直接操控硬體裝置。在這樣的環境下,系統根本無法穩定運作,更不用說確保資料的安全。
因此,OS 必須提供機制,確保檔案、記憶體片段、CPU 與其他資源,只能被取得適當授權的 Process 操作。這個管制機制就是「保護(Protection)」的核心任務。
保護 vs 安全:兩個不同的問題
這兩個詞在日常生活中常被混用,但在 OS 中有精確的區別:
保護 (Protection) 是一種機制,用來控制哪些 Process 或使用者可以存取哪些系統資源。它回答的問題是:「誰被允許做什麼?」
保護的例子:
- 記憶體位址硬體確保 Process 只能在自己的位址空間內執行
- Timer 確保沒有 Process 能永遠霸占 CPU
- 裝置控制暫存器(device-control registers)不可被使用者直接存取
保護不只是防止惡意行為。它還能提升系統可靠性,原理如下:系統通常由多個子系統(Subsystem)組成,子系統之間透過介面(Interface)互動。若這些介面有保護機制,當某個子系統出現潛藏錯誤(Latent Error)時,錯誤就會在介面處被攔截,不會蔓延污染其他健康的子系統。
相對地,若資源沒有保護,任何一個出問題的程式都可能直接寫壞共享記憶體,拖垮整個系統。保護讓錯誤的影響範圍縮小,也讓系統更容易偵錯。
安全 (Security) 則是防禦外部與內部攻擊的工作。它回答的問題是:「有沒有人在繞過規則攻擊系統?」
安全威脅的範圍非常廣:
- 病毒與蠕蟲 (Virus and Worms)
- 阻斷服務攻擊 (Denial-of-Service, DoS):耗盡系統資源讓合法使用者無法使用
- 身份竊取 (Identity Theft)
- 未授權使用系統資源 (Theft of Service)
值得注意的是,部分安全防護功能由 OS 本身承擔,另一部分則依賴政策(Policy)或附加軟體處理。隨著安全事件的快速增加,OS 安全功能已成為近年來研究與實作最活躍的領域之一。
想像這樣一個情境:使用者的身份驗證資訊(帳號密碼)被竊取。攻擊者以被竊取的身份登入系統,此時記憶體保護和檔案保護都正常運作,系統完全依規則行事,卻仍允許攻擊者讀取或刪除該使用者的資料。
這說明了一件事:保護管的是「規則本身是否執行」,安全管的是「有沒有人用非正常手段繞過這些規則」。一個系統可以有完善的保護機制,卻仍然容易受攻擊。兩者都需要,缺一不可。
使用者識別:User ID 與 Group ID
保護和安全機制的前提,是系統必須能夠區分所有使用者。大多數 OS 維護一份使用者名稱對應數字 ID 的清單:
- 使用者 ID (User ID, UID):每個使用者唯一的數字識別碼(Windows 中稱為 Security ID, SID)。使用者登入時,認證(Authentication)階段確定其 UID,之後所有由該使用者啟動的 Process 和 Thread 都帶有這個 UID。當 ID 需要顯示給使用者看時,OS 再將數字反查回使用者名稱。
- 群組 ID (Group ID, GID):有時需要對一組使用者授予相同的存取權限,而不是逐一設定。OS 維護一份群組名稱對應 GID 的清單,並將 GID 一併加入每個關聯的 Process 和 Thread。一個使用者可以同時屬於多個群組,取決於 OS 的設計。
以 UNIX 檔案存取為例:一個檔案的擁有者可以擁有讀寫權限,而特定群組的其他成員可能只有讀取權限。這種細粒度的控制,正是透過 UID 和 GID 的組合來實現。
特權提升 (Privilege Escalation)
正常使用時,UID 和 GID 已足夠。但有些工作需要暫時提升權限才能完成,例如存取受限的硬體裝置,或執行需要更高權限的系統管理任務。OS 提供多種提升機制,讓使用者在有限度的情況下取得額外的權限,同時又不需要給予完全的管理員(Root)存取權。
以 UNIX 的 setuid 為例:若程式設定了 setuid 屬性,執行該程式時,Process 的有效 UID(Effective UID) 會變成程式檔案擁有者的 UID,而非執行者的 UID。這讓普通使用者可以執行特定需要高權限的程式,執行完畢或放棄特權後,Process 回到原本的 UID。這個機制的重要性在於:權限提升是受控且暫時的,系統不需要把完整的 root 權限交給使用者。
1.7 虛擬化 (Virtualization)
什麼是虛擬化?
現代作業系統已經能可靠地在單一電腦上同時執行多個應用程式。但如果想要在同一台實體機器上同時執行多個不同的作業系統,該怎麼辦?
虛擬化 (Virtualization) 就是為了解決這個問題而生的技術。它把單一電腦的硬體(CPU、記憶體、磁碟、網路卡等)抽象化(Abstract)成多個獨立的執行環境,讓每個環境都像是在自己專屬的電腦上執行一樣。
每個這樣的環境稱為一個虛擬機器 (Virtual Machine, VM),可以獨立運行不同的 OS(例如同時跑 Windows 和 Linux),就像多個 Process 在單一 OS 上並發執行一樣。使用者可以在這些 VM 之間切換,就像在單一 OS 內切換不同 Process 一樣自然。
虛擬化的起源
虛擬化並不是新技術。它最初誕生於 IBM 大型主機(Mainframe),是為了讓多位使用者能夠同時使用一台設計給單一使用者的系統。執行多個虛擬機器,讓多位使用者得以在同一台大型主機上並行執行工作。
後來,VMware 公司面對在 Intel x86 CPU 上執行多個 Microsoft Windows 應用程式的問題,開發出一種新型態的虛擬化技術,以應用程式的形式運行在 Windows 之上。這個應用程式可以同時執行一個或多個 Windows 或其他 x86 原生作業系統的 Guest 副本,每個 Guest 都執行自己的應用程式,彼此完全隔離。