现在的位置: 首页 > 综合 > 正文

msdn—-web.config

2012年08月22日 ⁄ 综合 ⁄ 共 10760字 ⁄ 字号 评论关闭
 

保护 ASP.NET 应用程序的安全

发布日期: 1/21/2005 | 更新日期: 1/21/2005

查看全部的安全性指导主题

Microsoft Corporation

*

本单元概要

保护 ASP.NET Web 应用程序依赖于完全受到保护的网络、主机和平台基础结构。如果果真如此,攻击者将试图利用 Web 应用程序和 Web 服务(它们通常侦听端口 80)中的漏洞。如果 Web 应用程序没有有效配置,攻击者就能够获取访问权限并利用系统。

作为管理员,您必须审查默认的机器级配置和单独的应用程序配置,以处理和删除任何脆弱或者不安全的设置。

本单元从系统管理员的观点描述了 ASP.NET 的新功能,以及如何配置机器范围的和特定于应用程序的安全设置。还提出了一种保护 ASP.NET Web 应用程序和 Web 服务的方法,它对我们已经提出的保护网络、应用程序服务器、数据库服务器和 Web 服务器的方法是一种补充。

目标

使用本单元可以:

在注册表中使用 Aspnet_setreg.exe 实用工具存储凭据和连接字符串。

使用配置文件 (*.config) 管理 Web 应用程序环境。

了解如何层次化地实施和处理 Machine.Config 和 Web.Config。

锁定配置设置。

实施机器范围的和 Web 应用程序的安全策略。

通过使用 元素自定义文件和目录安全设置。

保护 ASP.NET 进程标识和在 ASP.NET 应用程序中使用自定义模拟。

了解 ASP.NET 进程帐户必需的 NTFS 权限。

使用窗体身份验证和 URL 授权保护资源。

保护 ASP.NET 会话状态的安全。

保护 Web 服务器场的安全并保护 Bin 目录。

适用范围

本单元适用于下列产品和技术:

Microsoft® Windows® Server 2000 操作系统

Microsoft .NET Framework 1.1 和 ASP.NET 1.1

Microsoft SQL Server™ 2000

如何使用本单元

本单元的注意力主要集中在 ASP.NET 应用程序的关键安全注意事项。要想充分利用本单元:

阅读单元“保护 Web 服务器的安全”。该单元说明了如何保护 Windows 2000 操作系统和 Microsoft .NET Framework。安全的基础平台是保护 ASP.NET Web 应用程序或者 Web 服务的前提条件。

使用快照。本单元最后的表 4 提供了带有 Machine.config 和 Web.config 中的安全配置设置的安全 ASP.NET 应用程序的快照。在配置服务器和应用程序设置时应该使用此表。

使用核对表。本指南“核对表”部分中的“核对表:保护 ASP.NET 的安全”,提供了可以打印的快速参考工具。使用基于任务的核对表,可以快速评估必需步骤的范围,帮助您完成各个步骤。

相关的指导,请阅读“寄宿多个 ASP.NET 应用程序”单元,该单元说明了如何将多个运行在同一服务器上的 Web 应用程序与关键系统资源隔离,以及将应用程序互相隔离。有关为部分信任 Web 应用程序和 Web 服务配置代码访问安全 (CAS) 策略的更多信息,请参阅“在 ASP.NET 中使用代码访问安全”单元。

