第 5 章 — 安全性考虑事项
智能客户端是分布式应用程序,通常跨越多种不同的产品和技术。管理这些应用程序中的安全性是一件极具挑战性的事情。在服务器端,需要采用一种方法来保护网络、服务器本身及其应用程序。在客户端,应集中于利用平台(其中包括操作系统和
Microsoft? .NET Framework)的安全特性、客户端代码可以执行的特权操作(代码访问安全)以及与服务器平台(域)和服务器应用程序的交互。
有效的安全性取决于深层防御方法。在保护智能客户端时,考虑安全性的各个方面非常重要,其中包括以下几个方面:
身份验证。这唯一地标识了客户端应用程序的用户,从而只有经过认可的用户才能访问应用程序的全部或部分。
授权。这确定唯一标识的用户可以执行的操作。这些操作可以是任务,也可以是对授予经过身份验证的用户访问权限的资源进行的操作。
数据验证。这确保只有适当的和有效的数据才能被应用程序接受。如果允许任何用户输入而不首先验证数据,则攻击者就可以通过插入恶意的输入来危及应用程序的安全。
保护敏感数据。这意味着确保应用程序存储和传输的敏感数据(例如密码或机密的商业数据)是安全的。对敏感数据进行加密可以确保数据不可能以明文形式获得;取决于算法的选择,这还可以确保信息不会被篡改,从而维护其完整性。
审核和日志记录。这包括保存对事件和用户操作的记录。应该考虑将关键的用户操作或活动记录在服务器上,或者安全地记录在客户端上,因为客户端计算机上的日志可能被篡改或清除。
异常管理。这确保应用程序适当地处理异常和失败,并且返回用户友好的非敏感信息。异常详细信息可以记录到事件日志或应用程序日志中。
更改和配置管理。这确保跟踪
IT 环境的配置以及对其进行的任何更改。通过这样做,可以查看是否出现任何未经授权的更改,并且确定任何经授权的更改所涉及的安全性含义。
本章详细描述了在设计智能客户端应用程序时将会面临的一些关键安全性问题,具体来说,重点介绍了身份验证、授权、数据验证和保护敏感数据。同时,本章还介绍了代码访问安全,它是
.NET Framework 中的一项关键技术,用于管理代码级而非用户级安全性。
在检验智能客户端安全性时还需要考虑的另一个重要方面是如何部署智能客户端。有关影响部署的安全性问题的详细信息,请参阅第
7 章:智能客户端的部署与更新。
身份验证
身份验证是通过检验他的或她的凭据来唯一标识用户的过程。当用户试图运行或安装应用程序时,或者当应用程序建立到远程服务的连接或访问本地保存的数据时,都可能需要用户身份验证。
这一节分析智能客户端常见的一些身份验证方案,介绍对网络调用进行身份验证的几种不同方式,并讨论如何收集用户凭据和在脱机时检验这些凭据。
智能客户端身份验证方案
取决于智能客户端应用程序的样式和功能,在用户与应用程序交互的过程中,可能需要在一个或多个阶段对用户进行身份验证。对用户进行身份验证可供选择的阶段有四个:
在应用程序安装时
在应用程序运行时
在用户访问本地保存的敏感数据时
在用户通过网络访问外部服务时
经过身份验证的安装
如果应用程序是集中部署的(例如,使用无接触部署),则可能需要保护 Web 服务器上的应用程序,以便只有经过授权的用户才能安装它们。这些用户必须首先经过
Web 服务器的身份验证,Web 服务器查看他们是否被授权访问该应用程序和将其下载到他们的客户端计算机上。
保护对无接触部署的智能客户端应用程序的访问与保护任何其他位于 Web 服务器的构件(例如 Web 页面)相似。Microsoft
Internet Information Services (IIS) 提供了许多身份验证机制,例如集成 Windows、摘要或基本身份验证。
注如果使用无接触部署并且应用程序使用配置文件来存储它的配置设置,则不适合使用摘要和基本身份验证,因为 .NET
Framework 不能使用这些机制自动下载配置文件。
在选择适当的身份验证机制并且 IIS 可以根据他的或她的凭据标识用户之后,就可以通过设置应用程序和程序集文件上的文件权限来保护应用程序及其依赖程序集。为了简化对大量用户的管理,可以考虑提供对
Microsoft Windows 组(例如 SmartClientAppUsers)的访问,并将各个用户放在这个组中。
所有需要进行身份验证的用户都必须具有服务器上的 Windows 标识,这样 IIS 就可以保护对应用程序及其程序集的访问,但是他们未必需要使用这一标识登录到他们的客户端计算机上。如果用户的登录帐户不为服务器端所知,则当他或她单击指向应用程序的可执行文件的链接时,系统就会提示用户输入用户名和密码。
如果使用集成 Windows 身份验证,则系统就会自动使用已登录用户的凭据来尝试获取对应用程序的访问权限。当用户通过为客户端和服务器所共有的标识登录时,就可以进行无缝且安全的访问。
经过身份验证的应用程序访问
对安装应用程序的用户进行身份验证可以确保,只有经过身份验证和授权的用户才能从中心位置运行应用程序。然而,因为应用程序及其依赖构件可能缓存在客户端计算机上,所以不能在应用程序每次运行时都依赖于这一机制来对用户进行身份验证。在这种情况下,或者当用户有意在本地部署应用程序时,就需要仔细考虑如何通过应用程序对用户进行身份验证。可能需要在用户每次运行应用程序时就对他们进行身份验证,特别是如果应用程序提供敏感功能,或者需要能够撤消用户在任何时候运行应用程序的授权。
在用户使用为客户端和服务器所共有的标识登录到客户端计算机的情况下,可以依赖用户能够登录客户端计算机的事实,并以此作为对运行应用程序的充分身份验证。通过这种方法,可以使用
Microsoft Windows 操作系统来提供用户身份验证,从而使得不必需要用代码实现用户身份验证。另外,因为
Windows 可以在脱机时缓存用户凭据,所以您不需要自己缓存它们。
对于您对用户访问没有任何控制的客户端计算机(例如您的组织的 intranet 外的客户端计算机),您可能需要采用一种自定义身份验证机制来收集用户凭据,并且根据远程安全性授权对他们进行身份验证。如果应用程序能够脱机操作,您就需要在客户端缓存有效的凭据,这样,当他或她启动应用程序时,您就可以根据它们重新对用户进行身份验证。您应该定期强制执行联机重新身份验证,这样就可以防止对这样的应用程序的无限制使用。
经过身份验证的本地数据访问
智能客户端应用程序常常缓存从远程服务获得的数据(例如,为了提高响应速度或者为了支持脱机功能)。如果数据是敏感的,则可能需要在授予用户访问数据的权限之前对其进行身份验证。在这种情况下,可以选择允许未经身份验证的用户运行应用程序,但是需要在授予用户访问敏感数据的权限之前对其进行充分的身份验证和授权。
注确保只有授权用户访问的数据才能在本地缓存非常重要。如果数据是敏感的,则还需要确保采取足够的措施来保证数据的安全。详细信息请参阅本章后面的“处理敏感数据”。本地保存的数据应该保存在安全的位置并进行加密。不管如何对用户进行身份验证,通常都需要以某种方式使用他们的凭据来访问和解密数据。
您可能能够使用用于登录到客户端计算机的默认凭据,也可能需要获得自定义凭据来根据远程安全性授权对用户进行身份验证。对于在
intranet 环境中运行的应用程序,前一种方式最为合适,而对于在 Internet 或外部网环境中运行的应用程序,由于用户通常不在与他们访问的远程服务相同的域中,所以后一种方式比较合适。使用集成
Windows 身份验证的一个好处是,操作系统可以对用户进行身份验证,保护应用程序和本地数据,并且可以在用户脱机时缓存用户凭据。
经过身份验证的网络访问
您可能会选择支持对应用程序的匿名访问并允许任何用户下载和运行它。然而,在应用程序运行在客户端之后,它通常需要通过网络访问远程服务(例如
Web 服务)以获得数据和服务。
通常需要保护对网络数据和服务的访问,以防止未经授权的访问。保护远程服务访问的方式可能有许多种,但通常需要将用户凭据传送到远程服务,以便它可以执行用户身份验证。
当用户通过网络访问远程服务时对他们进行身份验证是一项非常重要的内容。本章后面的“网络访问身份验证类型”比较完整地描述了确保对网络服务调用进行身份验证的一些选择。
选择正确的身份验证模型
前一节描述了您可能选择用来对用户进行身份验证的四个阶段。您可能选择在一个或多个阶段对用户进行身份验证,这取决于您的应用程序及其功能的性质。选择正确的阶段是非常重要的,它既可以帮助确保应用程序和数据的安全,又可以将对应用程序的使用的任何影响降低到最低限度。
如果您的应用程序是集中部署的(例如,如果使用无接触部署进行部署,或者部署到文件共享),则您可能选择将访问仅限于经过授权的用户。如果您想让您的应用程序对任何想要使用它的人都可用,则不需要在安装应用程序时对用户进行身份验证。
客户端计算机通常在物理上并不安全,甚至可能能够进行公开访问。如果是这种情况,并且应用程序提供敏感功能,则往往需要在应用程序运行时对用户进行身份验证。如果应用程序提供的是匿名用户可用的常规功能,则不需要在这一阶段对用户进行身份验证。然而,您可能会选择给匿名用户提供应用程序的部分功能,但是需要在允许他们访问更多受限功能之前对其进行身份验证。
保护对本地保存的敏感数据的访问非常重要。如果应用程序部署在物理上不安全或者可以公开访问的设备上,则应该对敏感数据进行保护,并且只有经过身份验证和授权的用户才能访问它们。应用程序可以给匿名用户提供常规功能,但是在用户试图访问敏感数据时需要对他们进行身份验证。
在应用程序脱机运行时,使用集成 Windows 身份验证也有好处。在这种情况下,Windows 缓存用户凭据,以便当用户登录到脱机客户端计算机时对他(她)进行身份验证。如果您需要在应用程序运行或访问本地保存的敏感数据时对用户进行身份验证,则这一行为使得您的客户端不需要对用户进行身份验证。
|