遠端處理中的安全性
一般而言,使用 .NET Framework 遠端處理的應用程式所具有的安全性問題會比本機應用程式複雜。
保護分散式應用程式造成的問題,很難不透過使效能減退的措施來克服。如果通訊的某一端正在接聽叫用,則任何知道接聽端點的未授權用戶端都可嘗試傳遞序列化資訊,以在另一個端點還原序列化並叫用該資訊。互相驗證並加密內容,是確保通訊僅發生在信任元件間的唯一合理方式。因此,您應先評估遠端處理應用程式的安全性需求,然後再評估效能需求。您應依據應用程式所需的資料完整性程度,公開不需驗證和加密的資料與端點。
遠端處理委派會說明這個問題。因為委派可包裝靜態方法的型別資訊 (此動作不會從遠端執行),所以伺服器應用程式在宣告具有自訂參數的自訂委派型別時,參數和委派型別的組合絕不能符合可在伺服器電腦上呼叫的靜態方法。您絕不應允許用戶端在您的應用程式中定義或傳遞任何可讓伺服器還原序列化的型別。
設計使用 .NET Framework 遠端處理基礎結構之分散式應用程式的非常重要部分,就是要確定知道所要的安全性層級,以及要套用該安全性層級的位置。本節描述可依據特定設計決策採取的各種安全性措施。雖然此處並未列出所有案例,但這些主題都是進行決策時很好的起點。
程式碼存取安全性
程式碼存取安全性會依據電腦系統管理員所設定的安全性原則,來控制可執行程式碼對資源和作業的存取。不過,因為程式碼存取安全性並不會透過遠端連接查核堆疊的行程,所以遠端處理應用程式的程式開發人員應清楚瞭解遠端處理基礎結構需要有完全信任,才可在用戶端或伺服器上執行。任何遠端處理應用程式的未授權使用都會提供對 FullTrust 權限的未授權存取。
警告
您絕不應嘗試為 AppDomain 物件建立可遠端處理的包裝函式。如果這樣做,則您可能會遠端發行該 AppDomain 的參考,這樣會遠端公開 AppDomain.CreateInstance 方法 (或其他方法),並破壞該 AppDomain 的任何程式碼存取安全性。連接至遠端處理 AppDomain 的未授權用戶端可取得對 AppDomain 本身可存取之任何資源的存取。事實上,如果型別會擴充 MarshalByRefObject,或是會實作未授權使用者可用來通過安全性系統的方法,就不應該為該型別建立可遠端處理包裝函式。
![]() |
---|
此外,數個系統型別除了會擴充 MarshalByRefObject,還會在執行階段執行安全性檢查,以防止應用程式定義域外部的任何項目遠端叫用該 MarshalByRefObject 型別的物件。AppDomain 和 System.Windows.Forms.Form 是這類系統型別的兩個範例。您會很容易想到擴充 MarshalByRefObject 並遠端取得參考,但對這些特殊型別而言,卻不是這種情況。您可能會想要使用另一個可遠端處理型別包裝同處理序參考,但這樣做會意外危害程式碼存取安全性,因此永遠都不應該這樣做。 |
遠端處理應用程式中的安全性考量
一般而言,您的分散式應用程式中可能會有兩個安全性問題 (視您的特定案例而定) 需要解決。可能會想要保護通訊通道和訊息本身,或是可能會想要保護應用程式以免它被誤用。您也可能想要以某種程度同時解決這兩個問題。
一般而言,若要保護通訊通道,則必須加密通道本身,或 (及) 加密資料流一端的訊息內容並在另一端解密它。訊息內容可能需要完整性檢查,以協助判斷是否已有任何人竄改過它。也可能需要確認用戶端或 (及) 伺服器的識別。
首先,您應一律驗證用戶端,以確認它們有權使用該資源。其次,您應加密所有交談,以在傳輸期間保護資料。HttpChannel 和 TcpChannel 都完全支援這兩個步驟 (因為 IPC 通道只會在相同機器上運作,所以它不支援加密,但支援 Windows 驗證)。
部分案例是上述兩項規則的例外狀況。如果效能需求非常高,而資料價值非常低,使得資料是否遭到未授權的讀取或操作變得不再那麼重要,則可以省去加密。在加密網路 (例如受 IPsec 保護的網路) 上進行通訊時,也可停用加密。
記錄使用者的行為,事後再重新建構使用模式,也可協助保護應用程式免於未授權的使用。
警告
.NET Framework 遠端處理預設不會進行驗證或加密。因此,建議在與用戶端或伺服器進行遠端互動之前,先採取所有必要步驟以確定這些用戶端或伺服器的識別。因為 .NET Framework 遠端處理應用程式需要 FullTrust 權限才能執行,所以如果將伺服器的存取權授與未授權用戶端,則該用戶端可如受到完全信任般地執行程式碼。請一律驗證您的端點並加密通訊資料流。可在網際網路資訊服務 (IIS) 中遠端處理的型別,或建置自訂通道接收組,以完成這項作業。在 .NET Framework 2.0 版中,您不再需要建置自訂接收以保護通訊。驗證和加密功能 (透過將 TCP 通道設定為 secure = true 啟用) 可保護通訊。TCP 通道現在可讓您驗證連接使用者、加密 Wire 上的資料,並判斷連接使用者的識別和 IP 位址。
請參閱
參考
RemotingConfiguration
ChannelServices
內容
MethodCall
RemotingServices