本页内容
本单元概要 本单元概要
目标 目标
适用范围 适用范围
如何使用本单元 如何使用本单元
方法 方法
须知 须知
Machine.Config 和 Web.Config 详解 Machine.Config 和 Web.Config 详解
Machine.Config 和 Web.Config 准则 Machine.Config 和 Web.Config 准则
ASP.NET 中的信任级 ASP.NET 中的信任级
ASP.NET 的进程标识 ASP.NET 的进程标识
模拟 模拟
身份验证 身份验证
授权 授权
会话状态 会话状态
查看状态 查看状态
机器密钥 机器密钥
调试 调试
跟踪 跟踪
异常管理 异常管理
远程处理 远程处理
Web 服务 Web 服务
禁止的资源 禁止的资源
Bin 目录 Bin 目录
事件日志 事件日志
文件访问 文件访问
ACL 和权限 ACL 和权限
注册表 注册表
数据访问 数据访问
UNC 共享 UNC 共享
COM/DCOM 资源 COM/DCOM 资源
拒绝服务注意事项 拒绝服务注意事项
Web 服务器场注意事项 Web 服务器场注意事项
安全 ASP.NET 应用程序的快照 安全 ASP.NET 应用程序的快照
小结 小结
其他资源 其他资源

方法

要保护 ASP.NET 应用程序的安全,首先要有加固的操作系统和 .NET Framework 安装基础,然后应用安全应用程序配置设置,以减少应用程序的受攻击面。

这些内容包括:

服务。.NET Framework 安装 ASP.NET 状态服务以管理进程外的 ASP.NET 会话状态。 如果您安装了 ASP.NET 状态服务,就应该保护它。如果您不需要,则应该禁用 ASP.NET 状态服务。

协议。限制 Web 服务协议以减少受攻击面。

帐户。默认 ASPNET 帐户是为运行 Web 应用程序、Web 服务和 ASP.NET 状态服务而创建的。如果您创建自定义帐户运行进程或者服务,则必须配置为最低特权帐户,只具有最小集合的必需 NTFS 权限和 Windows 特权。

文件和目录。用来存储私有程序集的应用程序 Bin 目录应该进行保护,以降低攻击者下载业务逻辑的风险。

配置存储区。许多控制功能区域(如身份验证、授权、会话状态等等)与安全相关的设置,都在 Machine.Config 和 Web.Config XML 配置文件中维护。要保护 ASP.NET 应用程序的安全,必须使用安全配置设置。

须知

在开始保护 Web 应用程序和 Web 服务之前,应该知道一些涉及全局的注意事项和细节。

ASP.NET 进程模型

在 Microsoft Windows 2000 上,Internet 信息服务 (IIS) 5.0 在 ASP.NET 辅助进程 (Aspnet_wp.exe) 中运行所有 Web 应用程序和 Web 服务。隔离的单位是应用程序域,每个虚拟目录都有自己的应用程序域。进程级配置设置是通过 Machine.config 中的 <processModel> 元素维护的。

在 Microsoft Windows Server™ 2003 操作系统上,IIS 6.0 应用程序池使您能够使用不同的进程隔离应用程序。有关更多信息,请参阅单元“寄宿多个 ASP.NET 应用程序”。

ASP.NET 帐户

ASPNET 帐户是安装 .NET Framework 时创建的最低特权本地帐户。默认时,它运行 ASP.NET 辅助进程和 ASP.NET 状态服务。

如果您决定使用自定义帐户运行 Web 应用程序,确保配置帐户只具有最低特权。这将能够减少与攻击者使用应用程序的安全上下文设法执行代码相关联的风险。您还必须在 <processModel> 元素上指定帐户的凭据。千万不要以明文存储凭据。相反,应该使用 Aspnet_setreg.exe 工具在注册表中存储加密凭据。自定义帐户还必须被授予适当的 NTFS 权限。

Aspnet_setreg.exe 和进程、会话和身份

Aspnet_setreg.exe 允许在注册表中以加密格式存储凭据和连接字符串。此工具允许您加密以下属性:

<processModel userName = password= />

<identity userName = password= />

<sessionState sqlConnectionString = stateConnectionString= />

下例显示了运行 Aspnet_setreg.exe 保护凭据前后,自定义帐户的 <processModel> 元素的变化:

<!--Before-->
            <processModel userName="CustomAccount" password="Str0ngPassword" />
            <!--After-->
            <processModel
            userName="registry:HKLM\SOFTWARE\YourApp\process\ASPNET_SETREG,userName"
            password="registry:HKLM\SOFTWARE\YourApp\process\ASPNET_SETREG,password"/>
            

