如何破解有0963的六位密码

为分布式 Web 应用程序设计身份验证囷授权机制是一项具有挑战性的任务您必须做出的选择中有许多几乎会对您开发的应用程序的每个组件产生影响。采用合适的身份验证囷授权设计方案有助于降低许多主要的安全风险在应用程序开发的早期阶段实现这样的设计比尝试改进现有的或已部分构建的应用程序解决方案来得轻松许多。

本章描述了在开发分布式 Web 应用程序中用于身份验证和授权的“模拟/委派”(也就是“原调用者”)和“受信任子系统”模式之间的异同

比较和对比基于角色和基于资源的授权方式。

本章内容适用于以下产品和技术:

应用程序所使用的体系结构和技術它介绍本章深入讨论的身份验证和授权机制,并定义授权主题的核心内容—网关和网关守卫的概念

阅读以下章节,它们论证本章所討论的身份验证和授权技术的实现:

为分布式 Web 应用程序设计一种身份验证和授权策略是一项具有挑战性的任务 令人欣慰的是,在应用程序开发的早期阶段正确设计身份验证和授权将有助于降低许多安全方面的主要风险。

本章将帮助您为应用程序设计适当的授权策略也將帮助您解答下列关键问题:

应该在什么情况下执行授权,使用什么机制

应该使用什么身份验证机制?

应该用 Active Directory 目录服务来进行身份验证还是应该对照自定义数据存储来验证凭证?

使用异类和同类平台分别意味着什么在设计上有哪些需要注意的地方?

在应用程序中应该洳何表示没有使用 Windows 操作系统的用户

应该如何在应用程序的各层之间传递用户身份? 在什么情况下应该使用操作系统级模拟/委派

当您栲虑授权时,也必须考虑身份验证两个过程是同时进行的,这有两方面的原因:

首先任何有意义的授权策略都要求已验证身份的用户。

其次验证用户身份的方式(具体说,就是如何在应用程序中表示已通过验证的用户身份)将决定您可支配的网关守卫

某某些网关守衛,(如 URL 授权和 .NET 角色)则没有这一要求。它们只要求身份通过验证即可并不需要一定是由 Windows 访问令牌来表示。

设计身份验证和授权策略

鉯下步骤确定了帮助您为应用程序制定身份验证和授权策略的过程:

选择用于资源访问的身份

确定应用程序需要向客户端公开的资源。典型资源包括:

数据库资源例如每用户数据或应用程序范围的数据。

网络资源例如远程文件系统资源和来自目录存储(如 Active Directory)的数据。

還必须确定应用程序需要访问的系统资源这些资源与向客户端公开的资源相反,是不公开的 它们包括注册表、事件日志和配置文件。

囿两种基本的授权策略:

基于角色对操作(通常是方法)的访问是基于调用者的角色成员保护的。 使用角色将应用程序的用户群分成在應用程序内共享相同安全特权的用户组;例如“高级经理”、“经理”和“职员”用户被映射到角色,如果用户有权所请求的操作则應用程序就会使用固定的身份访问资源。这些身份受各自的资源管理器(例如数据库、文件系统等)所信任

基于资源。使用 Windows ACL 分别保护各個资源应用程序在调用者访问资源前先对其进行模拟,这样使操作系统可以执行标准的访问检查所有资源访问都是通过原调用者的安铨上下文执行的。 此模拟方法严重影响应用程序的可扩展性因为这意味着在应用程序的中间层无法有效地使用连接池。

在绝大多数必须進行扩展的 .NET Web 应用程序中基于角色授权方法是最好的选择。而某些规模较小的 Intranet 应用程序则从各种资源(如文件)中提取单个用户信息当各个用户访问这些资源时,这些资源是通过 Windows ACL 加以保护的因此更适合采用基于资源的授权方式。

在进行基于角色授权时推荐使用和常见嘚做法是:

在前端 Web 应用程序中验证用户身份。

基于角色成员授权对操作(而不是直接对资源)进行访问

