保证 ASP.NET 配置的安全

更新:2007 年 11 月

ASP.NET 配置提供用来配置整个服务器、ASP.NET 应用程序或应用程序子目录中各页的功能。可以配置各种功能,如身份验证模式、页缓存、编译器选项、自定义错误、调试和跟踪选项等等。本主题描述当配置本地或远程 ASP.NET 应用程序时,如何通过最佳做法来优化配置功能的安全性。有关保护 ASP.NET 安全的其他功能的更多信息,请参见另请参见节中列出的信息。

尽管遵循编码和配置最佳做法有助于提高应用程序的安全性,但还要注意不断用 Microsoft Windows 和 Microsoft Internet 信息服务 (IIS) 的最新安全更新以及 Microsoft SQL Server 或其他成员资格数据源的任何更新,使应用程序服务器保持最新。这一点非常重要。

有关编写安全代码和保护应用程序的最佳做法的详细信息,请参见 Michael Howard 和 David LeBlanc 合著的 Writing Secure Code(《编写安全代码》)一书,以及参见 Microsoft Patterns and Practices(Microsoft 模式和做法)提供的指导。

ms178699.alert_caution(zh-cn,VS.90).gif重要说明:

ASP.NET 配置系统仅配置 ASP.NET 资源和功能。要配置非 ASP.NET 资源,应使用 IIS 的配置功能。有关配置 IIS 的更多信息,请参见 Working with the Metabase (IIS 6.0)(使用元数据库 (IIS 6.0))IIS Metabase Property Reference(IIS 元数据库属性引用)

配置文件的安全性

下表列出了默认情况下在 Machine.config 文件和根 Web.config 文件上设置的访问控制列表 (ACL),这两个文件均位于 %SystemRoot%\Microsoft.NET\Framework\版本\CONFIG 目录中。这些 ACL 还会在该目录上设置,但是它们包括 Power Users 组的修改权限。该目录是只读的。

Windows 帐户

权限

Administrators

完全控制

ASP.NET 计算机帐户(<服务器>\ASPNET)

读取和执行

IIS_WPG(<服务器>\IIS_WPG)

读取和执行

LOCAL SERVICE

读取和执行

NETWORK SERVICE

读取和执行

Power Users(<服务器>\Power Users)

修改

SYSTEM

完全控制

Users(<服务器>\Users)

读取和执行

下表列出了应当在 Web.config 文件以及 configSource 属性中列出的任何文件上设置的 ACL。

Windows 帐户

权限

Administrators

完全控制

IIS_WPG(<服务器>\IIS_WPG)

读取和执行

INTERACTIVE

读取

Internet 来宾帐户(<服务器>\IUSR_<服务器>)

Read

NETWORK

读取

NETWORK SERVICE

Read

SYSTEM

完全控制

Users(<服务器>\Users)

读取和执行

ASP.NET 网站管理工具 帐户

特殊

无论配置设置是如何编辑的,ASP.NET 配置系统都使用在配置文件上设置的 ACL。有关更多信息,请参见编辑 ASP.NET 配置文件

保证配置值的安全

当在应用程序的配置文件中存储敏感信息时,应使用受保护的配置对敏感值进行加密。特别敏感的信息包括存储在 machineKey 配置元素中的加密密钥,以及存储在 connectionStrings 配置元素中、用来连接到数据源的连接字符串。有关更多信息,请参见使用受保护的配置加密配置信息

保护配置加密密钥容器

使用加密密钥的一个重要方面就是保护存储该密钥的文件(也称为容器)。需要谨记的一个要点是与容器相关联的保护级别。注意,容器存储在常规操作系统文件中,对加密密钥的访问受该文件上的 ACL 控制。ACL 可以从创建该文件的文件夹继承。本地计算机范围 (useMachineContainer"true") 的密钥容器存储在位于 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys 的一个隐藏文件夹中。

默认情况下,创建密钥容器的用户将拥有对密钥的完全访问权限。其他用户(包括 Administrators 组)可能有也可能没有对该容器的访问权限,具体取决于该容器上设置的 ACL。其他用户可以使用 ASP.NET IIS 注册工具 (ASP.NET IIS 注册工具 (Aspnet_regiis.exe)) 的 –pa 开关,获得对该容器的访问权限。尝试用指定密钥进行加密或解密的用户必须具有访问密钥容器的所需权限。

在有些情况下,没有管理权限的用户不能创建加密密钥。在密钥不存在的情况下,如果应用程序请求配置加密,就可能会发生此问题。注意,如果该容器不存在,将创建它,并将执行加密操作。