您可以选择用来存储加密数据的注册表位置,虽然必须在 HKEY_LOCAL_MACHINE 之下。除了使用数据保护 API (DPAPI) 加密数据,并将其存储在注册表中之外,此工具还能够应用安全 ACL 限制对注册表项的访问。注册表项的 ACL 将向 System、Administrator 和 Creator Owner 授予完全控制权限。如果使用此工具加密 <identity> 元素的凭据或者 <sessionState> 元素的连接字符串,您还必须授予 ASP.NET 进程帐户的读访问权限。

要获取 Aspnet_setreg.exe 工具和有关的更多信息,请参阅 Microsoft 知识库文章 329290,“How To:Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings”。

模拟不是默认的

默认时,ASP.NET 应用程序不进行模拟。因此,资源访问是使用 ASP.NET 辅助进程标识进行的。您必须通过创建适当配置的 ACL 授予进程标识(至少)对 Windows 资源的读访问权限(这是应用程序要求的)。

如果您确实需要启用模拟,可以模拟原始调用方 — 即经 IIS 身份验证的标识或者 <identity> 元素中指定的固定标识。有关更多信息,请参阅本单元后面的“模拟”。

通常,ASP.NET 应用程序不使用模拟,因为这对设计、实现和可伸缩性有负面影响。例如,使用模拟妨碍有效的中间层连接池的使用,这限制了应用程序的可伸缩性。在特定的场景例如当应用程序使用匿名用户帐户的安全上下文进行资源访问时,模拟可能非常重要。这是一个常用技术,经常在多个应用程序寄宿在同一服务器时使用。有关更多信息,请参阅单元“寄宿多个 ASP.NET 应用程序”。

HttpForbiddenHandlerUrlscan 404.dll

您可以用许多技术来防止访问受限资源。ASP.NET 提供了 HttpForbiddenHandler,可以将不应该通过 HTTP 下载的 ASP.NET 文件类型映射为此处理程序。映射是使用 <httpHandlers> 元素应用的。

IISLockdown.exe 提供了404.dll。通过这个工具,您可以配置 IIS 将不希望的文件扩展名映射到 404.dll,这样在请求这些文件类型时,会导致“HTTP 404–File not found”消息。

最后,URLScan ISAPI 筛选器可以用来阻塞对受限文件类型和可执行程序文件的请求。URLScan 是 IISLockdown 工具中附带的,但是也可以单独获得。有关更多信息,请参阅 Microsoft 知识库文章 307608,“ INFO:Using URLScan on IIS”,和本指南“如何……”部分中的“如何使用 URLScan”。

有关 IISLockdown 和 URLScan 的更多信息,请参阅“保护 Web 服务器的安全”单元。

AppSettings

Web.config 中的 <appSettings> 元素允许应用程序存储配置数据,如数据库连接字符串或者服务帐户凭据。此元素的优点是,它允许开发人员将配置数据的存储和检索集中和标准化。Web.config 中的单一位置还能够简化管理和部署。

敏感数据,如连接字符串和凭据,不应该以明文形式存储在配置文件中。相反,开发人员应该在存储之前使用 DPAPI 加密机密。

有关 AppSettings 的更多信息,请参阅 MSDN® TV 上的“AppSettings in ASP.NET”节目,网址是:http://msdn.microsoft.com/msdntv

Machine.Config 和 Web.Config 详解

.NET Framework 提供的配置管理包括范围很广的一组设置,可以供管理员用来管理 Web 应用程序及其环境。这些设置存储在 XML 配置文件中,其中一些控制着机器范围的设置,而其他设置控制着特定于应用程序的配置。

XML 配置文件可以使用任何文本编辑器(如记事本或者 XML 编辑器)编辑。XML 标记是区分大小写的,因此需要确保使用正确的大小写。

