一般而言,使用 .NET 遠端處理的應用程式會具有比本機應用程式更複雜的安全性問題。
保護分散式應用程式時,很難克服的問題就是:找不到一種不會影響效能的解決方式。如果通訊的一端正在聆聽引動過程,則知道這個聆聽結束點的未授權用戶端,都可以嘗試傳送一些序列化資訊,希望可以透過某種方式在另一端還原序列化及叫用這些資訊。只有藉由互相驗證然後加密內容,您才可以確定通訊是在有高度信任的元件之間發生。因此,您在評估遠端處理應用程式的設計時,首先應考慮您的安全性需求,然後再考慮效能需求。未採用這類安全性預防措施就公開 (Expose) 資料和結束點的程度,就是您要求應用程式資料完整性和您對資料投資的程度。
遠端處理委派可說明這個問題。因為委派可以包裝靜態方法的型別資訊 (這無法在遠端執行),所以您伺服器的應用程式應永遠宣告採用自訂參數的自訂委派型別,而自訂參數永遠不會符合伺服器電腦上可呼叫的靜態方法。請絕對不要允許用戶端定義您伺服器有意或無意還原序列化的任何型別,並將它傳送至您的應用程式。
設計使用 .NET 遠端基礎結構的安全、分散式應用程式的重點,是要確定您知道所需的安全性等級,以及何處需要這樣的等級。這個章節描述根據某些設計決策所採取的不同安全措施。此處並未提供所有案例,但這些主題是協助您作決策的絕佳起點。
程式碼存取安全性
程式碼存取安全性是根據電腦管理員所設定的安全性原則,控制可執行程式碼可存取的資源和作業。但是,因為程式碼存取安全性並未完全應用到遠端連接,遠端應用程式的開發人員應該很清楚的了解,遠端處理基礎結構需要全部信任才能在用戶端或伺服器上執行。
**警告 **您絕不應嘗試建立 AppDomain 物件的可遠端處理之包裝函式 (Wrapper Function)。如果這麼做,則可能可以從遠端發行 AppDomain 的參考,但也會從遠端公開 AppDomain.CreateInstance 方法 (或其他的方法),進而有效地破壞 AppDomain 的程式碼存取安全性。連接至遠端 AppDomain 的未授權用戶端可能因此而取得 AppDomain 本身可存取資源的存取權限。事實上,對於任何型別 - 只要它會擴充 MarshalByRefObject 並實作方法讓未授權的用戶端用來以任何方式略過安全性系統 - 您都不應該這麼做。
更常見的是,一些系統型別會擴充 MarshalByRefObject,但也在 Run Time 時執行安全性檢查,以避免應用程式定義域之外的任何程式從遠端實際上叫用該型別的物件。AppDomain 和 System.Windows.Forms.Form 是上述狀況的兩個範例。您很可能會認為您可以擴充 MarshalByRefObject 並從遠端取得參考,但這些特殊的型別卻不是這樣運作的。以另一個可遠端處理的型別來包裝同處理序 (In-Process) 的參考可能是吸引人的做法,但這樣做卻會在無意中妨礙了程式碼存取安全性,所以請絕不要如此處理。
遠端處理應用程式中的安全性考量
一般來說,根據您的特殊案例,通常需要在分散式應用程式中提供兩方面的安全性。您可設定通訊通道和訊息本身的安全性,或是保護應用程式免於不當的使用,或兩者兼具一些。
通常,設定通訊通道的安全性,意味著在資料流的一端加密訊息內容且在另一端解密、加密通道本身或兩者兼具。訊息內容可能需要完整性檢查,確定內容未遭他人修改。用戶端或伺服器的識別 (或兩者) 也需要確認。
您可以設定應用程式的安全性以利於防止未授權的使用,方法是首先確定使用者具有使用應用程式的使用權限,或記錄使用者的行為以便未來重建使用模式。
設計遠端處理中的安全性
設計安全、易於建置的應用程式時,您需要回答兩個重要的問題:
- 存在什麼樣的通道?
- 伺服器的使用者驗證和授權模型是什麼?
如果您能選擇使用 HttpChannel 物件或 TcpChannel 物件之中的一個,建議您使用 HttpChannel,並在 Internet Information Services (IIS) 中裝載您的遠端物件,而不考慮使用者驗證和授權模型。IIS 裝載為使用 Secure Sockets Layer (SSL) 的 Wire 層級防護和使用整合式 Windows 驗證 (之前的 NTLM 驗證) 或 Kerberos 的驗證提供支援。
做為傳輸控制通訊協定 (Transmission Control Protocol,TCP) 實作的 TcpChannel,在預設情況下,並不支援 HTTP 標準所支援的某些功能強大的驗證標準。在具有連線等級保護的環境下 (例如 IPSec),可使用高速 TcpChannel,但若在 Internet 或未加密的 Intranet 上則不建議使用。
**注意 **.NET 遠端處理依預設不會執行驗證或加密。因此,建議您最好採取所有必要步驟,在與用戶端或伺服器遠端互動前,先確定其識別。由於 .NET 遠端處理應用程式需要 FullTrust 使用權限才能執行,因此如果讓未授權用戶端存取您的伺服器,該用戶端便可以執行程式碼,如同它完全受信任一般。永遠驗證您的結束點並加密通訊資料流,方法是在 IIS 中裝載遠端型別,或是建置自訂通道接收組來完成這個工作。
伺服器的使用者驗證和授權模型可能會有很大的差異,但將您的遠端物件裝載至 IIS 中可支援最複雜的方案。只需要撰寫些許的程式碼,伺服器預設的支援功能就可包括探索用戶端的 WindowsPrincipal 物件或 GenericPrincipal 物件。這在需要模擬用戶端代表使用者執行某些函式時,相當方便。如需詳細資訊,請參閱模擬和還原。
GenericPrincipal 物件代表任何與 Windows 網域無關的使用者授權配置。因此,這些物件可以擴充為與使用者資料庫共同並與其他平台交互操作。
請參閱
.NET 遠端處理概觀 | HttpChannel Web 安全性 | Managed 應用程式中的角色架構安全性 | 程式碼存取安全性 | RemotingConfiguration | ChannelServices | Context | MethodCall | RemotingServices