安全威脅、政策與機制#

電腦系統的安全與**可靠性(dependability)**密切相關:一個可靠的系統,是我們有正當理由信任它能交付服務的系統(Laprie, 1995)。除了第 7 章談過的可用性、可靠性、安全性(safety)與可維護性之外,若要真正信任一個系統,還必須加上兩個性質:

  • 機密性(confidentiality):系統資訊只揭露給獲授權的對象。
  • 完整性(integrity):系統資產(硬體、軟體、資料)只能以獲授權的方式被更動;不當更動必須可偵測、可回復。

另一種看待安全的角度,是保護系統的服務與資料免受安全威脅(security threats)。威脅有四類(Pfleeger, 2003):

  • 攔截(interception):未授權者取得服務或資料的存取權,例如竊聽兩方通訊、非法複製私人目錄中的檔案。
  • 中斷(interruption):服務或資料變得不可用、不堪用或被破壞,例如檔案損毀遺失;阻斷服務(denial of service)攻擊即屬此類。
  • 竄改(modification):未授權地更改資料或篡改服務,使其不再符合原始規格,例如攔截並改寫傳輸中的資料、修改資料庫項目、讓程式偷偷記錄使用者活動。
  • 偽造(fabrication):產生原本不存在的資料或活動,例如在密碼檔中加入項目,或重放(replay)先前送出的訊息以侵入系統。

其中中斷、竄改與偽造都可視為某種形式的資料造假(data falsification)

光是宣稱「系統要能抵禦所有威脅」並不能造出安全的系統。首先需要的是一份安全政策(security policy)——精確描述系統中的實體(使用者、服務、資料、機器等)允許採取哪些行動、禁止哪些行動。政策確立之後,才談得上用什麼**安全機制(security mechanism)**去落實它。

重要的安全機制有四種:

  • 加密(encryption):安全的根基。把資料轉換成攻擊者無法理解的形式,實現機密性,也可支援完整性檢查(偵測資料是否被改動)。
  • 身分驗證(authentication):驗證使用者、客戶端、伺服器或主機等實體所宣稱的身分。最常見的是密碼,但方式很多。
  • 授權(authorization):驗證身分之後,檢查該客戶端是否被允許執行所請求的動作。例如醫療資料庫依存取者不同,可能只准讀取、修改特定欄位或增刪紀錄。
  • 稽核(auditing):追蹤哪個客戶端以什麼方式存取了什麼。稽核本身不提供保護,但稽核紀錄對分析安全事件、事後追查入侵者極為有用——也因此攻擊者總是極力避免留下痕跡,讓記錄存取本身提高了攻擊的風險。

範例:Globus 安全架構#

安全政策與機制的關係,用具體系統最容易說明。Globus 是支援大規模分散式計算的廣域系統,這類環境也稱為計算網格(computational grid):大量主機、檔案與資源同時投入一項計算,且資源分屬世界各地不同的行政網域(administrative domain)。使用者與資源既多又分散,安全至關重要。

Globus 的安全政策可簡化為八條敘述(Foster et al., 1998):

  1. 環境由多個行政網域組成。
  2. 區域操作(僅在單一網域內進行的操作)只受該網域的區域安全政策管轄。
  3. 全域操作(跨多個網域的操作)要求發起者在每個執行該操作的網域中都是已知的。
  4. 不同網域實體之間的操作需要相互驗證(mutual authentication)
  5. 全域驗證取代區域驗證。
  6. 資源的存取控制只受區域安全管轄。
  7. 使用者可以把權利**委派(delegate)**給行程。
  8. 同一網域中的一組行程可以共用憑證(credentials)。

這些政策背後的邏輯:

  • 各網域有自己的安全政策,不因加入 Globus 而改變,Globus 也不凌駕區域安全決策——因此 Globus 只處理跨網域的安全威脅(第 1、2 條)。
  • 發起者(使用者或代表使用者的行程)必須在每個相關網域中是已知的,例如全域名稱對映到各網域的區域名稱,對映方式由各網域自行決定(第 3 條)。
  • 相互驗證意味著:使用者用了另一網域的服務時,其身分必須被驗證;同時使用者也要能確認自己用的確實是想用的那個服務(第 4 條)。
  • 第 3、4 條合起來導出第 5 條:只要使用者的身分已通過全系統的驗證,且在某網域中是已知的,該網域就應視其為已驗證,不需再做額外驗證。
  • 驗證之後仍要檢查確切的存取權,而這類存取控制決策完全在資源所在的網域內做成(第 6 條)。
  • 委派是為了行動代理程式(mobile agent)這類長時間跨網域執行的工作:把使用者的部分權利委派給行程,代理程式被驗證並檢查權利後就能發起操作,不必回頭聯絡擁有者(第 7 條)。
  • 同網域中代表同一使用者的一組行程可共用一組憑證,不要求每個行程都攜帶自己獨有的憑證,這為驗證開啟了可擴充的解法(第 8 條)。