图 1 显示了用来配置管理员能够访问的 ASP.NET Web 应用程序的配置文件。

1. ASP.NET 配置文件

Machine.Config 和 Web.Config 文件共享许多相同的配置节和 XML 元素。Machine.config 用来将机器范围的策略应用于本地计算机上运行的所有 .NET Framework 应用程序。开发人员还可以使用特定于应用程序的 Web.config 文件为单独应用程序自定义设置。

Windows 可执行文件,如 WinForm 应用程序,是使用配置文件配置的。这些文件的名称从应用程序可执行文件名称派生而来,例如,App.exe.config,其中的 App 是应用程序名称。

对配置文件所做的更改是动态应用的,通常不需要您重启服务器或者任何服务,除非如果更改 Machine.config 中的 <processModel> 元素,这将在本单元后面讨论。

表 1 显示了配置文件的位置。

表 1 配置文件位置
配置文件 位置

Machine.config
(每个机器每个 .NET Framework 安装版本一个)

%windir%\Microsoft.NET\Framework\{version}\CONFIG

Web.config
(每个应用程序零个、一个或者多个)

\inetpub\wwwroot\web.config
\inetpub\wwwroot\YourApplication\web.config
\inetpub\wwwroot\YourApplication\SubDir\web.config

Enterprisesec.config
(企业级 CAS 配置)

%windir%\Microsoft.NET\Framework\{version}\CONFIG

Security.config
(机器级 CAS 配置)

%windir%\Microsoft.NET\Framework\{version}\CONFIG

Security.config
(用户级 CAS 配置)

\Documents and Settings\{user}\Application Data\Microsoft\CLR Security Config\{version}

Web_hightrust.config
Web_mediumtrust.config
Web_lowtrust.config
Web_minimaltrust.config
ASP.NET Web 应用程序 CAS 配置)

%windir%\Microsoft.NET\Framework\{version}\CONFIG

有关 ASP.NET Web 应用程序 CAS 配置文件的更多信息,请参阅“在 ASP.NET 中使用代码访问安全”单元。

层次化策略评估

为了集中化管理,设置可以在 Machine.config 中应用。Machine.config 中的设置定义了机器范围的策略,还可以通过 <location> 元素使用 Machine.config 中的设置应用特定于应用程序的配置。开发人员可以提供应用程序配置文件以改写机器策略的各个方面。对于 ASP.NET Web 应用程序,Web.config 文件位于应用程序的虚拟根目录,也可以选择在虚拟根下的子目录。考虑如图 2 中所示的安排。

2. 层次化配置

在图 2 中,AppRoot Web 应用程序在其虚拟根目录中有一个 Web.config 文件。SubDir1(而非虚拟目录)还包含它自己的 Web.config 文件,在 HTTP 请求定向到 http://AppRoot/SubDir1 时会用到。如果请求通过 AppRoot 定向到 SubDir2(一个虚拟目录),例如,http://Server/AppRoot/SubDir2,则应用来自 AppRoot 目录中 Machine.config 和 Web.config 的设置。但是,如果请求绕过 AppRoot 而定向到 SubDir2,例如,http://Server/SubDir2,则只应用来自 Machine.config 的设置。

无论如何,基本设置都是从 Machine.config 获取的。接下来,从任何相关 Web.config 文件应用改写和添加。

如果在 Machine.config 中和一个或者多个 Web.config 文件中使用同一个配置元素,来自层次中最低的文件的设置将改写较高级的设置。在机器级没有应用的新配置设置也可能应用于 Web.config 文件,而且某些元素能够使用<clear >元素清除父级设置。

下表显示了为了应用于图 2 的 Web 请求的组合,从何处获取组合的配置设置。

表 2 应用配置设置
HTTP 请求 组合设置获取自

http://Server/AppRoot

Machine.config
Web.config (AppRoot v-dir)

http://Server/AppRoot/SubDir1

Machine.config
Web.config (AppRoot v-dir)
Web.config (SubDir1)