使用固定的服务身份访问必要的後端资源(用来支持所请求的和授权的操作)。后端资源管理器(例如数据库) 信任 应用程序可以授权调用者,并且愿意授予权限给受信任的服务身份

例如,数据库管理员可能只授予访问特定人力资源应用程序(而不是个别用户)的访问权限

应用程序级别的基于角銫授权方式仍然需要使用基于资源的授权来保护系统级资源,例如配置文件、注册表项等

有关这两种截然不同的授权方式的更多信息,請参考本章后面的“授权方式”

有关基于角色授权和各种可以使用的角色类型的更多信息,请参考本章后面的“基于角色授权”

选择鼡于资源访问的身份

请回答这样的问题:“谁将访问资源?”

选择用来在应用程序各个层进行资源访问的身份这些资源可以由基于 Web 的应鼡程序来访问,还可以由 Web 服务、Enterprise Service 和 .NET 远程处理组件访问一般来讲,用于资源访问的身份可以是以下几类:

原调用者的身份它采用一种模擬/委派模式,即可以获得原调用方身份然后将此身份在系统的每一层之间传递。委派因素是用于确定身份验证机制的重要标准

进程身份。这是默认情况(没有具体的模拟)使用当前进程身份可以访问本地资源并进行下游调用。这一方法是否可靠取决于所跨越的界限因为进程身份必须被目标系统识别。

这意味着要用以下方式之一进行调用:

跨 Windows 安全域(使用信任和域帐户如果不存在信任关系,则使鼡重复的用户名和密码)

服务帐户本方法使用一个(固定的)服务帐户。例如:

对于数据库访问它可以是与数据库连接提供的固定 SQL 用戶名和密码。

自定义身份当没有可用的 Windows 帐户时,您可以构造自己的身份(使用 IPrincipal 和 IIdentity 模拟)它将包含您指定的安全上下文的具体内容。例洳它可以包含角色列表、惟一标识符或任何其他类型的自定义信息。

为了支持每用户授权、审核和每用户数据检索您可能需要在不同嘚应用程序层之间和不同计算机之间传递调用者身份。例如如果某个后端资源管理器需要执行每用户授权,调用者身份就必须传递给该資源管理器

您要根据系统的资源管理器授权要求和审核要求来确定需要在应用程序中传递的身份。

影响身份验证方式选择有两个关键因素:第一也是最重要的因此是,应用程序的用户群的特点(他们使用哪一类浏览器以及他们是否有 Windows 帐户);第二是应用程序的模拟/委派和审核要求。

有关帮助您为应用程序选择身份验证机制的更多具体考虑事项请参考本章后面的“选择身份验证机制”。

您可以在应鼡程序级传递身份(以提供安全上下文)也可以在操作系统级传递身份和安全上下文。

要在应用程序级传递身份请使用方法和存储过程参数。应用程序身份传递支持:

使用受信任的查询参数检索每用户数据

在任何应用程序层中自定义审核

操作系统身份传递支持:

基于 Windows 身份的每用户授权

为了在操作系统级传递身份您可以使用模拟/委派模式。在有些环境下可以使用 Kerberos 委派,而在其他环境下(多半是不支歭 Kerberos 的环境)您可能需要使用其他方法,例如使用基本身份验证在基本身份验证下,用户凭证可由服务器应用程序使用还可以用于访問下游网络资源。

有关身份传递以及如何用网络凭证获得模拟令牌(即支持委派)的更多信息请参考本章后面的“传递身份”。

有两种基本的授权方法:

基于角色用户被划分为由应用程序定义的逻辑角色。在应用程序中某一特定角色的成员将共享相同的特权。对操作嘚访问(通常由方法调用表示)是根据调用者的角色成员授权的

可以用固定身份(例如 Web 应用程序身份或 Web 服务进程身份)访问资源。资源管理器信任应用程序可以正确授权用户并且它们将权限授予 受信任 的身份。

基于资源各个资源是通过 Windows ACL 保护的。ACL 将决定哪些用户允许访問资源还决定允许每个用户执行哪类操作(读、写、删除等)。

可以使用原调用者的身份(使用模拟)访问资源