延伸:Globus 的代理機制與四個協定

政策指出 Globus 首要需要的是跨網域驗證機制,以及讓使用者在遠端網域被認識的機制。為此引入兩種代表:

  • 使用者代理(user proxy):獲授權在有限時間內代表使用者行事的行程。
  • 資源代理(resource proxy):在特定網域內執行的行程,負責把對資源的全域操作轉譯成符合該網域安全政策的區域操作。

Globus 安全架構由使用者、使用者代理、資源代理與一般行程等實體構成,並定義四個協定:

  1. 使用者如何建立使用者代理並委派權利(交付一組適當的憑證)。
  2. 使用者代理如何請求配置遠端網域的資源:相互驗證後,資源代理在遠端網域建立一個代表使用者的行程,其資源存取受該網域的區域存取控制決策約束。
  3. 遠端網域中建立的行程若要在其他網域發起更多計算,由該行程的使用者代理出面請求資源配置(本質上沿用第二個協定)。
  4. 使用者如何讓自己在某網域中被認識:假設使用者在該網域有帳號,協定規定使用者如何在該網域的區域對映表中登錄全域憑證與區域憑證的對映。

圖 9-1:Globus 的安全架構。

設計安全分散式系統的主要困難,通常不在安全機制本身,而在決定如何運用這些機制來落實安全政策

設計議題#

實作通用安全服務時有幾個重要的設計議題:控制焦點、安全機制的分層,以及簡單性(Gollmann, 2006)。

控制焦點(Focus of Control)#

保護一個(可能是分散式的)應用程式,基本上有三種取徑:

  • 直接保護資料:不管資料上可能執行哪些操作,首要關注資料完整性。典型如資料庫系統中的完整性約束(integrity constraint),每次修改資料時自動檢查。
  • 指定操作:精確規定當存取某資料或資源時,哪些操作可以被誰呼叫。這與存取控制機制密切相關,例如物件式系統中可以對每個方法、整個介面或整個物件指定允許呼叫的客戶端,形成不同粒度的存取控制。
  • 聚焦使用者:只讓特定的人存取應用程式,與他們想執行的操作無關。例如銀行資料庫只開放給高層與特別授權者;許多大學的某些資料與應用只限教職員使用。此時控制的重點是定義使用者的角色(role),驗證角色後決定准駁——這需要角色型存取控制(role-based access control)的支援,本章稍後再談。

圖 9-2:三種防範安全威脅的做法。(a) 防範無效的操作。(b) 防範未授權的呼叫。(c) 防範未授權的使用者。

安全機制的分層#

另一個議題是安全機制要放在系統的哪一層。把電腦網路的分層與分散式系統的分層(應用、中介軟體、作業系統服務、核心)合起來看,關鍵在於區分通用服務與通訊服務——而這個區分牽涉到**信任(trust)**的概念。

圖 9-3:把分散式系統在邏輯上組織成數個層次。

安全與信任不同:一個系統要嘛安全、要嘛不安全(可以帶機率量度),但客戶端是否認為它安全,是信任的問題(Bishop, 2003)。安全是技術性的,信任是情感性的。安全機制該放在哪一層,取決於客戶端對哪一層服務的安全有多少信任。

以一個多站點組織為例,各站點透過 SMDS(Switched Multi-megabit Data Service)這類廣域骨幹相連:

  • 若在每個 SMDS 路由器放置加密裝置,站點之間的封包自動加解密。Alice 從站點 A 傳訊息給 Bob(站點 B)時,她必須信任站間加密運作正常——包括信任兩地的系統管理員已妥善防止裝置被動手腳。
  • 若 Alice 不信任站間傳輸的安全,她可以改用傳輸層的安全服務,例如 SSL(Secure Sockets Layer),在 TCP 連線上安全地傳送訊息。這時她把信任放在 SSL 上。
  • 在分散式系統中,安全機制常放在中介軟體層。若 Alice 連 SSL 都不信任,她可以用區域的安全 RPC 服務——但同樣得信任這個 RPC 服務會兌現承諾(不洩漏資訊、正確驗證客戶端與伺服器)。

