直播中
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 |
每个提供程序所需的自定义属性被表示为子元素。
以下配置文件摘录显示了 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 类来检测与网络的连接性。
下列提供程序可用于队列存储:
• |
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 特性将在下面的“加密设置”部分中进行更全面地讨论。
配置文件中队列存储提供程序的每个提供程序节点都具有一个与之关联的 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. |
从文本框中复制该密钥,并将其用于配置文件中。 |
有关加密的详细信息,请参阅下列文章:
• |
Cryptography,位于 Microsoft Research Web 站点 (http://research.microsoft.com/crypto/) |
• |
Cryptography and Secure Communications,位于 TechNet Web 站点 (http://www.microsoft.com/technet/security/topics/crypto/default.mspx) |
• |
Cryptography ,位于 MSDN Web 站点 (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/cryptography_portal.asp) |
使用队列提供程序有助于您更安全地存储数据。以下配置文件摘录显示了 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 文件。
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 来确保调用堆栈中的所有程序集都来自签名方。 |