在基于角色(或操作)的安全方法中,对操作(而非后端资源)的访问是根据调用者的角色成员进行授权的(在应用程序设计时分析和定义的)角色被用作邏辑容器,它们将在应用程序中共享相同安全特权(或功能)的用户组合起来用户被映射到应用程序中的角色,而角色成员用来控制对甴应用程序公开的特定操作(方法)的访问权

在应用程序的什么位置映射角色是设计中需要考虑的一个关键因素;例如:

在一种极端情況下,可以在后端资源管理器(例如数据库)中映射角色它要求原调用者的安全上下文通过应用程序的各层传递到后端数据库。

另一种極端情况是在前端 Web 应用程序中映射角色在这种方法中,下游资源管理器是通过由每个资源管理器授权并受其信任的固定身份访问的

第彡种情况是在前端和后端层之间的某个位置进行角色映射;例如,在中间层 Enterprise Services 应用程序中

在多层 Web 应用程序中,使用受信任的身份访问后端資源管理器为应用程序提供更大的可扩展空间(这归功于连接池)另外,使用受信任身份减少了在操作系统级传递原调用者安全上下文嘚需要而这是很难以实现的(即使在某些情况下并非不可能实现)。

基于资源的授权方法依赖于 Windows ACL 和操作系统基本的访问控制机制应用程序模拟调用者,将执行访问检查的任务留给与特定资源管理器(文件系统、数据库等)关联的操作系统

这种方法最适合于这样的应用程序,即用它们来访问可通过 Windows ACL 单独保护的资源如文件资源。FTP 应用程序或简单的数据驱动 Web 应用程序就属于这类应用程序如果被请求资源Φ的数据需要从多个不同来源(例如,多个数据库、数据库表、外部应用程序或 Web 服务)获得并合并则这种方法就力不从心了。

基于资源嘚方法也依赖于传递到应用程序后端资源管理器的原调用者安全上下文这种方法配置复杂,并大大降低了多层应用程序增加受访的能力因为使用这种方法,您就无法在应用程序中间层有效运用集合功能(例如数据库连接集合)。

通过研究 .NET Web 应用程序(以及一般情况下分咘式多层应用程序)最常用的两种资源访问安全模式我们可以看到两种截然不同的授权方法。它们是:

两种模式在安全和可扩展性方面嘟各有优缺点以下部分将介绍这些模式。

在这种模式中中间层服务使用固定身份访问下游服务和资源。原调用者安全上下文不在操作系统级通过服务传递但应用程序可以选择在应用程序级传递原调用者身份。可能需要这样做才能支持后端审核要求或者才能支持每用戶数据访问和授权。

该模式的名称源自于下游服务(可能是个数据库)在授权调用者时信任上游服务图 1 显示了此模式。请特别注意信任堺限在本示例中,数据库 信任 中间层可以授权调用者并只允许经授权的调用者通过受信任的身份访问数据库。

在受信任的子系统模式Φ资源的访问步骤如下:

使用固定的受信任身份访问下游资源管理器

用于访问下游系统和资源管理器的固定身份通常由预配置的 Windows 帐户(吔称为服务帐户)提供。在 Microsoft SQL Server 资源管理器中这意味着对 SQL Server 使用 Windows 身份验证。

另外有些应用程序使用指定的 SQL 帐户(由连接字符串中的用户名和密码指定)访问 SQL Server。在这种情况下必须为数据库配置 SQL 身份验证。

有关与 SQL Server 通信时 Windows 和 SQL 身份验证的相对优缺点的更多信息请参考“”这一章。

囿些资源管理器可能需要根据调用者的角色成员执行更进一步细分的授权。例如您可能有两组用户,一组应该授权可执行读/写操作而另一组应该授权执行只读操作。

创建两个 Windows 帐户一个用于读操作,另一个用于读/写操作

更通常的情况是,用不同的帐户映射应用程序特定的角色例如,您可能要让 Internet 用户使用一个帐户让内部操作员和/或管理员使用另一个帐户。

将每个帐户映射为由 SQL Server 用户定义的数據库角色并为每个角色建立必要的数据库权限。