圖 9-4:透過廣域骨幹服務相連的數個站點。

中介軟體層的安全服務,只有在它所依賴的下層服務確實安全時才值得信任。例如安全 RPC 服務若部分建立在 SSL 之上,對 RPC 的信任就取決於對 SSL 的信任;不信任 SSL,就談不上信任這個 RPC 服務。

安全機制的分布#

服務之間的信任依賴關係,引出**可信計算基底(Trusted Computing Base, TCB)**的概念:TCB 是(分散式)系統中落實安全政策所需、因而必須被信任的所有安全機制之集合。

TCB 越小越好。若分散式系統是建立在既有網路作業系統上的中介軟體,其安全可能依賴底層各主機的區域作業系統——這些作業系統就都進了 TCB。

  • 例如分散式檔案系統的檔案伺服器,可能得依賴區域作業系統的保護機制:既要防止其他行程存取檔案,也要防止伺服器被惡意弄掛。
  • 若對區域作業系統缺乏信任,可以把其部分功能納入分散式系統自己實作。例如在微核心(microkernel)作業系統上,檔案系統可以整個換成為分散式系統量身打造、內建安全措施的版本。
  • 進一步的做法是依安全需求把服務分散到不同機器:把檔案伺服器隔離到裝有可信作業系統的機器上,客戶端與應用程式放在不受信任的機器上。這能把 TCB 縮減到少數機器與軟體元件,再保護這些機器不受外部攻擊,就能提高整體信任。

這種「不讓客戶端直接接觸關鍵服務」的思路,就是 RISSC(Reduced Interfaces for Secure System Components) 方法(Neumann, 1995):任何安全關鍵的伺服器都放在獨立機器上,透過低階的安全網路介面與終端使用者系統隔離,客戶端只能經由這些網路介面存取。

圖 9-5:RISSC 原則應用於安全分散式系統。

簡單性#

設計安全系統本來就難,因此若能用少數幾個容易理解、容易信任的簡單機制,就更好。但簡單機制不一定夠用:

  • 連結層加密足以防止站間訊息被攔截,但若 Alice 想確保只有 Bob 收得到訊息,就需要使用者層級的驗證服務——Alice 可能得懂密碼金鑰與憑證等機制才願意信任它,儘管許多安全服務已高度自動化並對使用者隱藏。
  • 有些應用本身就複雜,加上安全只會雪上加霜。例如數位付款系統,因為多方必須通訊才能完成付款,協定天生複雜。這時更要讓底層實作協定的機制保持簡單易懂——簡單性有助於終端使用者信任應用,更有助於設計者確信系統沒有安全漏洞。

密碼學#

分散式系統安全的根基是密碼技術。基本想法很簡單:傳送者 S 要把訊息 m 傳給接收者 R,先把它加密成無法理解的訊息 m’ 再送出,R 收到後解密回原始的 m。

  • 加解密使用由金鑰(key)參數化的密碼方法。原始訊息稱為明文(plaintext, P),加密後稱為密文(ciphertext, C)
  • 常用記法:C = E_K(P) 表示用金鑰 K 加密明文 P 得到密文 C;P = D_K(C) 表示用金鑰 K 解密密文 C 得到明文 P。

圖 9-6:通訊過程中的入侵者與竊聽者。

傳輸密文時要防範三種攻擊,加密對三者都有幫助:

  • 攔截:訊息被竊聽。只要加密得當,攔截者只會看到無法理解的資料。(不過,「有訊息在傳」這件事本身有時就足以讓攻擊者推出結論——例如世界危機期間,進入白宮的流量驟減而進入科羅拉多某座山的流量等量增加,光知道這點就很有價值。)
  • 竄改:改明文容易,改加密妥當的密文困難得多——攻擊者得先解密才能有意義地修改,還得重新正確加密,否則接收者會發現訊息被動過。
  • 插入:攻擊者把加密訊息注入通訊系統,企圖讓 R 以為訊息來自 S。加密同樣有助於防範。注意:能竄改訊息的攻擊者也就能插入訊息。

