原文引自:
http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/4OffAppBlocConfSecuCons.mspx
Offline Application Block 配置和安全注意事項
發布日期: 8/19/2004 | 更新日期: 8/19/2004
Microsoft Corporation
內容:第 4 章提供了成功部署的步驟和重要的安全威脅以及需要考慮的對策。
本頁內容
在開發和測試基于 Offline Application Block 的應用程序后,就可以在產品環境中部署該應用程序了。本章討論如何通過為各種提供程序配置應用程序來部署應用程序。本章還討論了在產品環境中部署應用程序時需要考慮的安全威脅和對策。
部署要求
在部署使用 Offline Application Block 的應用程序之前,請確保目標計算機安裝了下列軟件組件:
? |
Microsoft_ Windows_ XP Professional 操作系統 |
? |
Microsoft .NET Framework 1.1 版 |
此外,如果您要使用 Offline Application Block 隨附的提供程序,則必須安裝下列軟件:
? |
用于隊列存儲提供程序的 Microsoft 消息隊列 (MSMQ) |
? |
用于隊列/緩存存儲提供程序的 Microsoft SQL Server? 桌面引擎 (MSDE) |
配置
提供程序是在您在 Microsoft Visual Studio_ .NET 部署系統項目中創建的 App.config 文件中定義的。在該文件中,每個類型的提供程序都對應于一個區段。
? |
ConnectionManagerProviders – 此區段包含用于檢測應用程序物理連接狀態的策略的配置信息。該應用程序塊隨附的連接檢測提供程序使用 Windows 網絡 API (WinInet) 來檢測網絡連接是否存在。 |
? |
QueueManagerProviders – 此區段包含用于存儲消息的提供程序(包括 MSMQQueueStorageProvider、MSDEQueueStorageProvider、IsolatedStorageQueueStorageProvider 和 InMemoryQueueStorageProvider)的配置信息。 |
? |
CryptographicSettings – 此區段包含用于加密提供程序設置的配置信息。 |
? |
CacheManagerSettings – 此區段包含用于 Caching Application Block 的配置信息。有關 Caching Application Block 的詳細信息,請參閱 Caching Application Block 文檔。Offline Application Block 將獨立存儲緩存提供程序作為用于緩存的附加提供程序。 |
“ConnectionManagerProviders”和“QueueManagerProviders”區段都具有一個名為 <providers> 的元素,它包含“連接管理”和“消息數據管理”子系統的策略。每個策略或提供程序都在 <providers> 區段下有一個相應的子元素。表 4.1 中列出了每個提供程序所具有的公共特性集。
表 4.1 提供程序的公共特性
name |
提供程序的好記的名稱。 |
是 |
無 |
type |
與提供程序相對應的類的完全限定類型名稱。 |
是 |
無 |
enabled |
指定啟用配置文件中的哪個提供程序。您只能將這些提供程序的其中一個設置為 true,以便脫機功能正常工作。 |
否 |
False |
每個提供程序所需的自定義屬性被表示為子元素。
ConnectionManagerProviders
以下配置文件摘錄顯示了 ConnectionManagersProviders 區段是如何在 App.config 中定義的:
...
<configuration>
<configSections>
<section name="ConnectionManagerProviders" type="Microsoft.ApplicationBlocks.SmartClient.Offline.MultiProviderConfigHandler,Microsoft.ApplicationBlocks.SmartClient.Offline,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />
</configSections>
</configuration>
...
以下配置文件摘錄顯示了 ConnectionManagerProviders 區段的詳細內容:
...
<ConnectionManagerProviders>
<provider name="connectionDetectionStrategy" enabled="true"
type=
"Microsoft.ApplicationBlocks.SmartClient.Offline.WinINetDetectionStrategy, Microsoft.ApplicationBlocks.SmartClient.Offline.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<pollingInterval>2</pollingInterval>
</provider>
</ConnectionManagerProviders>
...
表 4.2 按照 ConnectionManagerProviders 特性在配置文件中的顯示順序說明它們的設置。
表4.2:ConnectionManagerProviders 特性的默認設置
name |
指定提供程序的名稱。 |
無 |
enabled |
指定啟用配置文件中的哪個提供程序。可接受的值為 true 或 false。您只能將這些提供程序的其中一個設置為 true,以便脫機功能正常工作。 |
false |
type |
指定提供程序的完全限定名。 |
無 |
pollingInterval |
指定“連接管理器”檢測連接狀態的頻率。必須設置此特性。建議設置為 2 秒鐘。 |
無 |
Offline Application Block 提供了 ConnectionDetectionStratergy,后者使用 Windows API WinINetDetectionStrategy 類來檢測與網絡的連接性。
QueueManagerProviders
下列提供程序可用于隊列存儲:
? |
InMemoryQueueStorageProvider – 該提供程序將隊列數據存儲在內存數據結構中。因為當應用程序關閉時存儲的數據會丟失,所以該提供程序不適于存儲持久性數據。 |
? |
MSDEQueueStorageProvider – 該提供程序將隊列數據存儲在“桌面引擎”中。自定義屬性 ConnectionString 定義了用于連接到 MSDE 數據庫的連接字符串。 |
? |
MSMQQueueStorageProvider – 該提供程序將隊列數據存儲在“消息隊列”中。該提供程序允許在配置文件中指定消息隊列的名稱,并且它將嘗試打開具有該名稱的隊列。如果它無法打開該隊列,就會嘗試以給定的名稱創建一個專用隊列。在部署基于該塊的應用程序的過程中,您應通過管理手段(使用 Microsoft 管理控制臺 [MMC] 單元)手動創建消息隊列,以便其安全權限能夠正確配置。請注意,該塊假設所使用的消息隊列是專用隊列。自定義屬性 queueName 定義該隊列的名稱。 |
? |
IsolatedStorageQueueStorageProvider – 該提供程序存儲一個用戶的隊列數據,并防止其他用戶對該數據進行訪問。 |
以下配置文件摘錄顯示了 QueueManagerProviders 區段是如何在 App.config 文件中定義的:
...
<configuration>
<configSections>
<section name="QueueManagerProviders" type="Microsoft.ApplicationBlocks.SmartClient.Offline.MultiProviderConfigHandler,Microsoft.ApplicationBlocks.SmartClient.Offline,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />
</configSections>
</configuration>
以下配置文件摘錄顯示了 QueueManagerProviders 區段的詳細內容:
...
<QueueManagerProviders>
<provider name="queueManagerStorageProvider"
enabled="false" type="Microsoft.ApplicationBlocks.SmartClient.Offline.IsolatedStorageQueueStorageProvider,Microsoft.ApplicationBlocks.SmartClient.Offline.Providers,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"
encrypted="false"
signed="false"
cryptoProvider="default" />
<provider name="queueManagerStorageProvider"
enabled="true" type="Microsoft.ApplicationBlocks.SmartClient.Offline.InMemoryQueueStorageProvider,Microsoft.ApplicationBlocks.SmartClient.Offline.Providers,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"
encrypted="false"
signed="false"
cryptoProvider="default"/>
<provider name="queueManagerStorageProvider"
enabled="false" type="Microsoft.ApplicationBlocks.SmartClient.Offline.MSMQQueueStorageProvider,Microsoft.ApplicationBlocks.SmartClient.Offline.Providers,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"
encrypted="false"
signed="false"
cryptoProvider="default">
<queueName>InsuranceClaimsClientQueue</queueName>
</provider>
<provider name="queueManagerStorageProvider"
enabled="false"
type="Microsoft.ApplicationBlocks.SmartClient.Offline.MSDEQueueStorageProvider,Microsoft.ApplicationBlocks.SmartClient.Offline.Providers,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"
encrypted="false"
signed="false"
cryptoProvider="default">
<applicationName>Insurance Claims Client</applicationName>
<connectionString>Initial Catalog=QueueDatabase;Data Source=[MsdeServerName]\[MsdeInstanceName];Integrated security=true</connectionString>
</provider>
</QueueManagerProviders>
...
表 4.3 按照 QueueManagerProviders 特性在配置文件中的顯示順序說明它們的設置。
表 4.3:QueueManagerProviders 特性的默認設置
Name |
指定提供程序的名稱。 |
無 |
enabled |
指定啟用配置文件中的哪個提供程序。可接受的值為 true 或 false。您只能將這些提供程序的其中一個設置為 true,以便脫機功能正常工作。 |
false |
type |
指定提供程序的完全限定名。 |
無 |
encrypted |
指定是否在寫入數據前對其進行加密,以及是否在讀取數據前對其進行解密。 |
false |
signed |
指定是否在寫入數據前對其進行簽名,以及是否在讀取數據前對其進行驗證。 |
無 |
cryptoProvider |
設置提供程序的名稱。在此例中,加密提供程序設置為 default。 |
默認提供程序 |
cryptoProvider 特性將在下面的“加密設置”部分中進行更全面地討論。
CryptographicSettings
配置文件中隊列存儲提供程序的每個提供程序節點都具有一個與之關聯的 cryptoProvider 特性,該特性指定要使用的 cryptoProvider。配置文件中還有另一個名為 crytpographicSettings 的區段,其中可以定義許多不同的加密提供程序,實現不同的加密算法和公鑰。每個加密提供程序都由一個名稱標識,并且每個 QueueStorageProviders 元素中的 cryptoProvider 特性標識要用于該 QueueStorageProvider 的加密提供程序。
要點 經常更改密鑰以防止惡意訪問、或未經授權的用戶獲得對該密鑰的訪問權以及通向您網絡的非法入口是非常重要的。
生成自己的對稱密鑰
1. |
在 Visual Studio .NET 2003 中打開 ValidationKeyGeneration.sln。該密鑰包含在脫機解決方案和快速入門中,它位于 <安裝位置>\Offline\QuickStarts\Utility\ValidationKeyGeneration。此外,您還可以按以下方式訪問“Validation Key Generation”:依次單擊 Start、All Programs、Microsoft Application Blocks for .NET、Offline,然后單擊 Validation Key Generation。 |
2. |
構建解決方案。 |
3. |
運行 ValidationKeyGeneration.exe。 |
4. |
單擊 Generate 按鈕。一個新密鑰將出現在文本框中。 |
5. |
從文本框中復制該密鑰,并將其用于配置文件中。 |
有關加密的詳細信息,請參閱下列文章:
使用具有加密功能的隊列提供程序來協助確保數據的安全
使用隊列提供程序有助于您更安全地存儲數據。以下配置文件摘錄顯示了 CryptographicSettings 區段是如何在 App.config 文件中定義的:
...
<configuration>
<configSections>
<section name="crytpographicSettings" type="Microsoft.ApplicationBlocks.Common.Crypto.CryptographicConfigurationHandler, Microsoft.ApplicationBlocks.Common,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />...
</configSections>
</configuration>
以下配置文件摘錄顯示了 QueueManagerProviders 區段的詳細內容:
...
<crytpographicSettings>
<cryptographicInfo name="default"
type="Microsoft.ApplicationBlocks.Common.Crypto.DPAPIProvider, Microsoft.ApplicationBlocks.Common, Version=1.0.0.0 Culture=neutral, PublicKeyToken=null"
validationKey= "Create a new validation key using the validation key generation utility and place here"
validation="SHA1"/>
</crytpographicSettings>...
有關配置文件及其設置的詳細信息,請參閱 MSDN (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/cmab.asp) 上的“Configuration Management Application Block”。
注 要獲得完整的配置設置,請參閱保險理賠快速入門的 App.config 文件。
CacheManagerSettings
Offline Application Block 使用四個緩存提供程序:IsolatedStorageCacheStorage(由 Offline Application Block 提供)、SingletonCacheStorage、SQLServerCacheStorage(由 MSDE 提供)和 MmfCacheStorage。
在 <CacheManagerSettings> 區段下的 <StorageInfo> 元素中,您必須指定獨立存儲提供程序的以下兩個特性:
? |
AssemblyName – 程序集的名稱,其中提供程序類的位置是:Microsoft.ApplicationBlocks.Offline.Providers。 |
? |
ClassName – 類名,它對應的提供程序是:Microsoft.ApplicationBlocks.Offline.Providers.IsolatedStorageCache。 |
以下配置文件摘錄顯示了 CacheManagerSettings 區段是如何在 App.config 文件中定義的:
...
<configuration>
<configSections>
<section name="CacheManagerSettings" type="Microsoft.ApplicationBlocks.Cache.CacheConfigurationHandler,
Microsoft.ApplicationBlocks.Cache,Version=1.0.0.0,Culture=neutral,
PublicKeyToken=
null" />...
</configSections>
</configuration>
以下配置文件摘錄顯示了 CacheManagerSettings 區段的詳細內容:
...
<CacheManagerSettings>
<DataProtectionInfo AssemblyName="Microsoft.ApplicationBlocks.Cache, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ClassName="Microsoft.ApplicationBlocks.Cache.DataProtection.DefaultDataProtection"
ValidationKey="Create a new validation key using the validation key generation utility and place here"
Validation="SHA1" />
<StorageInfo AssemblyName="Microsoft.ApplicationBlocks.SmartClient.Offline.Providers,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ClassName="Microsoft.ApplicationBlocks.SmartClient.Offline.IsolatedStorageCacheStorage" Mode="InProc" Validated="false" Encrypted="false" /> <ScavengingInfo AssemblyName="Microsoft.ApplicationBlocks.Cache, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ClassName="Microsoft.ApplicationBlocks.Cache.Scavenging.LruScavenging"
MemoryPollingPeriod="60" UtilizationForScavenging="80"
MaximumSize="100" />
</CacheManagerSettings>
...
有關 SingletonCacheStorage、SQLServerCacheStorage (MSDE) 和 MmfCacheStorage 的詳細信息,請參閱 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/CachingBlock.asp 上的 Caching Application Block 文檔。
異常管理
Offline Application Block 中的異常是使用 Exception Management Application Block (EMAB) 來記錄的。事件記錄在 Windows 事件日志中,它是 EMAB 記錄所有日志事件的默認位置。如果要將事件記錄到其他存儲區(例如 SQL Server、消息隊列或 Windows 管理規范 (WMI)),您可以使用 Logging Application Block,它提供了更可靠、更具可擴展性的模式進行記錄。有關詳細信息,請參閱 MSDN (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/Logging.asp?frame=true) 上的 Logging Application Block。
安全注意事項
Offline Application Block 有許多項目需要進行保護,以防止未經授權的訪問或惡意攻擊。這些資產包括:
? |
緩存的數據 |
? |
排入隊列的數據 |
? |
用于訪問緩存和隊列的憑據 |
? |
用戶憑據 |
? |
通過網絡傳輸的用戶數據 |
? |
部署的程序集 |
此外,運行智能客戶端應用程序的系統及其使用的所有 Web 服務也很容易受到攻擊。三種最常見的攻擊類型是欺騙、引誘和重播。
欺騙攻擊
欺騙攻擊有幾種形式。通常,攻擊者會創建一個虛假狀況來欺騙目標泄露敏感信息。欺騙攻擊的一個示例是 IP 欺騙。當網絡外的攻擊者通過使用位于網絡 IP 地址范圍內的 IP 地址,或者受信任的外部 IP 地址(可以訪問網絡上的特定資源)來偽裝成受信任用戶時,就會發生這種攻擊。此外,如果攻擊者可以訪問 IP 安全 (IPSec) 的安全參數,就可以偽裝成經授權可以連接到公司網絡的遠程用戶。欺騙攻擊的其他示例包括:傳輸控制協議 (TCP) 欺騙 — 通過偽造的地址發送 Internet 數據包;域名服務器 (DNS) 欺騙 — 攻擊者偽造有關哪些計算機名與哪些網絡地址相對應的信息。
引誘攻擊
引誘攻擊是非法的權限提升。此類攻擊可欺騙受信任的代碼對攻擊代碼進行調用,之后此攻擊代碼將獲得合法代碼的權限。例如,您可能會通過電子郵件接收一個不信任的程序。由于您懷疑該程序的來源,您在計算機中添加了一個新的本地帳戶,它具有普通、受限的用戶權限而不是您自己的高級別權限。然后,使用二級登錄服務在受限帳戶下運行該程序。執行代碼沒有任何問題,因此您就認為它是合法的。
第二天,您收到很多電子郵件,抱怨您向他們發送了垃圾郵件。還有幾個新文件添加到了 System32 目錄中。這就是引誘攻擊的結果,它是由您認為安全的程序導致的。當該程序啟動時,它會檢查是否運行在特權安全上下文中。如果發現它未處于特權安全上下文中,就認為實際用戶是以更多權限進行登錄的。通過調用 User32.dll 中的一些函數,它可模擬一個實際用戶,欺騙 Windows 資源管理器啟動新的程序副本。當新程序啟動后,它就繼承了 Windows 資源管理器標記的副本。由于用戶是以較高權限登錄的,因此該程序會繼承這些權限,并可能危及文件、電子郵件以及操作系統的安全。
重播攻擊
重播攻擊是通過記錄和重播先前發送的有效消息(或部分消息)來欺騙身份驗證系統。可以記錄任何固定的身份驗證信息(例如密碼),并在以后用于偽造受信任的消息。
威脅和對策
下表列出了針對 Offline Application Block 項目、運行智能客戶端應用程序的系統,以及使用 Offline Application Block 的應用程序所使用的 Web 服務的可能安全威脅和相關的對策。有關威脅和對策的詳細信息,請參閱 MSDN (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/ThreatCounter.asp) 上的 Improving Web Application Security: Threats and Countermeasures。
表 4.4:安全威脅和對策
攻擊者獲得對緩存的訪問權。 |
緩存中的用戶數據 |
危及敏感用戶數據的安全。 |
攻擊者直接繞過脫機塊的基礎結構,對緩存數據進行訪問。 |
加密數據并保護訪問該緩存所需的憑據。 |
攻擊者獲得對隊列的訪問權,并將消息填充在其中。 |
隊列 |
消息中可能會包含能夠中斷甚至終止服務的惡意數據。 |
攻擊者繞過脫機塊的基礎結構,直接填充隊列。 |
確保通過適當的憑據對隊列的訪問權進行限制,同時也保護該憑據,最好使用數據保護應用程序接口 (DPAPI)。 |
攻擊者獲得對用于訪問隊列和緩存的憑據的訪問權。 |
隊列和緩存的憑據 |
可能會危及憑據的安全。 |
如果存儲在配置中的數據未加密,則可用于特權用戶。 |
使用 DPAPI 或等效 API 來存儲敏感信息。 |
攻擊者獲得對用戶憑據的訪問權。 |
存儲在客戶端應用程序中的用戶憑據 |
當應用程序遇到錯誤并將錯誤記錄到日志中,或者當計算機受到攻擊時,可能會危及用戶憑據的安全。 |
計算機受到攻擊后,用戶憑據會作為錯誤報告的一部分存儲在日志中,而特權用戶可以對該日志進行訪問。 |
使用 .NET framework 中的 CredentialCache 類來存儲憑據,即使在內存中也是如此。 |
攻擊者欺騙業務功能服務。 |
用戶和應用程序數據 |
可能會危及發送到應用程序的用戶和應用程序數據的安全。 |
網絡探測 |
驗證為服務生成的代理具有有效終結點。 |
攻擊者在數據傳輸到 Web 服務的過程中獲得對數據的訪問權。 |
數據 |
可能會危及數據的安全。 |
網絡探測 |
使用安全傳輸(例如 SSL 或 IPSec),并在通過網絡發送數據前對其進行加密。 |
攻擊者欺騙下載程序集或部署惡意程序集。 |
系統 |
可能會危及運行該應用程序的系統的安全。 |
可能的攻擊包括欺騙程序集和部署服務器中的惡意程序集。 |
要防止欺騙程序集,請使用受信任的第三方證書服務,如 VeriSign。要防止部署服務器上的惡意程序集,請加密并數字簽名存儲在那里的程序集,并在客戶端下載時驗證程序集。 |
攻擊者在客戶端上部署惡意程序集。 |
系統和用戶數據 |
可能會危及用戶數據和運行該應用程序的系統的安全。 |
在客戶端上部署惡意程序集。 |
公開地應用到組成應用程序的所有程序集,并使用 SecurityAction.FullDemand,這樣調用堆棧中的所有程序集都將驗證公鑰 StrongNameIdentityPermission(SecurityAction.FullDemand, PublicKey="")。 |
攻擊者訪問非托管資源 |
系統 |
可能會危及運行該應用程序的系統的安全 |
如果使用非托管資源的代碼具有所需的權限,則可能會受到引誘攻擊。 |
要求 SecurityPermission 訪問與非托管資源進行交互的類中的非托管資源。 |
攻擊者使用反射來創建類實例。 |
系統和用戶數據 |
特權代碼可能會被惡意程序集運行,從而危及系統和用戶數據的安全。 |
引誘攻擊 |
要求在使用反射的所有代碼上使用 ReflectionPermission。 |
攻擊者使用重播攻擊。 |
提供業務功能的服務 |
可能會危及業務功能的安全。 |
在傳輸數據的過程中對其進行探測。 |
使用安全傳輸(例如 SSL 或 IPSec),并對消息使用加密和數字簽名。 |
攻擊者獲得對事件日志的訪問權。 |
系統和用戶數據 |
可能的風險包括:攻擊者可能使用惡意日志消息終止系統;大量錯誤消息可能會屏蔽審核跟蹤,因為日志太大而無法進行分析;根據日志的配置,可能會覆蓋有效數據。 |
使用錯誤記錄的基礎結構,攻擊者可以將大量消息記錄到日志中。 |
可能的對策包括:在訪問日志以執行讀取或寫入操作時要求正確的權限;對于 Windows 事件日志,請僅使用 EventLogPermission 來寫入日志,除非組件同時支持讀取和寫入;不提供更新或刪除日志的權限;將日志配置為在滿載時發出錯誤,而不是覆蓋它本身。 |
攻擊者使用引誘攻擊。 |
系統和用戶數據 |
可能會危及系統和用戶數據的安全。 |
惡意程序集調用受信任的程序集來代表它執行操作。 |
使用 StrongNameIdentityPermission 和 SecurityAction.FullDemand 來確保調用堆棧中的所有程序集都來自簽名方。 |
小結
要部署 Offline Application Block,請配置您的提供程序并確定您要實施的安全措施。使用 App.config 文件來配置連接檢測提供程序、隊列管理器提供程序、加密設置以及緩存設置。檢查本章中概述的安全注意事項,并確定適用于您環境的對策。最后,測試應用程序的部署,以確保它符合您環境的安全和性能要求。
轉到原英文頁面