内容简介
基于 Intranet Web 应用程序的安全性并不是不重要,因为它存在于许多控制网络中,并且对一个限制集合中的用户是可以访问的。不同个体和部门可能需要对应用程序提供的功能和数据有不同的访问等级,所以在传输过程中仍然必须保护机密数据的安全性。为了使问题复杂化,应用程序的安全性结构必须补偿任何安全性相关的问题,这些问题源于存在的基础和要配置应用程序的
Intranet 的操作特点。
通过关注某些常用分布式应用程序结构的要求,本章介绍了基于 Intranet Web 应用程序的身份验证、授权、安全通信的推荐解决方法。
目标
使用本章的目的:
- 保护 Intranet .NET 应用程序
- 理解安全问题和下面方案中推荐的与使用 ASP.NET Web 应用程序和 SQL Server
2000通信相关的解决方案:
- 直接通信
- 使用 Enterprise Services 作为中介
- 使用 Web 服务作为中介
- 使用 .NET Remoting 作为中介
- 在基于 Intranet 分布式 Web 应用程序中决定实现身份验证、授权、安全通信的最好方法。
适用于:
本章适用于下面的产品和技术:
- Microsoft Windows_ XP 或者 Windows 2000 Server (带有
service pack 3) 和更高版本操作系统
- Microsoft Internet Information Services (IIS) 5.0
和更高版本操作系统
- Microsoft Active Directory_ 目录服务
- .NET Framework 1.0 版本(带有 service pack 2) 和更高版本
- SQL Server 2000 (带有 service pack 2) 和更高版本
如何使用本章
为了从本章中获得最大的益处:
- 您必须有开发和配置 ASP.NET、SQL Server、IIS 的经验。
- 您必须有配置 Windows 安全性和 Active Directory 的经验。
- 您必须有配置 Enterprise Services (COM+) 应用程序的经验。
- 请参阅本指南中的“构建安全 ASP.NET 应用程序介绍”。这部分定义了分布式 Web 应用程序身份验证、授权、安全通信的重要性。
- 请参阅本指南中的“ASP.NET 应用程序安全性模型”。这部分概括阐述在创建分布式 ASP.NET
Web 应用程序中使用的结构和技术,并强调身份验证、授权、安全通信适合本结构中的哪些部分。
结合下面的章节使用本章,它们阐明了本章中讨论的技术:
- “How To Create a Custom Account to Run ASP.NET”。
- “How To Implement Kerberos Delegation for Windows
2000”。
- “How To Create a DPAPI Library”。
- “How To Use DPAPI (Machine Store) from ASP.NET”。
- “How To Use DPAPI (User Store) from ASP.NET with
Enterprise Services”。
- “How To Use Role-based Security with Enterprise
Services”。
- “How To Set Up SSL on a Web Server”。
- “How To Use IPSec to Provide Secure Communication
Between Two Servers”。
- “How To Use SSL to Secure Communication with SQL
Server 2000”。
本页内容
- 预备知识
- ASP.NET 到 SQL Server
- ASP.NET 到 Enterprise Services 到 SQL Server
- ASP.NET 到 Web Services 到 SQL Server
- ASP.NET 到 Remoting 到 SQL Server
- 将原调用方传递到数据库
- 小结
预备知识
对 Intranet 应用程序的访问被限制到一组有限的授权用户(例如,属于某个域的雇员)。虽然 Intranet
设置限制了应用程序的公开,但是当您制定身份验证、授权和安全通信策略时,可能仍要面临一些难题。例如,您可能包含非信任域,因此很难将调用方的安全性上下文和标识传递到系统内的后端资源。另外,您的运行环境可能是具有混合浏览器类型的异类环境。因此,更加不便使用通用身份验证机制。
如果同类 Intranet 中的所有计算机均运行 Microsoft Windows 2000 或更高版本的操作系统,并且在域中信任用户使用委派,则可以选择将原调用方的安全性上下文委派到后端。
您还必须考虑安全通信问题。尽管您的应用程序运行在 Intranet 环境中,也不能认为在网络中传送的数据是安全的。除了需要保护应用程序服务器和数据库之间传送的数据外,可能还需要保护浏览器和
Web 服务器之间传送的数据。
本章使用以下常见的 Intranet 方案来阐释主要的身份验证、授权和安全通信技术:
- ASP.NET 到 SQL Server
- ASP.NET 到 Enterprise Services 到 SQL Server
- ASP.NET 到 Web Services到SQL Server
- ASP.NET到Remoting到SQL Server
此外,本章还介绍了一个 Windows 2000 委派方案(“将原调用方传递到数据库”)。在此方案中,使用中间
Web 服务器和应用程序服务器,在操作系统级别将原调用方的安全性上下文和标识从浏览器传递到数据库。
注本章中描述的几个方案或者替换用于运行 ASP.NET 应用程序的默认 ASPNET 帐户,或者更改其密码以允许在远程计算机上创建重复的帐户。这些方案要求更新
Machine.config 中的 <processModel> 元素。<processModel>
凭据不应该以明文形式存储在 machine.config 中。而应该使用 aspnet_setreg.exe
工具以加密凭据的形式存储在注册表中。有关详细信息请参见本指南中的“ASP.NET安全性”和 Microsoft
知识库文章 Q329290 “HOWTO: Use the ASP.NET Utility to Encrypt
Credentials and Session State Connection Strings”(如何做:使用
ASP.NET 工具加密凭证和会话状态链接字符串)。
ASP.NET 到 SQL Server
在此方案中,人力资源数据库在同类 Intranet 中安全地提供每个用户的数据。应用程序使用受信任的子系统模型并代表原调用方执行调用。应用程序使用集成
Windows 身份验证来验证调用方的身份,并使用 ASP.NET 进程标识来调用数据库。由于数据本身所具有的机密性,因此,在
Web 服务器和客户端之间使用了 SSL。
图 1 显示此应用程序方案的基本模型。
图 1. ASP.NET 到 SQL Server
特点
本方案具有以下特点:
- 客户端上安装了 Internet Explorer。
- 用户帐户位于 Active Directory 中。
- 应用程序提供每个用户的机密数据。
- 只有经过身份验证的客户端能够访问应用程序。
- 数据库委派该应用程序对用户进行正确的身份验证(即,应用程序代表用户对数据库进行调用)。
- Microsoft SQL Server 使用单个数据库用户角色进行授权。
保护方案
在此方案中,Web 服务器验证调用方的身份,并通过使用调用方的标识限制对本地资源的访问。要限制原调用方对资源的访问,您不必在
Web 应用程序中进行模拟。数据库验证 ASP.NET 默认进程标识(它是权限最少的帐户)的身份(即数据库信任
ASP.NET 应用程序)。
表 1:安全措施
类别 |
详细信息 |
身份验证 |
通过在 IIS 中使用集成 Windows 身份验证,在 Web 服务器上提供增强身份验证来验证原调用方的身份。
在 ASP.NET 内使用 Windows 身份验证(不模拟)。
通过将 SQL Server 配置为使用 Windows 身份验证,确保数据库连接的安全。
数据库信任 ASP.NET 辅助进程以进行调用。可以在数据库中验证 ASP.NET 进程标识的身份。 |
授权 |
使用绑定到原调用方的 ACL 在 Web 服务器上配置资源。为了简化管理,将用户添加到 Windows
组中并在 ACL 中使用组。
Web 应用程序对原调用方执行 .NET 角色检查,以限制对页面的访问。 |
安全通信 |
保护在 Web 服务器和数据库之间传送的机密数据
保护在原调用方和 Web 应用程序之间传送的机密数据 |
结果
图 2 显示了此方案的建议安全配置。
图 2. ASP.NET 到 SQL Server Intranet 方案的建议安全配置
安全配置步骤
在开始之前,您需要查看以下内容:
- 创建自定义 ASP.NET 帐户(请参见本指南中的“How To Create a Custom
Account to Run ASP.NET”)
- 创建一个权限最少的数据库帐户(请参见本指南中的“数据访问安全性”)
- 在 Web 服务器上配置 SSL(请参见本指南中的“How To Set Up SSL on a
Web Server”)
- 配置 IPSec(请参见本指南中的“How To Use IPSec to Provide Secure
Communication Between Two Servers”)
配置 IIS
步骤 |
更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问
启用集成的 Windows 身份验证 |
要使用 IIS 身份验证设置,请使用 IIS MMC 管理单元。右击应用程序的虚拟目录,然后单击“属性”。
单击“目录安全性”选项卡,然后单击“匿名访问和验证控件”组中的“编辑”。 |
配置 ASP.NET
步骤 |
更多信息 |
将 ASPNET 密码更改为一个已知的强密码值 |
ASPNET 是权限最少的本地帐户,默认情况下用来运行 ASP.NET Web 应用程序。
通过使用“本地用户和组”将 ASPNET 帐户的密码设置为一个已知值。
编辑位于 %windir%\Microsoft.NET\Framework\ v1.0.3705\CONFIG
中的 Machine.config 并重新配置 <processModel>
元素的 userName 和 password 属性
默认
<!-- userName="machine" password="AutoGenerate" -->
成为
<!--
userName="registry:HKLM\SOFTWARE\YourSecureApp\
processModel\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourSecureApp\
processModel\ASPNET_SETREG,password" -->
注意,使用 aspnet_setreg.exe 工具以在加密密码的形式存储在注册表中。 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 |
编辑应用程序的虚拟根目录下的 Web.config
将 <authentication> 元素设置为: |
确保模拟处于关闭状态 |
默认情况下模拟处于关闭状态;不过,请执行如下操作,再次检查以确保它在 Web.config
中是关闭的: 删除 <identity> 元素也能达到同样的效果。 |
配置 SQL Server
步骤 |
更多信息 |
在 SQL Server 计算机上创建一个与 ASP.NET 进程帐户 (ASPNET)
匹配的 Windows 帐户 |
用户名和密码必须与 ASPNET 帐户匹配。
给予该帐户以下权限:
- 从网络访问此计算机
- 拒绝本地登录
- 以批处理作业登录 |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为本地 ASPNET 帐户创建一个 SQL Server 登录 |
这将授予对 SQL Server 的访问权限 |
创建一个新数据库用户,并将登录名映射到数据库用户 |
这将授予对指定数据库的访问权限 |
创建一个新的用户定义的数据库角色,并将数据库用户添加到该角色 |
|
建立该数据库角色的数据库权限 |
授予最少的权限
有关详细信息,请参见本指南中的“数据访问安全性”。 |
分析
- 在此方案中,由于所有用户都使用 Windows 帐户并且使用的是 Microsoft Internet
Explorer,所以在 IIS 中最好使用集成 Windows 身份验证。集成 Windows 身份验证的优点是从不通过网络传送用户的密码。此外,由于
Windows 使用当前交互式用户的登录会话,所以对于用户来说登录是透明的。
- ASP.NET 作为权限最少的帐户运行,所以,一旦遭到攻击,潜在危害被大大降低。
- 要执行 .NET 角色检查或在 Windows ACL 中针对原调用方保证资源的安全,您不必在
ASP.NET 中进行模拟。为了对原调用方执行 .NET 角色检查,按如下所示从 HTTP 上下文中检索代表原调用方的
WindowsPrincipal 对象:
WindowsPrincipal wp = (HttpContext.Current.User as
WindowsPrincipal);
if ( wp.IsInRole("Manager") )
{
// User is authorized to perform manager-specific
functionality
}
ASP.NET FileAuthorizationModule 针对原调用方在 ACL 中检查在 IIS
中映射到 aspnet_isapi.dll 的 ASP.NET 文件类型。对于静态文件类型(例如 .jpg、.gif
和 .htm 文件),IIS 充当关守,它根据文件的相关 NTFS 权限,使用原调用方的标识执行访问检查。
- 对 SQL Server 使用 Windows 身份验证意味着,不必将凭据存储在文件中并通过网络将凭据传递到数据库服务器。
- 在数据库服务器上使用重复的 Windows 帐户(与 ASP.NET 本地帐户匹配的帐户)会导致增加管理负担。如果一台计算机上的密码有改动,则必须在其他计算机上同步并更新它。在某些方案中,您可能能够使用权限最少的域帐户进行更简单的管理。
- 当设置防火墙时(此时 Windows 身份验证所需的端口可能没有打开),重复的本地帐户方法同样有效。在此方案中可能无法使用
Windows 身份验证和域帐户。
- 您需要确保 Windows 组的粒度与您的安全要求一样。由于基于 .NET 角色的安全性以 Windows
组成员身份为基础,所以此解决方案依赖于以正确的粒度设置 Windows 组,以便与访问应用程序的用户类别(共享相同的安全权限)匹配。这里用来管理角色的
Windows 组可以是此计算机的本地组或域组。
- SQL Server 数据库用户角色优先于 SQL Server 应用程序角色,这样可以避免与使用
SQL 应用程序角色有关的密码管理和连接池问题。
应用程序通过用角色名和密码调用内置的存储过程,来激活 SQL 应用程序角色。因此,必须安全地存储密码。当使用
SQL 应用程序角色时,还必须禁用数据库连接池,因为它会严重影响应用程序的可伸缩性。
有关 SQL Server 数据库用户角色和 SQL Server 应用程序角色的详细信息,请参见本指南中的“数据访问安全性”。
- 将数据库用户添加到数据库用户角色中,并且为角色指定了权限,因此,当数据库帐户更改时,您不必更改所有数据库对象的权限。
问与答
- 为什么我不能启用 Web 应用程序模拟,以便使用配置的 ACL 针对原调用方来保护 Web 应用程序所访问的资源?
如果启用模拟,则模拟的安全性上下文不具有网络凭据(假定未启用委派并且您使用的是集成 Windows
身份验证)。因此,对 SQL Server 的远程调用将使用 NULL 会话,而这将会导致调用失败。如果禁用模拟,则远程请求使用
ASP.NET 进程标识。
上述方案使用 ASP.NET FileAuthorizationModule,它使用 Windows
ACL 针对原调用方标识执行授权,并且不要求进行模拟。
如果您使用基本身份验证而不是集成 Windows 身份验证 (NTLM),并且确实启用了模拟,则每个数据库调用都将使用原调用方的安全性上下文。每个用户帐户(或用户所属的
Windows 组)都要求使用 SQL Server 登录。需要限制 Windows 组(或原调用方)访问数据库对象的权限以确保安全性。
- 数据库不知道谁是原始调用方。我如何能创建一条审核记录?
审核 Web 应用程序中的最终用户活动,或者将用户标识作为数据访问调用的参数明确地进行传递。
相关方案
非 Internet Explorer 浏览器
对 IIS 执行集成 Windows 身份验证需要使用 Internet Explorer。在混合浏览器环境中,您的典型选项包括:
- 基本身份验证和 SSL。.大多数浏览器都支持基本身份验证。由于用户的凭据是通过网络传递的,所以必须使用
SSL 来保证此方案的安全。
- 客户端证书。.可以将各个客户端证书映射到唯一的 Windows 帐户,或者使用单个 Windows
帐户来代表所有客户端。T使用客户端证书还要求使用 SSL。
- 表单身份验证。表单身份验证可以根据自定义数据存储(如数据库)或 Active Directory
来验证凭据。
如果根据 Active Directory 进行身份验证,请确保仅检索与应用程序有关的必要的组。正如不应该使用
SELECT * 子句对数据库执行查询一样,不应盲目地从 Active Directory 中检索所有的组。
如果根据数据库进行身份验证,您需要仔细分析 SQL 命令中使用的输入值,以防止 SQL 注入攻击,并且应该在数据库中存储密码哈希值(带有
salt),而不是存储明文密码或加密密码。
有关使用 SQL Server 作为凭据存储和将密码存储在数据库中的详细信息,请参见本指南中的“数据访问安全性”。
注意,在所有情况中,如果您没有使用集成 Windows 身份验证(其中,由平台为您管理凭据),则最后将使用
SSL。不过,此优点仅限于身份验证过程。如果您通过网络传递安全机密数据,则仍须使用 IPSec 或
SSL。
对数据库的 SQL 身份验证
在有些方案中,您可能必须使数据访问安全性而不是首选的 Windows 身份验证。例如,在 Web 应用程序和数据库之间可能设置了防火墙,或者由于安全原因,Web
服务器可能不属于您所在的域。这也会妨碍 Windows 身份验证。这种情况下,您可以在数据库和 Web
服务器之间使用 SQL 身份验证。为保证此方案的安全,您应该:
使用数据保护 API (DPAPI) 来保护包含用户名和密码的数据库连接字符串。有关详细信息,请参阅以下内容:
- 请参见本指南中的“数据访问安全性”中的“安全存储数据库连接字符串”。
- "How To Use DPAPI (Machine Store) from
ASP.NET"
- "How To Use DPAPI (User Store) from ASP.NET
with Enterprise Services"
- "How To Create a DPAPI Library"
- 在 Web 服务器和数据库服务器之间,使用 IPSec 或 SSL 来保护通过网络传递的明文凭据。
将原调用方传递到数据库
在此方案中,使用原调用方的安全性上下文从 Web 应用程序调用数据库。使用此方法时,一定要注意以下几点:
- 如果选择此方法,则需要使用 Kerberos 身份验证(将帐户配置为使用委派)或基本身份验证。
本章后面的“将原调用方传递到数据库”部分讨论了委派方案。
- 还必须在 ASP.NET 中启用模拟。这意味着使用原调用方的安全性上下文执行本地系统资源访问,因此需要正确地配置本地资源(例如注册表和事件日志)的
ACL。
- 由于原调用方无法共享连接,因此数据库连接池受到限制。每个连接都与调用方的安全性上下文关联。
- 另一种传递用户安全性上下文的方法是在应用程序级别传递原调用方的标识(例如,通过使用方法和存储过程参数)。
ASP.NET 到 Enterprise Services 到 SQL Server
在此方案中,ASP.NET 页面调用 Enterprise Services 应用程序中驻留的业务组件,而
Enterprise Services 应用程序又连接到数据库上。例如,请看一个内部定单系统,它通过 Intranet
进行交易并允许内部部门下定单。图 3 中显示了此方案。
图 3. ASP.NET 会在 Enterprise
Services 中调用一个组件,该组件将调用该数据库
特点
本方案具有以下特点:
- 用户安装了 Internet Explorer。
- 在 Web 服务器上部署了组件。
- 应用程序处理机密数据,在传输过程中必须保护这些数据的安全。
- 业务组件使用 Windows 身份验证连接到 SQL Server。
- 基于调用方的标识来限制这些组件中的业务功能。
- 将服务组件配置为服务器应用程序(进程外)。
- 件使用服务器应用程序的进程标识连接到数据库。
- 在 ASP.NET 中启用模拟(确保基于 Enterprise Services 角色的安全性)。
保护方案
在此方案中,Web 服务器验证原调用方的身份,并将调用方的安全性上下文传递到服务组件。服务组件基于原调用方的标识授予业务功能的访问权限。数据库根据
Enterprise Service 应用程序的进程标识进行身份验证(即数据库信任 Enterprise
Services 应用程序中的服务组件)。当服务组件调用数据库时,它在应用程序级别传递用户的标识(通过使用受信任的查询参数)。
表 2:安全措施
类别 |
详细信息 |
身份验证 |
使用集成 Windows 身份验证在 Web 服务器上提供增强身份验证。
将原调用方的安全性上下文传递到服务组件以支持 Enterprise Services (COM+)
角色检查。
使用 Windows 身份验证保护数据库连接的安全。
数据库信任服务组件的标识以调用数据库。数据库验证 Enterprise Services 应用程序进程标识的身份。 |
授权 |
使用 Enterprise Services (COM+) 角色授予业务逻辑的访问权限。 |
安全通信 |
使用 SSL 保护用户和 Web 应用程序之间传送的机密数据。
使用 IPSec 保护在 Web 服务器和数据库之间传送的机密数据。 |
结果
图 4 显示了此方案的建议安全配置。
图 4. ASP.NET 到本地 Enterprise Services
到 SQL Server 的 Intranet 方案的建议安全配置
安全配置步骤
在开始之前,您需要查看以下内容:
配置 IIS
步骤 |
更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问
启用集成的 Windows 身份验证 |
|
配置 ASP.NET
步骤 |
更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 |
编辑应用程序的虚拟根目录下的 Web.config
将 <authentication> 元素设置为: |
配置 ASP.NET Web 应用程序的模拟 |
编辑 Web 应用程序的虚拟目录下的 Web.config
将 <identity> 元素设置为: |
配置 ASP.NET DCOM 安全性,确保 Enterprise Services 调用支持调用方模拟 |
编辑 Machine.config 并找到 <processModel>
元素。确认将 comImpersonationLevel 属性设置为 Impersonate
(默认设置)
< comImpersonationLevel="Impersonate">
|
配置 Enterprise Services
步骤 |
更多信息 |
创建一个用于运行 Enterprise Services 的自定义帐户 |
注 如果使用本地帐户,则还必须在 SQL Server 计算机上创建一个重复的帐户。 |
将 Enterprise Services 应用程序配置为服务器应用程序 |
这可以通过使用“组件服务”工具,或通过位于服务组件程序集中的以下 .NET 属性进行配置。
[assembly: ApplicationActivation(ActivationOption.Server)]
|
配置 Enterprise Services (COM+) 角色 |
使用“组件服务”工具或脚本将 Windows 用户和/或组添加到角色中。
可以使用服务组件程序集中的 .NET 属性来定义角色。 |
将 Enterprise Services 配置为以自定义帐户运行 |
必须使用“组件服务”工具或脚本进行配置。不能使用服务组件程序集中的 .NET 属性。 |
配置 SQL Server
步骤 |
更多信息 |
在 SQL Server 计算机上创建一个与 Enterprise Services
进程帐户匹配的 Windows 帐户 |
用户名和密码必须匹配自定义 Enterprise Services 帐户。
给予该帐户以下权限:
- 从网络访问此计算机
- 拒绝本地登录
- 以批处理作业登录 |
配置 SQL Server 以便进行 Windows 身份验证
为 Enterprise Services 帐户创建一个 SQL Server 登录 |
这将授予对 SQL Server 的访问权限。 |
创建一个新数据库用户,并将登录名映射到数据库用户 |
这将授予对特定数据库的访问权限。 |
创建一个新的数据库用户角色,并将数据库用户添加给该角色 |
|
建立数据库用户角色的数据库权限 |
授予最少的权限
有关详细信息,请参见本指南中的“数据访问安全性”。 |
分析
- ASP.NET 和 Enterprise Services 作为权限最少的帐户运行,所以,一旦遭到攻击,潜在危害被大大降低。当任何一方的进程标识遭到攻击时,由于帐户仅具有有限的权限,因此缩小了危害的范围。另外,在
ASP.NET 中,如果注入了恶意脚本,也可以限制潜在的危害。
- 要将原调用方的安全性上下文传递到 Enterprise Services 组件(以支持基于 Enterprise
Services (COM+) 角色的授权),必须配置 ASP.NET 应用程序以支持模拟。如果不进行模拟,则对进程标识(即
ASP.NET 辅助进程)进行角色检查。模拟影响被授予资源访问权限的对象。
- 在未进行模拟时,针对 ASP.NET 进程标识进行系统资源检查。在进行模拟时,针对原调用方进行系统资源检查。有关从
ASP.NET 访问系统资源的详细信息,请参见本指南中的“ASP.NET安全性”。
- 通过使用 Enterprise Services (COM+) 角色,将访问检查推到中间层(业务逻辑所在的位置)进行。在这种情况下,在入口处检查调用方,将其映射到角色,以及基于角色调用业务逻辑。这可避免不必要的后端调用。Enterprise
Services (COM+) 角色的另一优点是:可以在部署时使用组件服务管理器创建和管理角色。
- 对 SQL 的 Windows 身份验证意味着,可以避免在文件中存储凭据并通过网络进行传送。
- 当设置了防火墙时(此时 Windows 身份验证所需的端口可能没有打开),仍然可以使用本地帐户运行
Enterprise Services 应用程序,以及在数据库服务器上使用重复的帐户。在此方案中可能无法使用
Windows 身份验证和域帐户。
缺陷
- 在数据库服务器上使用重复的 Windows 帐户(与 Enterprise Services
进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。
- 由于基于 .NET 角色的安全性以 Windows 组成员身份为基础,此解决方案依赖于以正确的粒度设置
Windows 组,以便与访问应用程序的用户类别(共享相同的安全权限)匹配。
ASP.NET 到 Web Services 到 SQL Server
在此方案中,运行 ASP.NET 页的 Web 服务器连接到远程服务器上的 Web 服务。该服务器又连接到远程数据库服务器。例如,请看一个提供用户特定机密数据的人力资源
Web 应用程序。此应用程序依赖 Web 服务进行数据检索。图 5 显示了此应用程序方案的基本模型。
图 5. ASP.NET 到远程 Web 服务到
SQL Server
Web 服务公开一个允许个别雇员检索他或她的个人详细信息的方法。必须使用 Web
应用程序只给通过身份验证的个人提供详细信息。 Web 服务还提供了一个支持任何雇员详细信息检索的方法。只有人力资源或工资部门的成员可以使用此功能。在此方案中,将雇员分为三个
Windows 组:
- HRDept(人力资源部门的成员) 该组的成员可以检索有关任何雇员的详细信息。
- PayrollDept(工资部门的成员) 该组的成员可以检索有关任何雇员的详细信息。
- Employees (所有雇员) 该组的成员只能检索他们自己的详细信息。
由于数据本身所具有的保密性,应保证所有节点之间通信的安全。
特点
- 用户安装了 Internet Explorer 5.x 或更高版本。
- 所有计算机运行的都是 Windows 2000 或更高版本。
- 用户帐户位于单一目录林的 Active Directory 中。
- 应用程序将原调用方的安全性上下文一直传递到数据库。
- 所有层都使用 Windows 身份验证。
- 将域用户帐户配置为使用委派。
- 数据库不支持委派。
保护方案 在此方案中,驻留 ASP.NET Web 应用程序的 Web
服务器验证原调用方的标识,并将它们的安全性上下文传递到驻留 Web 服务的远程服务器。这样就可以对 Web
方法应用授权检查,以允许或拒绝对原调用方的访问。数据库验证 Web 服务进程标识的身份(数据库信任 Web
服务)。Web 服务反过来调用数据库,并使用存储过程参数在应用程序级别传递用户的标识。
表 3:安全措施
类别 |
详细信息 |
身份验证 |
Web 应用程序在 IIS 中使用集成 Windows 身份验证来验证用户的身份。
Web 服务在 IIS 中使用集成 Windows 身份验证。它对 Web 应用程序所委派的原调用方安全性上下文进行身份验证。
可以使用 Kerberos 身份验证协议,通过委派将原调用方安全性上下文从 Web 应用程序传递到
Web 服务。
可以使用 Windows 身份验证,通过 ASP.NET 进程帐户连接到数据库。 |
授权 |
Web 应用程序对原调用方执行角色检查,以限制对页面的访问。
通过使用基于原调用方 Windows 组成员身份的 .NET 角色,控制对 Web 服务方法的访问。 |
安全通信 |
可通过使用 SSL 来保护在原调用方和 Web 应用程序及 Web 服务之间传送的机密数据。
可通过使用 IPSec 来保护在 Web 服务和数据库之间传送的机密数据。 |
结果
图 6 显示了此方案的建议安全配置。
图 6. ASP.NET 到 Web 服务到 SQL
Server 的 Intranet 方案的建议安全配置
安全配置步骤
在开始之前,您需要查看以下内容:
配置 Web 服务器(它驻留 Web 应用程序)
配置 IIS |
|
步骤 |
更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问
对 Web 应用程序的虚拟根目录启用 Windows 集成身份验证 |
|
配置 ASP.NET |
|
步骤 |
更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 |
编辑 Web 应用程序的虚拟目录下的 Web.config
将 <authentication> 元素设置为: |
配置 ASP.NET Web 应用程序的模拟 |
编辑 Web 应用程序的虚拟目录下的 Web.config
将 <identity> 元素设置为: |
配置应用程序服务器(它驻留 Web 服务)
配置 IIS |
|
步骤 |
更多信息 |
禁用对 Web 服务的虚拟根目录的匿名访问
对 Web 服务的虚拟根目录启用 Windows 集成身份验证 |
|
配置 ASP.NET |
|
步骤 |
更多信息 |
将 ASPNET 密码更改为一个已知值 |
ASPNET 是权限最少的本地帐户,默认情况下用来运行 ASP.NET Web 应用程序。
通过使用本地用户和组将 ASPNET 帐户的密码改为一个已知值。
编辑位于 %windir%\Microsoft.NET\Framework\ v1.0.3705\CONFIG
中的 Machine.config
并重新配置 <processModel> 元素的 userName
和 password 属性:默认值
<!-- userName="machine" password="AutoGenerate" -->
<!--
userName="registry:HKLM\SOFTWARE\YourSecureApp\
processModel\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourSecureApp\
processModel\ASPNET_SETREG,password" -->
|
将 ASP.NET Web 服务配置为使用 Windows 身份验证 |
编辑 Web 服务的虚拟目录下的 Web.config
将 <authentication> 元素设置为: |
确保模拟处于关闭状态 |
默认情况下模拟处于关闭状态;不过,请执行如下操作,再次检查以确保它在 Web.config
中是关闭的:
注意,由于默认情况下禁用模拟,因此通过删除 <identity>
元素可以达到同样的效果。 |
配置 SQL Server
步骤 |
更多信息 |
计算机上创建一个 Windows 帐户,以便匹配用于运行 Web 服务的
ASP.NET 进程帐户 |
用户名和密码必须匹配自定义 ASP.NET 帐户。
给予该帐户以下权限:
- 从网络访问此计算机
- 拒绝本地登录
- 以批处理作业登录 |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为自定义 ASP.NET 帐户创建一个 SQL Server 登录 |
这将授予对 SQL Server 的访问权限。 |
创建一个新数据库用户,并将登录名映射到数据库用户 |
这将授予对特定数据库的访问权限。 |
创建一个新的数据库用户角色,并将数据库用户添加给该角色 |
|
建立数据库用户角色的数据库权限 |
授予最少的权限 |
分析
- 在此方案中,IIS 中的集成 Windows 身份验证是理想的选择。这是因为,所有用户都使用
Windows 2000 或更高版本、Internet Explorer 5.x 或更高版本,并且都使用
Active Directory 帐户,因此具备了使用 Kerberos 身份验证协议(其支持委派)的条件。T这样,您就可以跨计算机边界传递用户的安全性上下文。
- 在 Active Directory 中,不能将最终用户帐户标记为“敏感,不能被委派”。在 Active
Directory 中,必须将 Web 服务器计算机帐户标记为“可以委派其他帐户”。有关详细信息,请参见本指南中的“How
To Implement Kerberos Delegation for Windows 2000”。
- Web 服务器和应用程序服务器上的 ASP.NET 作为权限最少的本地帐户(本地 ASPNET
帐户)运行,这样一旦遭到攻击,潜在危害被大大降低。
- 将 Web 服务和 Web 应用程序配置为使用 Windows 身份验证。将两台计算机上的 IIS
配置为使用集成 Windows 身份验证。
- 当从 Web 应用程序调用 Web 服务时,默认情况下不传递凭据。要响应下游 Web 服务器上
IIS 发出的网络身份验证质询,必须使用凭据。必须使用以下方法设置 Web 服务代理的 Credentials
属性以明确地指定这一点:
wsproxy.Credentials = CredentialCache.DefaultCredentials;
有关使用凭据调用 Web 服务的详细信息,请参见本指南中的“Web
服务安全性”。
- 将 Web 应用程序配置为使用模拟。因此,在从 Web 应用程序调用 Web 服务时,就会传递原调用方的安全性上下文,并且允许
Web 服务对原调用方进行身份验证(和授权)。
- 在 Web 服务中使用 .NET 角色,基于用户所属的 Windows 组(HRDept、PayrollDept
和 Employees)对用户进行授权。 HRDept 和 PayrollDept 的成员可以检索任何雇员的雇员详细信息,而
Employees 组的成员仅有权检索他们自己的详细信息。
可以使用 PrincipalPermissionAttribute 类在 Web
方法中加上注释,以查询特定的角色成员身份,如以下代码示例所示。注意,可以用 B>PrincipalPermission
代替 PrincipalPermissionAttribute。这是所有 .NET
属性类型的共同特性。
[WebMethod]
[PrincipalPermission(SecurityAction.Demand,
Role=@"DomainName\HRDept)]
public DataSet RetrieveEmployeeDetails()
{
}
上述代码中显示的属性表示,只允许 DomainName\HRDept Windows 组的成员调用
RetrieveEmployeeDetails 方法。如果任何非成员试图调用此方法,就会发生安全异常。
- ASP.NET 文件授权(在 Web 应用程序和 Web 服务中)针对调用方在 ACL 中检查在
IIS 元数据库中是否将任何文件类型映射到 Aspnet_isapi.dll。IIS 检查不存在 ISAPI
映射的静态文件类型(例如 .jpg、.gif、.htm 等),同样使用的是附加到文件中的 ACL。
- 因为将 Web 应用程序配置为使用模拟,所以必须用 ACL 来配置应用程序本身所访问的资源,以便给原调用方至少授予读取权限。
- Web 服务不使用模拟或委派;因此,它使用 ASP.NET 进程标识来访问本地系统资源和数据库。因此,所有调用都是使用单个进程帐户完成的。因此,可以使用数据库连接池。如果数据库不支持委派(例如
SQL Server 7.0 或更低版本),则最好选择此方案。
- 对 SQL Server 进行的 Windows 身份验证意味着不必在 Web 服务器上存储凭据,也意味着不必通过网络将凭据发送到
SQL Server 计算机。
- 原调用方和 Web 服务器之间的 SSL 保护传递到和来自 Web 应用程序的数据。
- 下游 Web 服务器和数据库之间的 IPSec 保护传递到和来自数据库的数据。
缺陷
问与答
数据库不知道谁是原始调用方。我如何能创建一条审核记录?
审核 Web 服务中的最终用户活动,或者将用户的标识作为数据访问调用的参数明确地进行传递。
相关方案
如果您需要连接到非 SQL Server 数据库,或者目前使用的是 SQL 身份验证,则必须使用连接字符串明确地传递数据库帐户凭据。如果您这样做,请确保安全地存储连接字符串。
有关详细信息,请参见本指南中的“数据访问安全性”中的“安全存储连接字符串”。
ASP.NET 到 Remoting 到 SQL Server
在此方案中,运行 ASP.NET 页的 Web 服务器安全地连接到远程应用程序服务器上的远程组件。Web
服务器通过使用 .NET Remoting 在 HTTP 通道上与该组件进行通信。远程组件由 ASP.NET
驻留。图 7 显示了此方案。
图 7. ASP.NET 到 remoting using
.NET Remoting 到 SQL Server
特点
- 用户使用不同类型的 Web 浏览器。
- 远程组件由 ASP.NET 驻留。
- Web 应用程序使用 HTTP 通道与远程组件进行通信。
- ASP.NET 应用程序调用 .NET 远程组件,并传递原调用方的凭据以进行身份验证。基本身份验证提供了这些功能。
- 由于数据本身所具有的机密性,必须在进程与计算机之间保证数据的安全。
保护方案
在此方案中,驻留 ASP.NET Web 应用程序的 Web 服务器验证原调用方的身份。Web 应用程序可以从
HTTP 服务器变量中检索调用方的身份验证凭据(用户名和密码)。然后,Web 应用程序通过配置远程组件代理,使用这些凭据连接到驻留远程组件的应用程序服务器。数据库使用
Windows 身份验证来验证 ASP.NET 进程标识的身份(即,数据库信任远程组件)。远程组件反过来调用数据库,并使用存储过程参数在应用程序级别传递原调用方的标识。
表 4:安全措施
类别 |
详细信息 |
身份验证 |
在 IIS 中使用基本身份验证对用户进行身份验证(除 SSL 外)。
在远程组件 (ASP.NET /IIS) 中使用 Windows 身份验证。
使用权限最少的 ASP.NET 帐户,通过 Windows 身份验证连接到数据库。 |
授权 |
在 Web 服务器上对原调用方执行 ACL 检查。
在远程组件中对原调用方执行角色检查。
授予 ASP.NET(远程组件)标识访问数据库的权限。 |
安全通信 |
使用 SSL 保护在用户和 IIS 中驻留的 Web 应用程序及远程对象之间传送的机密数据。
使用 IPSec 保护在 Web 服务器和数据库之间传送的机密数据。 |
结果
图 8 显示了此方案的建议安全配置。
图 8. ASP.NET 到远程 Web 服务到 SQL
Server 的 Intranet 方案的建议安全配置
安全配置步骤
在开始之前,您需要查看以下内容:
配置 Web 服务器
配置 IIS |
|
步骤 |
更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问
启用基本身份验证 |
使用 SSL 保护基本身份验证凭据。 |
配置 ASP.NET |
|
步骤 |
更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 |
编辑应用程序的虚拟根目录下的 Web.config
将 <authentication> 元素设置为: |
配置应用程序服务器
配置 IIS
步骤 |
更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问
启用集成 Windows 身份验证 |
|
配置 ASP.NET |
|
步骤 |
更多信息 |
将远程组件(在 ASP.NET 中)配置为使用 Windows
身份验证 |
编辑远程组件的虚拟根目录下的 Web.config
将 <authentication> 元素设置为: |
将 ASPNET 密码更改为一个已知值 |
ASPNET 是权限最少的本地帐户,默认情况下用来运行 ASP.NET Web 应用程序(此处用于运行远程组件主机进程)。
通过使用本地用户和组将 ASPNET 帐户的密码改为一个已知值。
编辑位于 %windir%\Microsoft.NET\Framework\ v1.0.3705\CONFIG
中的 Machine.config
Machine.config 并重新配置 <processModel>
元素的 userName 和 password 属性
默认
<!-- userName="machine" password="AutoGenerate" -->
成为
<!--
userName="registry:HKLM\SOFTWARE\YourSecureApp\
processModel\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourSecureApp\
processModel\ASPNET_SETREG,password" -->
注意,使用 aspnet_setreg.exe 工具以在加密密码的形式存储在注册表中。 |
确保模拟是关闭的 |
默认情况下模拟是关闭的;不过请复查一下,确保它在 web.config 中是关闭的,如下所示:
<identity impersonate="false" />
删除 <identity> 元素也能达到同样的效果。 |
配置 SQL Server
步骤 |
更多信息 |
在 SQL Server 计算机上创建一个 Windows 帐户,以便匹配用于运行 Web
服务的 ASP.NET 进程帐户 |
T用户名和密码必须匹配自定义 ASP.NET 帐户。
给予该帐户以下权限:
- 从网络访问此计算机
- 拒绝本地登录
- 以批处理作业登录 |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为自定义 ASP.NET 帐户创建一个 SQL Server 登录 |
这将授予对 SQL Server 的访问权限 |
创建一个新数据库用户,并将登录名映射到数据库用户 |
这将授予对指定数据库的访问权限 |
创建一个新的数据库用户角色,并将数据库用户添加给该角色 |
|
建立数据库用户角色的数据库权限 |
授予最少的权限 |
分析
- Web 服务器和应用程序服务器上的 ASP.NET 作为权限最少的本地帐户运行,因此一旦遭到攻击,潜在危害被大大降低。这两种情况下,均使用默认的
ASPNET 帐户。
使用 ASPNET 本地帐户(在 SQL Server 计算机上具有重复的帐户)可进一步降低潜在的安全风险。数据库服务器上的重复
Windows 帐户允许在应用程序服务器上使用权限最少的 ASP.NET 帐户来运行远程组件。
- 在 Web 服务器上,基本身份验证允许 Web 应用程序使用用户的凭据响应来自应用程序服务器的
Windows 身份验证质询。
为使用调用方的凭据来调用远程组件,Web 应用程序按如下所示的代码段来配置远程组件代理。
string pwd = Request.ServerVariables["AUTH_PASSWORD"];
string uid = Request.ServerVariables["AUTH_USER"];
IDictionary channelProperties =
ChannelServices.GetChannelSinkProperties(proxy);
NetworkCredential credentials;
credentials = new NetworkCredential(uid, pwd);
ObjRef objectReference = RemotingServices.Marshal(proxy);
Uri objectUri = new Uri(objectReference.URI);
CredentialCache credCache = new CredentialCache();
credCache.Add(objectUri, "Negotiate", credentials);
channelProperties["credentials"] = credCache;
channelProperties["preauthenticate"] = true;
有关将安全凭据传递到远程组件的详细信息,请参见本指南中的“.NET
Remoting安全性”。
- 在 ASP.NET Web 应用程序中禁止使用模拟,因为远程处理代理是使用基本身份验证获取的用户凭据专门配置的。
Web 应用程序所访问的任何其他资源均使用 ASP.NET 进程帐户提供的安全性上下文。
- 用户和 Web 服务器之间的 SSL 保护传递到或来自 Web 服务器的数据,并且还保护在身份验证过程中以明文传递的基本凭据。
- 在应用程序服务器上,集成 Windows 身份验证提供对原调用方的 .NET 角色检查。角色对应于
Windows 组。
即使没有模拟,也可以执行基于角色的检查。
- ASP.NET 文件授权针对调用方在 ACL 中检查在 IIS 元数据库中是否将任何文件类型映射到
aspnet_isapi.dll。IIS 对静态文件(在 IIS 中没有映射到 ISAPI 扩展)执行访问检查。
- 因为在应用程序服务器上没有启用模拟,所以远程组件执行的任何本地或远程资源访问均使用 ASPNET
安全性上下文。应该相应地设置 ACL。
- 对 SQL Server 进行的 Windows 身份验证意味着不必在应用程序服务器上存储凭据,也意味着不必通过网络将凭据发送到
SQL Server 计算机。
缺陷
- 在数据库服务器上使用重复的 Windows 帐户(与 ASP.NET 进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。
- 因为基于 .NET 角色的安全性以 Windows 组成员为基础,所以此解决方案需要根据相应层次的
Windows 组来匹配那些将要访问该应用程序的用户类别(共享相同的安全权限)。
相关方案
Web 服务器使用 Kerberos 来验证调用方的身份。使用 Kerberos 委派将原调用方的安全性上下文传递到应用程序服务器上的远程组件。
此方法要求将所有用户帐户配置为使用委派。还将 Web 应用程序配置为使用模拟,并且 Web 应用程序使用
DefaultCredentials 来配置远程组件代理。本指南中的“.NET
Remoting安全性”中的“传送原调用方”部分深入讨论了这种技术。
将原调用方传递到数据库
前面讨论的方案使用了受信任的子系统模型,并且在所有情况下,数据库都信任应用程序服务器或 Web 服务器以便正确地对用户进行身份验证和授权。虽然受信任的子系统模型具有许多优点,但是某些方案(多半是出于审核原因)可能要求您使用模拟/委派模型,并且跨计算机边界将原调用方的安全性上下文一直传递到数据库。
需要将原调用方传递到数据库的典型原因包括:
如果您确实选择了模拟/委派模型(或者由于公司的安全策略而必须这样做),并将原调用方的上下文通过应用程序层传递到后端,则在设计时必须考虑委派和网络访问问题(在跨多台计算机时,这个问题很重要)。共享资源池(如数据库连接)也是一个关键的问题,它可能会显著降低应用程序的伸缩性。
这部分说明如何为两个最常见的应用方案实现模拟/委派:
- ASP.NET 到 SQL Server
- ASP.NET 到 Enterprise Services到SQL Server
有关受信任的子系统模型和模拟/委派模型及其相对优点的详细信息,请参见本指南中的“身份验证和授权设计”。
ASP.NET 到 SQL Server
在此方案中,使用原调用方的安全性上下文来调用数据库。这部分描述的身份验证选项包括基本身份验证和集成
Windows 身份验证。“ASP.NET
到 Enterprise Services 到 SQL Server”部分描述了 Kerberos
委派方案。
在 Web 服务器上使用基本身份验证
以下基本身份验证配置设置允许将原调用方一直传递到数据库。
表 5:安全措施
类别 |
详细信息 |
身份验证 |
在 IIS 中使用基本身份验证对用户进行验证。
在 ASP.NET. 中使用 Windows 身份验证。
在 ASP.NET 中启用模拟。
使用 Windows 身份验证与 SQL Server 进行通信。 |
授权 |
在 Web 服务器上对原调用方进行 ACL 检查。
如果将原调用方映射到 Windows 组(基于应用程序的要求,例如 Managers、Tellers
等),则可以对原调用方进行 .NET 角色检查以限制对方法的访问。 |
安全通信 |
使用 SSL 保护在 Web 服务器和数据库之间传送的明文凭据。
要保护在 Web 应用程序和数据库之间传送的所有机密数据,请使用 IPSec。 |
在此方法中,一定要注意以下几点:
- 基本身份验证使用弹出式对话框提示用户,用户可以在该对话框中键入凭据(用户名和密码)。
- 数据库必须识别原调用方。果 Web 服务器和数据库位于不同的域中,则必须启用相应的信任关系以允许数据库对原调用方进行身份验证。
在 Web 服务器上使用集成 Windows 身份验证
集成 Windows 身份验证导致 NTLM 或 Kerberos 身份验证,具体情况取决于客户机和服务器计算机的配置。
NTLM 身份验证不支持委派,因此不允许将原调用方的安全性上下文从 Web 服务器传递到物理上的远程数据库。在浏览器和
Web 服务器之间使用单个网络中继点以便进行 NTLM 身份验证。要使用 NTLM 身份验证,必须在 Web
服务器上安装 SQL Server,这可能仅适用于很小的 Intranet 应用程序。
ASP.NET到 Enterprise Services 到 SQL Server
在此方案中,ASP.NET 页调用远程 Enterprise Services 应用程序中驻留的业务组件,而这些组件又连接到数据库上。原调用方的安全性上下文从浏览器一直传递到数据库。图
9 中显示了这种情况。
图 9. ASP.NET 在 Enterprise
Services 中调用一个组件,该组件调用数据库
特点
- 用户安装了 Internet Explorer 5.x 或更高版本。
- 所有计算机运行的都是 Windows 2000 或更高版本。
- 用户帐户保存在单一目录林的 Active Directory 中。
- 应用程序将原调用方的安全性上下文(在操作系统级别)一直传递到数据库。
- 所有层都使用 Windows 身份验证。
- 将域用户帐户配置为使用委派,而在 Active Directory 中必须将用来运行 Enterprise
Services 应用程序的帐户标记为“可以委派其他帐户”。
保护方案
在此方案中,Web 服务器验证调用方的身份。然后,您必须将 ASP.NET 配置为使用模拟,以便将原调用方的安全性上下文传递到远程
Enterprise Services 应用程序。在 Enterprise Services 应用程序中,组件代码必须明确地模拟调用方(使用
CoImpersonateClient),确保将调用方的上下文传递到数据库。
表 6:安全措施
类别 |
详细措施 |
身份验证 |
所有层都支持 Kerberos 身份验证(Web 服务器、应用程序服务器和数据库服务器)。 |
授权 |
针对原调用方的标识,在中间层使用 Enterprise Services (COM+) 角色来执行授权检查。 |
安全通信 |
在浏览器和 Web 服务器之间使用 SSL 来保护机密数据。
在 ASP.NET 和远程 Enterprise Services 应用程序中的服务组件之间使用
RPC 数据包保密性(提供加密)。
在服务组件和数据库之间使用 IPSec。 |
结果
图 10 显示了此方案的建议安全配置。
[Caption]
图 10. ASP.NET 调用 Enterprise
Services 中的一个组件,该组件调用数据库。原调用方的安全性上下文传递到数据库。
安全配置步骤
在开始之前,应注意以下配置问题:
配置 Web 服务器 (IIS)
步骤 |
更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问
启用 Windows 集成的身份验证 |
|
配置 Web 服务器 (ASP.NET) |
|
步骤 |
更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 |
编辑 Web 应用程序的虚拟根目录下的 Web.config
将 <authentication> 元素设置为: |
配置 ASP.NET Web 应用程序的模拟 |
编辑 Web 应用程序的虚拟目录下的 Web.config
将 <identity> 元素设置为: |
配置 ASP.NET Web 应用程序用于传出调用的 DCOM 模拟级别 |
ASP.NET Web 应用程序通过 DCOM 调用远程服务组件。用于 ASP.NET 所发出调用的默认模拟级别是“Impersonate”。在
Machine.config 中必须将它更改为“Delegate”。
编辑 Machine.config 并找到 <processModel>
元素,将 comImpersonateLevel 属性设置为 "Delegate"(如下所示)。 |
在客户端配置 DCOM 身份验证级别 |
DCOM 身份验证级别是由客户端和服务器共同确定的。在此方案中,DCOM 客户端是 ASP.NET。
编辑 Machine.config 并找到 <processModel>
元素,将 comAuthenitcationLevel 属性设置为 "PktPrivacy",如下所示。 |
配置服务组件(和应用程序服务器) |
|
步骤 |
更多信息 |
托管类必须从 ServicedComponent 类继承 |
请参见 Microsoft 知识库文章 Q306296 “HOW
TO: Create a Serviced .NET Component in Visual C#
.NET”(如何做:在 Visual C# .NET 中创建服务 .NET 组件)。 |
在服务组件中添加模拟调用方的代码,在访问远程资源(例如,数据库)之前,从 OLE32.DLL
中调用 CoImpersonateClient() 和 CoRevertToSelf(),以便使用调用方的上下文。默认情况下,使用
Enterprise Services 进程上下文进行传出调用。 |
添加对 OLE32.DLL 的引用:
class COMSec
{
[DllImport("OLE32.DLL", CharSet=CharSet.Auto)]
public static extern long CoImpersonateClient();
[DllImport("OLE32.DLL", CharSet=CharSet.Auto)]
public static extern long CoRevertToSelf();
}
在调用远程资源之前,先调用这些外部函数:
COMSec.CoImpersonateClient();
COMSec.CoRevertToSelf();
有关详细信息,请参见本指南中的“Enterprise
Services 安全性”。 |
将 Enterprise Services 应用程序配置为服务器应用程序 |
这可以通过使用“组件服务”工具,或通过位于服务组件程序集中的以下 .NET 属性进行配置。
[assembly: ApplicationActivation(ActivationOption.Server)]
|
配置 Enterprise Services 应用程序以使用数据包保密性身份验证(以便用加密提供安全通信) |
将以下 .NET 属性添加到服务组件程序集。
[assembly: ApplicationAccessControl(
Authentication =
AuthenticationOption.Privacy)]
|
配置 Enterprise Services 应用程序以获得组件级基于角色的安全性 |
要在进程和组件级别(包括接口和类)配置角色检查,请使用下列属性。
[assembly: ApplicationAccessControl(AccessChecksLevel=
AccessChecksLevelOption. ApplicationComponent)]
Decorate classes with the following attribute:
[ComponentAccessControl(true)]
有关配置接口和方法级角色检查的详细信息,请参见本指南中的“Enterprise
Services 安全性”中的“配置安全”。 |
创建一个用于运行 Enterprise Services 的自定义帐户,并在 Active
Directory 中将它标记为“可以委派其他帐户” |
在 Active Directory 中,需要使用标记为“可以委派其他帐户”的域帐户运行
Enterprise Services 应用程序。有关详细信息,请参见本指南中的“How
To Implement Kerberos Delegation for Windows 2000”。 |
将 Enterprise Services 配置为以自定义帐户运行 |
必须使用“组件服务”工具或脚本进行配置。不能在服务组件程序集中使用 .NET 属性。 |
配置数据库服务器 (SQL Server) |
|
步骤 |
更多信息 |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为用户所属的 Windows 组创建 SQL Server 登录。 |
这将授予对 SQL Server 的访问权限。
访问控制策略将 Windows 组按角色进行处理。例如,您可以设置类似 B>Employees、HRDept
和 PayrollDept 的组。 |
为每个 SQL Server 登录创建新的数据库用户 |
这将授予对特定数据库的访问权限。 |
为数据库用户设置数据库权限 |
授予最少的权限
有关详细信息,请参见本指南中的“数据访问安全性”。 |
分析
- 传递原调用方安全性上下文的关键是 Kerberos 身份验证(它生成委派级别令牌)。当服务器进程
(IIS) 收到委派级别令牌后,它可以将该令牌传递到在同一台计算机上使用某个帐户运行的任何其他进程,而无需更改它的委派级别。是使用本地帐户还是域帐户运行辅助进程都无关紧要。重要的是
IIS 的运行方式。如果它不是使用 LocalSystem 帐户运行的,则需要在 Active
Directory 中将运行它的帐户标记为“可以委派其他帐户”。
如果 IIS 是使用 LocalSystem 帐户运行的,则必须将计算机帐户标记为“可以委派其他帐户”。有关详细信息,请参见本指南中的“How
To Implement Kerberos Delegation for Windows 2000”。
- 在此方案中,由于所有用户都使用 Windows 帐户并且使用的是 Internet Explorer
5.x 或更高版本,所以在 IIS 中最好使用集成 Windows 身份验证(带 Kerberos)。集成
Windows 身份验证的优点是从不通过网络发送用户的密码。另外,登录是透明的,因为 Windows
使用当前交互用户的登录会话。
- ASP.NET 构造一个 WindowsPrincipal 对象,并将它附加到当前的
Web 请求上下文 (HttpContext.User)。如果您需要在 Web 应用程序中执行授权检查,则可以使用下面的代码。
WindowsPrincipal wp = (HttpContext.Current.User as WindowsPrincipal);
if ( wp.IsInRole("Manager") )
{
// User is authorized to perform manager-specific functionality
}
ASP.NET FileAuthorizationModule 针对原调用方在
ACL 中检查在 IIS 中映射到 Aspnet_isapi.dll 的 ASP.NET 文件类型。对于静态文件类型(例如
.jpg、.gif 和 .htm 文件),IIS 充当关守,它使用原调用方的标识执行访问检查。
- 过对 SQL 使用 Windows 身份验证,可以避免在应用程序服务器的文件中存储凭据,也可以避免通过网络传递它们。例如,在连接字符串中包含
Trusted_Connection 属性:
ConStr="server=YourServer; database=yourdatabase; Trusted_Connection=Yes;"
- 经过所有层传递原调用方的上下文,这使审核变得非常容易。可以使用平台级审核(例如,Windows
和 SQL Server 提供的审核功能)。
缺陷
- 如果在 Windows 2000 上使用 Internet Explorer 6.0,则协商的默认身份验证机制是
NTLM(而不是 Kerberos)。有关详细信息,请参见 Microsoft 知识库文章 Q299838
“Unable
to Negotiate Kerberos Authentication After Upgrading
to Internet Explorer 6” (在升级到 Internet Explorer
6 之后,无法协商 Kerberos 身份验证)。
- 与使用受信任的子系统模型相比,跨层委派用户在性能和应用程序伸缩性方面费用很高。您无法利用数据库连接池的优点,因为数据库连接与原调用方的安全性上下文绑定在一起,因此无法有效地进行池处理。
- 此方法也依赖于符合应用程序安全需要的 Windows 组粒度。也就是说,必须在正确的粒度级别设置
Windows 组,以便与访问应用程序的用户类别(共享相同的安全权限)匹配。
小结
本章介绍了如何保护一套常见的 Intranet 应用程序方案。
有关 Extranet 和 Internet 应用程序方案,请参见本指南中的“在
Extranet 环境中保护 .NET Web 应用程序 ”和“在
Internet 环境中保护 .NET Web 应用程序 ”。
|