密碼系統依加密金鑰與解密金鑰是否相同分為兩類:

  • 對稱密碼系統(symmetric cryptosystem):加解密用同一把金鑰,也稱**秘密金鑰(secret-key)共享金鑰(shared-key)**系統。傳送者與接收者必須共享同一把金鑰,且這把金鑰必須保密。記法上以 K_A,B 表示 A 與 B 共享的金鑰。
  • 非對稱密碼系統(asymmetric cryptosystem):加密金鑰與解密金鑰不同,但構成唯一的一對,滿足 P = D_KD(E_KE(P))。其中一把保密(私鑰)、另一把公開(公鑰),因此也稱公鑰系統(public-key system)。以 K+_A 表示 A 的公鑰、K-_A 表示對應的私鑰。

圖 9-7:本章使用的記號。

哪一把金鑰公開,取決於用途:

  • 機密性:Alice 要傳機密訊息給 Bob,就用 Bob 的公鑰加密——只有持私鑰的 Bob 能解密。
  • 來源確認:Alice 用自己的私鑰加密訊息;Bob 若能用 Alice 的公鑰成功解密(且明文有足夠資訊可判讀),就知道訊息必然來自 Alice,因為解密金鑰與加密金鑰唯一配對。

最後一種密碼學應用是雜湊函數(hash function):H 接受任意長度的訊息 m,輸出固定長度的位元字串 h = H(m),有點像通訊系統中用於錯誤偵測的循環冗餘檢查(CRC)附加位元。密碼學上使用的雜湊函數必須具備三個性質:

  • 單向(one-way):已知輸出 h,計算上不可行找出對應的輸入 m;但由 m 算 h 很容易。
  • 弱抗碰撞(weak collision resistance):給定輸入 m 與其輸出 h = H(m),計算上不可行找到另一個 m' ≠ m 使 H(m') = H(m)
  • 強抗碰撞(strong collision resistance):只給定 H,計算上不可行找到任意兩個不同輸入 m 與 m’ 使 H(m) = H(m')

類似性質也適用於加密函數 E 與金鑰:給定明文 P 與密文 C = E_K(P),找出金鑰 K 應計算上不可行;給定 P 與 K,找到另一把 K’ 使 E_K(P) = E_K'(P) 也應實質上不可能。

密碼演算法的設計有悠久而迷人的歷史(Kahn, 1967),而打造安全系統往往出奇困難、甚至不可能(Schneier, 2000)。以下僅簡介三個代表性演算法,細節可參考 Ferguson and Schneier (2003)、Menezes et al. (1996) 與 Schneier (1996)。

對稱密碼系統:DES#

**DES(Data Encryption Standard)**是對稱密碼系統的代表,以 64 位元資料區塊為運算單位:

  • 一個區塊經過 16 輪轉換成 64 位元的加密輸出,每輪使用不同的 48 位元金鑰,這 16 把金鑰都從一把 56 位元主金鑰導出。
  • 輸入區塊在 16 輪之前先做初始置換(initial permutation),加密輸出再套用其反置換得到最終結果。
  • 每輪 i 取前一輪的 64 位元輸出,分成左半 L(i-1) 與右半 R(i-1) 各 32 位元;右半直接成為下一輪的左半,即 L(i) = R(i-1)
  • 重活由攪拌函數(mangler function)f 完成:它接受 32 位元的 R(i-1) 與 48 位元金鑰 K(i),先把 R(i-1) 擴充成 48 位元並與 K(i) 做 XOR(互斥或),結果切成 8 塊各 6 位元,各自送入不同的 S-box(把 64 種 6 位元輸入代換成 16 種 4 位元輸出之一),8 個 4 位元輸出合併成 32 位元再置換,最後與 L(i-1) 做 XOR 得到 R(i)

圖 9-8:(a) DES 的原理。(b) 單一輪加密的概要。

  • 每輪金鑰的產生:56 位元主金鑰先置換並分成兩個 28 位元半部;每輪各半部左旋 1 或 2 位元,再各取出 24 位元,合成該輪的 48 位元金鑰。

圖 9-9:DES 中每一輪金鑰產生的細節。

DES 原理簡單,用分析方法卻很難破解——但暴力搜尋金鑰已被多次證明是容易的。以加密-解密-加密模式、不同金鑰執行三次 DES 的 Triple DES 安全得多,至今仍常被使用(Barker, 2004)。

延伸:DES 的設計理由與後繼者

DES 難以用分析方法攻擊的原因之一,是其設計理由從未公開解釋。已知若換用其他 S-box,演算法會明顯更容易破解(Pfleeger, 2003)。S-box 的設計與使用理由,直到 1990 年代「新的」攻擊模型被提出後才公開——DES 對這些攻擊展現了相當的抗性,設計者並透露這些新模型其實在 1974 年開發 DES 時就已為他們所知(Coppersmith, 1994)。

DES 當了多年的標準加密技術,目前正被 Rijndael 演算法取代,其資料區塊為 128 位元,另有更大金鑰與更大區塊的變體。該演算法設計得夠快,甚至能在智慧卡(smart card)上實作——智慧卡正是密碼學日益重要的應用領域。

公鑰密碼系統:RSA#

RSA 以發明者 Rivest、Shamir 與 Adleman(1978)命名,是使用最廣的公鑰系統。其安全性來自:目前沒有已知方法能有效率地分解大數的質因數(例如 2100 = 2 × 2 × 3 × 5 × 5 × 7,質因數為 2、3、5、7)。RSA 的公私鑰由數百位十進位數字的超大質數建構,破解 RSA 等價於找出那兩個質數——數學家研究了幾世紀,至今仍是計算上不可行。

產生公私鑰的四個步驟:

  1. 選兩個很大的質數 p、q。
  2. 計算 n = p × q 以及 z = (p - 1) × (q - 1)
  3. 選一個與 z 互質的數 d。
  4. 計算 e,使得 e × d = 1 mod z

其中一個數(比方 d)之後用於解密,e 用於加密;只公開其中一個,端視用途而定。加解密流程(以 Alice 傳機密訊息給 Bob 為例):

  • RSA 把訊息 m 視為位元字串,先切成固定長度的區塊,每個區塊 m_i 解讀為二進位數,須落在 0 <= m_i < n
  • 加密:對每個區塊計算 c_i = m_i^e (mod n) 後送出。
  • 解密:接收端計算 m_i = c_i^d (mod n)。加密需要 e 與 n,解密需要 d 與 n。

RSA 的缺點是計算量大:加密速度比 DES 慢約 100–1000 倍(依實作而定)。因此許多密碼系統只用 RSA 來安全地交換共享金鑰,實際加密「一般」資料則交給對稱式演算法。後續章節會多次看到這種組合。

雜湊函數:MD5#

MD5(Rivest, 1992)是廣泛使用的雜湊函數,從任意長度的二進位輸入計算出 128 位元的固定長度訊息摘要(message digest)

  • 輸入先填補(pad)到總長 448 位元(模 512),再附上原始位元串長度的 64 位元整數——輸入於是變成一連串 512 位元區塊。
  • 演算法從一個 128 位元常數值出發,進行 k 個階段(k 為填補後訊息的 512 位元區塊數);每個階段以一個 512 位元資料區塊與前一階段算出的 128 位元摘要,計算出新的 128 位元摘要。

圖 9-10:MD5 的結構。

延伸:MD5 每個階段的內部運算

每個階段包含四輪計算,各輪分別使用下列四個函數之一,作用於 32 位元變數 x、y、z:

F(x,y,z) = (x AND y) OR ((NOT x) AND z)
G(x,y,z) = (x AND z) OR (y AND (NOT z))
H(x,y,z) = x XOR y XOR z
I(x,y,z) = y XOR (x OR (NOT z))

處理某階段的 512 位元區塊 b 時,b 被分成 16 個 32 位元子區塊 b0, b1, …, b15。第一輪用函數 F 在 16 次迭代中更新四個變數 p、q、r、s;這些變數帶入下一輪,階段結束後再傳給下一階段。演算法共有 64 個預定義常數 Ci;記號 x <<< n 表示左旋轉——x 的位元左移 n 個位置,移出左端的位元補到最右端。第二輪以同樣方式使用 G,第三、四輪分別使用 H 與 I,因此每個階段共 64 次迭代,之後帶著當時的 p、q、r、s 值進入下一階段。

圖 9-11:MD5 中一個階段內第一輪的 16 次迭代。