安全在協調式系統中是個棘手的問題,因為存在根本的張力:
- 一方面,我們主張行程應該參照解耦(互不指名、甚至匿名)。
- 另一方面,我們又得確保資料的完整性與機密性——而這通常透過安全(多播)通道實作,實質上要求發送者與接收者能相互驗證身分(authenticate)。
這種身分驗證違反了參照解耦。
解決之道有多種。一個常見做法是建立一個代理人(brokers)網路負責處理資料與訂閱:客戶端行程只接觸代理人,由代理人負責身分驗證與授權。這確實要求客戶端信任代理人;不過如後文所示,透過區分代理人的類型,客戶端不必信任系統中所有的代理人。
由於資料協調的本質,授權問題自然轉化為機密性問題。以下依循 Wang et al. (2002) 的討論細看這些議題。
機密性#
協調式系統與許多其他分散式系統的一個重要差異:為了效率,中介軟體需要檢視發佈資料的內容——做不到這點,中介軟體基本上只能把資料灌流(flood)給所有潛在訂閱者。這帶出資訊機密性(information confidentiality)問題:有時必須不允許中介軟體檢視發佈的資料。這個問題可以透過端對端加密繞過——路由基底只看得到來源與目的位址。
部分保密與逐欄位加密#
若發佈的資料項是結構化的(每項含多個欄位),可以部署部分保密(partial secrecy):
- 例如:不動產資料需要在同一事務所、不同分店的仲介之間傳遞,但不能洩露物件的確切地址。為了讓內容式路由仍可運作,可以只加密地址欄位,物件描述則以明文發佈。
- Khurana 與 Koleva (2006) 為此提議採用 Bertino 與 Ferrari (2002) 引入的**逐欄位加密(per-field encryption)**方案:同一分店的仲介共享解密地址欄位的祕密金鑰。
- 這當然又違反了參照解耦——稍後會討論可能的解法。
在加密資料上路由#
更麻煩的是任何欄位都不得以明文揭露給中介軟體的情況。剩下的唯一解法是讓內容式路由直接在加密資料上進行:路由器只看得到(可能逐欄位)加密的資料,訂閱必須編碼成能進行**部分比對(partial matching)**的形式——部分比對正是路由器決定資料項該走哪條外出連結的依據。
這個問題非常接近「在加密資料上查詢與搜尋」,幾乎是不可能達成的事。事實證明,要在維持高度保密的同時提供合理效能,是出了名的困難(Kantarcioglu 與 Clifton, 2005)。其中一個問題是:若使用逐欄位加密,反而更容易讓人推斷出資料的內容。
訂閱機密性與發佈機密性#
在加密資料上運作也帶出訂閱機密性(subscription confidentiality):訂閱本身可能也不得向中介軟體揭露。
- 對主題式(subject-based)定址方案,一個解法是同樣使用逐欄位加密,並嚴格逐欄位比對。
- 複合關鍵字可表示為其組成成分的加密集合,以支援部分比對:訂閱者送出這些成分的加密形式,讓路由器檢查集合成員資格(Raiciu 與 Rosenblum, 2005 亦有此建議)。
- 甚至範圍查詢也可能支援,前提是能設計出表示區間的高效方案;一個可能的解法見 Li et al. (2004a)。
最後還有發佈機密性(publication confidentiality):這觸及較傳統的存取控制——某些行程根本不該被允許看到某些訊息。此時發佈者可能想明確限制可能的訂閱者群體。這種控制多半可在發佈與訂閱應用程式的層級以帶外(out-of-band)方式行使,但由中介軟體提供這類存取控制服務也可能更方便。
解耦發佈者與訂閱者#
若必須同時對中介軟體保護資料與訂閱,Khurana 與 Koleva (2006) 提議引入一個特殊的記帳服務(accounting service, AS),位於客戶端(發佈者與訂閱者)與實際的發佈/訂閱中介軟體之間。基本構想是在解耦發佈者與訂閱者的同時,仍提供資訊機密性。其方案中,訂閱者登記對特定資料項的興趣,資料照常路由;資料項內含已加密的欄位,而當訊息要遞送給訂閱者時,路由器把它交給記帳服務,轉換成只有該訂閱者能解密的訊息。

圖 13-18:利用額外的受信任服務解耦發佈者與訂閱者。
流程要點:
- 發佈者註冊:發佈者向發佈/訂閱網路的任一節點(即某個代理人)註冊;代理人把註冊資訊轉給 AS,AS 產生一把供發佈者使用、由 AS 簽署的公鑰——對應的私鑰當然由 AS 自己保管。
- 訂閱者註冊:訂閱者提供一把加密金鑰,由代理人轉交。必須經過獨立的身分驗證階段,確保只有正當的訂閱者註冊——例如代理人一般不應被允許訂閱發佈的資料。
- 訊息轉換:資料項發佈時,其關鍵欄位已由發佈者加密。當資料項到達想轉交給訂閱者的代理人時,代理人請求 AS 轉換訊息:先解密,再用訂閱者提供的金鑰加密。
如此一來,代理人永遠無從得知應保密的內容,同時發佈者與訂閱者也不必共享金鑰資訊。
當然,記帳服務本身必須能擴展。可行措施不少,一個合理做法是仿照 Kerberos 引入領域(realms):傳輸中的訊息可能需要以外部記帳服務的公鑰重新加密來轉換。細節見 Khurana 與 Koleva (2006)。
安全的共享資料空間#
讓共享資料空間安全化的研究非常少。常見做法是單純加密資料項的欄位,只有在解密成功且內容與訂閱相符時才進行比對(Vitek et al., 2003)。
這種做法的主要問題之一:金鑰可能需要在發佈者與訂閱者之間共享,或者發佈者的解密金鑰必須讓被授權的訂閱者知道。
當然,若共享資料空間本身受信任(實作資料空間的行程被允許看到元組內容),事情就簡單得多。考慮到多數實作只使用單一伺服器,在該伺服器上加上身分驗證與授權機制就是實務上常走的路。