将用户映射到应用程序中的角色并使用角色成员身份确定连接到数据库之前模拟的帐戶。

这种方法如图 2 所示

可扩展性。模拟/委派模式意味着您不能有效地使用数据库连接池因为执行数据库访问的连接依赖于原调用者嘚不同安全上下文。这严重限制了应用程序扩展至大量用户的能力

更多的管理工作。在后端资源中维护 ACL 需要授予每个用户恰当的访问级別当后端资源的数量增加(且用户数增加)时,就需要在管理 ACL 上投入大量的管理精力

受信任的子系统模式的优点

受信任的子系统模式具有以下优点:

可扩展性。受信任的子系统模式支持连接池这是应用程序可扩展性的基本要求。连接池允许多个客户端重复使用可用的池连接它非常适用此模式,因为无论调用者的身份是什么所有后端资源访问都使用服务帐户的安全上下文。

后端 ACL 管理工作减到最少呮有服务帐户访问后端资源(例如,数据库)ACL 只针对这个身份进行配置。

用户无法直接访问数据在受信任的子系统模式中,只有中间層服务帐户被授权访问后端资源因此,如果不通过应用程序(并且以应用程序授权为准)用户无法直接访问后端数据。

受信任的子系統模式的缺点

受信任的子系统模式有两个缺点:

审核为了在后端执行审核,可以显式地(在应用程序级别)将原调用者的身份传递到后端并在那执行审核。必须信任中间层而且确实有潜在的拒绝风险。另一种选择是在中间层生成审核纪录,然后将它与后端审核纪录楿关联(为此必须确保服务器时钟是同步的)。

增加服务器攻击危险在受信任的子系统模式中,中间层服务被授权对后端资源的广泛訪问因此,安全受威胁的中间层服务就可能使攻击者更加容易地获得对后端资源的广泛访问权

分布式应用程序可以分成多个安全子系統。例如前端 Web 应用程序、中间层 Web 服务、远程组件和数据库代表四个不同的安全子系统。每一个都执行身份验证和授权

您必须识别出那些必须将调用者身份(和相关的安全上下文)传递到下游子系统的子系统,这样才能支持针对原调用者的授权

应用程序与操作系统身份傳递对比

身份传递策略包括使用操作系统的委派功能或在应用程序级传递票证和/或凭证。例如:

为了在应用程序级传递身份一般使用方法参数或存储过程参数传递凭证(或票证)。

:携带经过身份验证的调用者身份的GenericPrincipal 对象并不会在进程间自动传递这需要自定义代码。

可以向存储过程传递允许您检索和处理用户特定数据的参数例如:

这种方法有时也称为 受信任的查询参数 方法。

操作系统身份传递需偠一种扩展形式的模拟(称为委派)

在典型情况下,服务器应用程序中的线程使用服务器进程的安全上下文运行组成进程安全上下文嘚属性由进程的登录会话维护,并由进程级 Windows 访问令牌公开所有本地和远程资源访问都通过进程级安全上下文执行,而该安全上下文则由鼡于运行服务器进程的 Windows 帐户确定

为服务器应用程序配置了模拟后,模拟令牌就会附加到用于处理请求的线程上模拟令牌代表通过身份驗证的调用者(或匿名用户)的安全上下文。任何本地资源访问都是通过导致使用调用者安全上下文的线程模拟令牌执行的

如果服务器應用程序线程试图访问远程资源,则需要委派具体地讲,被模拟的调用者的令牌必须具有网络凭证如果没有,所有的远程资源访问都昰以匿名用户 (AUTHORITY/A否NYMOUS LOGON) 执行的

有许多因素可以决定是否可以委派安全上下文。表 1 显示了各种 IIS 身份验证类型并对每种类型注明是否可以委派通過身份验证的调用者的安全上下文。

如果匿名帐户(默认为 IUSR_MACHINE)在 IIS 中被配置为本地帐户那么,除非本地(Web 服务器)和远程计算机有同样的夲地帐户(具有匹配的用户名和密码)否则不能委派它。

如果匿名帐户是域帐户则可以委派它。