http://Server/AppRoot/SubDir2

Machine.config
Web.config (AppRoot v-dir)

http://Server/Subdir2

Machine.config

<location> 元素用于三个主要目标:

为了将配置设置应用于特定的应用程序文件。

为了通过应用 Machine.config 中的特定于应用程序的设置,实现集中化管理。

为了锁定配置设置以防止在应用程序级改写。

<location> 标记可以用于 Machine.config 中或者 Web.config 中。对于 Machine.config,如果您指定了路径,则必须是完全限定的,包括 Web 站点名称、虚拟目录名称和可选的子目录和文件名。例如:

<location path="Web Site Name/VDirName/SubDirName/PageName.aspx" >
            <system.web>
            . . .
            </system.web>
            </location>
            

当使用来自 Machine.config 的位置标记时,您必须包括 Web 站点名称。对于 Web.config,路径相对于应用程序的虚拟目录。例如:

<location path="SubDirName/PageName.aspx" >
            <system.web>
            . . .
            </system.web>
            </location>
            

对特定的文件应用配置设置

使用 path 属性以应用特定文件的配置设置。例如,为了将授权规则应用于来自 Web.config 中的文件 Pagename.aspx,应该使用以下 <location> 元素:

<location path="SubDirName/PageName.aspx" >
            <system.web>
            <authorization>
            <deny roles="hackers" />
            </authorization>
            </system.web>
            </location>
            

应用 Machine.config 中的应用程序配置设置

您还可以通过使用指定到应用程序目录路径的 <location>语句,应用 Machine.config 中的特定于应用程序的设置。这将使您得到集中化管理的优点。例如,以下片段显示了如何强制使用 Windows 身份验证和防止在特定的应用程序中使用模拟。

<location path="Default Web Site/YourApp">
            <system.web>
            <authentication mode="Windows"/>
            <identity impersonate="false"/>
            </system.web>
            </location>
            

锁定配置设置

为了防止各个应用程序改写机器级策略配置,将设置置于 Machine.config 中的一个 <location> 元素里,并设置 allowOverride="false" 属性。

例如,为了应用无法在应用程序级改写的机器范围策略,使用以下 <location> 元素:

<location path="" allowOverride="false">
            <system.web>
            … machine-wide defaults
            </system.web>
            </location>
            

通过将 path 属性置为空,可以指示设置应用于机器,而 allowOverride="false" 确保了 Web.config 设置不会改写指定的值。只要企图在 Web.config 中添加元素都将生成异常,即使 Machine.config 中的元素与 Web.config 中的元素匹配。

Machine.Config 和 Web.Config 准则

Machine.config 中的设置应用服务器的机器级默认值。如果需要强制服务器上所有应用程序应用一个特殊的配置,使用 <location> 元素的 allowOverride="false",如上所述。这对于寄宿场景尤其适合,其中需要强制服务器上所有应用程序应用安全策略的各个方面。

对于可以对单独应用程序配置的设置,通常应用程序会提供一个 Web.config 文件。虽然可能从 Machine.config 使用多个 <location> 元素配置单独应用程序,但是通过不同的 Web.config 文件对部署来说更佳,而且能够使 Machine.config 文件更小。

主要要考虑的项是哪些设置应该通过机器策略强制。这取决于特定的场景如何。以下是一些常见的场景:

Windows 身份验证。考虑一个公司 intranet 门户场景,其中需要身份验证从应用程序中提取,并由一个单位通过 Active Directory 控制。在此场景,您可以强制 Windows 身份验证,但是允许单独的应用程序用以下配置模拟:

<location path="" allowOverride="false">
                        <system.web>
                        <authentication mode="Windows"/>
                        </system.web>
                        </location>
                        