在这种情况下,.NET Framework 会创建所需的密钥及带有当前用户 ACL 的相关容器。这里的潜在问题是可能会拒绝具有管理权限的用户访问加密密钥容器。管理员通过获取上述文件夹上的物理文件的所属权,可以重新获得对密钥的访问权。建议的准则要求具有管理权限的用户在使用前创建所需的密钥,从而避免在加密时创建它们。

在共享宿主环境中保护配置的安全性

在共享宿主环境中,恶意用户有可能会直接修改配置文件或通过配置 API 及其他管理和配置工具修改配置文件,从而修改配置设置。您可以通过锁定配置节来帮助防止他人修改您的应用程序配置。为此,应将 location 元素添加到 Machine.config 文件或者位于层次结构中比您要限制的配置文件级别高的任何配置文件中。location 元素可用来防止子配置文件的设置被更改。有关更多信息,请参见如何:锁定 ASP.NET 配置设置如何:使用位置设置配置特定目录

远程配置

默认情况下,远程配置功能处于禁用状态。当该功能启用时,用户将在 DCOM 级别进行身份验证,而且仅批准本地管理员读取或写入配置数据。有关更多信息,请参见 编辑 ASP.NET 远程配置文件

自定义的配置提供程序

无论当前用户使用的是什么安全标记,自定义的节处理程序代码都使用宿主进程帐户的凭据来运行。对于 Web 方案,这是 <服务器>\ASPNET 帐户(在 Windows 2000 和 Windows XP 上)、NETWORK SERVICE 帐户(在 Windows Server 2003 上)或显式配置的用户帐户。对于客户端方案,这是当前正在运行的进程的标识。

配置系统在调用自定义配置节处理程序之前设置权限,而且 .NET Framework 无论如何都不会信任该调用。该调用使用应用程序的信任权限来运行。ASP.NET 配置系统信任 %SystemRoot%\Microsoft.NET\Framework\版本\CONFIG 目录,但是它不信任位于层次结构中较低级别的目录。

自定义配置节处理程序应设置代码访问安全性 (CAS) 所需属性来获取权限。有关更多信息,请参见 ASP.NET 代码访问安全性代码访问安全性基础知识

保持配置文件上的文件锁定

只有在多次尝试保存到配置文件或者打开某个文件句柄时,才会锁定配置文件。恶意用户可能会尝试锁定 Machine.config 文件或根 Web.config 文件,但是这需要完全信任,而在 ASP.NET 中完全信任在默认情况下被禁用。

使用配置 API 读取任意文件

配置 API 的类不能读取不属于应用程序域的任何目录或者不具有 .config 文件扩展名的任何文件。

IIS 元数据库设置适用于 ASP.NET 请求

当 IIS 收到对某个 ASP.NET 应用程序的请求时,会将 IIS 元数据库设置应用于该 ASP.NET 应用程序,而不考虑该应用程序的 ASP.NET 配置设置。此约束会导致 ASP.NET 应用程序无法由用户访问或者具有较少的限制性安全设置。

例如,如果 IIS 元数据库中的安全设置配置为只允许已通过身份验证的用户访问站点,而 Web.config 文件中的安全设置配置为允许匿名访问该站点,则将拒绝匿名用户访问该站点。若要纠正此问题,需要在 IIS 管理器中将 Web 应用程序配置为允许匿名用户访问。

有关保护 IIS 功能的更多信息,请参见 Security in IIS 6.0(IIS 6.0 中的安全性)

错误信息和事件

接下来的几节讨论如何缓解由意外错误信息和事件公开的潜在安全风险。

异常

若要帮助防止向有害源公开敏感信息,可以对应用程序进行配置,使其不显示详细的错误信息,或者仅当客户端是 Web 服务器本身时才显示详细错误信息。有关更多信息,请参见 customErrors 元素(ASP.NET 设置架构)

事件日志

如果服务器运行的是 Windows Server 2003,则可以通过保证事件日志的安全性,以及设置有关事件日志的大小、保留时间和其他功能的参数,来帮助防止间接的拒绝服务攻击,从而提高应用程序的安全性。有关配置事件日志的更多信息,请在“Windows 帮助和支持”中搜索“事件查看器”。

运行状况监视

使用 ASP.NET 运行状况监视功能可记录成功和失败的登录尝试。在默认配置中,这意味着失败的登录尝试将导致在**“应用程序”**事件日志中记录用户名和其他诊断信息。请确保限制对事件日志的访问以帮助保密此信息。

请参见

概念

ASP.NET 运行状况监视概述

锁定配置设置

编辑 ASP.NET 远程配置文件

保证登录控件的安全

保护角色

保证成员资格的安全

保证数据访问的安全

其他资源

保证 ASP.NET 网站的安全

使用受保护的配置加密配置信息

使用受保护的配置加密配置信息