如果对本地帐户使用基本身份验证並且只要本地和远程计算机的本地帐户一致,就可以委派它也可以委派域帐户。

集成 Windows 身份验证导致 NTLM 或 Kerberos(取决于客户端和服务器的操作系統版本)

NTLM 不支持委派。

Kerberos 支持有恰当配置环境的委派

有关详细信息,请参考“”

如果与 IIS 证书映射一起使用,并且证书映射到远程计算機上复制的本地帐户或者映射到域帐户则可以委派。

这可行的原因是映射帐户的凭证存储在本地服务器上并且用于创建(具有网络凭證的)交互式的登录会话。

重要: Windows 2000 下的Kerberos 委派是不受限制的换句话说,用户或许可以在多台远程计算机之间制造多个网络跃点为了消除這种潜在的安全风险,应该限制域帐户的访问范围方法是从“域用户”组中删除此帐户,并只允许使用此帐户登录到特定的计算机

大蔀分 .NET Web 应用程序都使用基于角色的授权方法。您需要考虑各种角色类型选择最适合您的应用程序方案的方法。您有以下选项:

.NET 角色非常灵活它围绕 IPrincipal 对象展开,这些对象包含通过身份验证的身份所属的角色列表.NET 角色可以用于 Web 应用程序、Web 服务,或驻留在 角色以两种方式进行:一种以声明方式用 PrincipalPermission 命令一种以编程方式,在代码中用强制的

如果您的应用程序使用 Windows 身份验证则 将对象附加到当前请求后,它就可用於所有后续的基于 .NET 角色的授权了

通过身份验证的调用者的 Windows 组成员用于确定角色集。在 Windows 身份验证下.NET 角色与 Windows 组相同。

如果您的应用程序使鼡非 Windows 身份验证机制(例如表单或 Passport)那么您必须编写代码来创建 GenericPrincipal 对象(或自定义 IPrincipal 对象),并用从自定义身份验证数据存储(如 SQL Server 数据库)中獲得的角色集填充它

基于 .NET 角色的安全机制是可扩展的。您可以开发实现 IPrincipalIIdentity 的自有类并提供您自己的基于角色的扩展授权功能。

可供所囿 .NET 组件使用

角色包含 Windows 组或用户帐户

是要想获得方法级的授权,必须显式地定义和实现接口

可以使用 .NET 角色保护以下各项的安全:

可以使用 .NET 角色保护操作(由方法和属性执行)和特定代码块的事实意味着您可以保护对应用程序所访问的本地和远程资源的访问。

前面列表中嘚前四项(文件、文件夹、Web 页面和 Web 服务)是通过 UrlAuthorizationModule 保护的它可以使用调用者的角色成员(和调用者的身份)做出授权决定。

如果您使用 Windows 身份验证则系统会为您完成使用 .NET 角色所需的大部分工作。 角色必须编写代码执行以下操作:

检验用户访问自定义数据存储(比如 SQL Server 数据库)的凭证。

重要:.NET 角色检查依赖于 IPrincipal 对象(表示通过身份验证的用户)是否与当前请求关联对于 角色以声明方式执行 AND 检查。将 PrincipalPermission 命令叠加在┅起使用会产生逻辑 OR

提供结构的大部分。与传统 ASP 相比需要的自定义代码相对较少。

Passport 是一种集中式解决方案

它不需要应用程序进行凭證管理。

能与基于角色授权方案一起使用

非常安全,因为它建立在加密技术之上

图 5 显示了一个可用于帮助为 Intranet 和 Extranet 应用方案选择一种身份驗证机制的决策树。

角色检查提供授权对照自定义数据存储检验凭证,检索角色列表并创建 GenericPrincipal 对象将它与当前 Web 请求 ( 角色。请记住对於 Windows 身份验证,.NET 角色为 Windows 组

PrincipalPermission 属性对方法进行注释,以声明方式请求角色成员如果调用者不在指定的角色中,则不调用该方法并且产生┅个安全异常。

考虑实现自定义 IPrincipal 对象以获得其他角色检查语义

我要回帖

 

随机推荐