寄宿场景。寄宿公司需要约束应用程序,使它们无法访问彼此的资源,从而对关键系统资源只有有限的访问权限。为此,您可以配置所有应用程序为在部分信任级运行。例如,中度信任级将约束应用程序,使其只能访问自己虚拟目录层次中的文件,并限制对其他类型资源的访问。有关更多信息,请参阅单元“在 ASP.NET 中使用代码访问安全”。为了使服务器上所有应用程序应用中度信任策略,使用以下配置:

<location path="" allowOverride="false>
                        <system.web>
                        <trust level="Medium" />
                        </system.web>
                        </location>
                        

ACL 和权限

配置文件包含敏感数据,所以需要适当地配置 ACL 以限制访问。

Machine.config

默认时,Machine.config 使用以下 ACL 配置:

Administrators: Full Control
            System: Full Control
            Power Users: Modify
            Users: Read and Execute
            LocalMachine\ASPNET (process identity): Read and Execute
            

在 Windows Server 2003 上,本地服务和网络服务帐户也被授予读访问权限。

Users 组的成员默认时被授予读访问权限,因为所有运行在计算机上的托管代码必须能够读取 Machine.config。

Machine.config 上的默认 ACL 是一个安全默认值。但是,如果只有一个 Web 应用程序运行在服务器上,或者所有 Web 应用程序都使用同一个进程标识,可以通过删除用户的访问控制项 (ACE) 进一步限制 ACL。如果您确实从 DACL 中删除了“users”,需要显式地添加 Web 进程标识。

Web.config

.NET Framework 不安装任何 Web.config 文件。如果您安装了一个提供自己 Web.config 的应用程序,通常从 inetpub 目录继承其 ACL,它默认时授予 Everyone 组的成员读访问权限。要锁定特定于应用程序的 Web.config,使用以下的一个 ACL。

对于 .NET Framework 1.0 版:

Administrators: Full control
            System: Full control
            ASP.NET process identity: Read
            UNC Identity: Read
            Impersonated Identity (Fixed Identity): Read
            Impersonated Identity (Original Caller): Read
            

对于 .NET Framework 1.1 版:

Administrators: Full control
            System: Full control
            ASP.NET process identity: Read
            UNC Identity: Read
            Impersonated Identity (Fixed Identity): Read
            

如果您的应用程序使用一个 显式帐户的模拟(也就是说,如果它们模拟一个固定标识),如 <identity impersonate="true" userName="WebUser" password="Y0urStr0ngPassw0rd$"/>£¬那么帐户(在这里是 WebUser)和进程都需要读访问权限。

如果您的基本代码使用通用命名约定 (UNC) 共享,您必须为 IIS 提供的 UNC 标记标识授予读访问权限。

如果您模拟但是没有使用显式凭据,如 <identity impersonate="true"/>£¬而且没有 UNC,那么在 .NET Framework 1.1 中只有进程需要访问权限。对于 .NET Framework 1.0,必须另外配置 ACL,授予任何将被模拟的标识读访问权限(也就是说,您必须授予原始调用方读访问权限)。

ASP.NET 中的信任级

应用程序的信任级决定 CAS 策略授予它何种权限。这决定了多大程度上应用程序能够访问安全资源和执行特权操作。

<trust>

使用 <trust>元素配置应用程序的信任级。默认时,配置级设置为 Full,如下所示:

<!--  level="[Full|High|Medium|Low|Minimal]" -->
            <trust level="Full" originUrl=""/>
            

这意味着应用程序将被授予完全和无限的 CAS 权限。使用此配置,应用程序进行的任何资源访问的成败只取决于操作系统安全。

如果您将信任级更改为 Full 之外的其他级,可能破坏现有 ASP.NET Web 应用程序,具体情况取决于它们所访问的资源和它们所执行的操作的类型。应用程序应该彻底地在每个信任级进行测试。

有关构建使用 CAS 的部分信任 Web 应用程序的更多信息,请参阅“在 ASP.NET 中使用代码访问安全”单元。有关使用信任级提供应用程序隔离的更多信息,请参

抱歉!评论已关闭.