ASP.NET 配置提供对整个服务器、某个 ASP.NET 应用程序、或应用程序子目录中的单独页面进行配置的功能。你可以对 ASP.NET 的各种特征进行配置,如验证模式、页面缓存、编译器选项、自定义错误、调试和追踪选项,以及更多。该文章描述在配置本地或远程 ASP.NET 应用程序的时候如何通过最佳练习对配置特征的安全进行优化。
下例代码和配置练习可以帮助你改进应用程序的安全,同时你还需要为应用程序服务器持续保持最新的 Microsoft Windows 和 Internet 信息服务(IIS)安全更新,以及 Microsoft SQL Server 或其他成员资格数据源的任何更新。
关于如何编写安全代码和保护应用程序的最佳练习的详细信息,请参考 Michael Howard 和 David LeBlanc 共同编著的《编写安全代码》一书,以及 Microsoft Patterns and Practices 网站所提供的指导。
重要提示:ASP.NET 配置系统仅对 ASP.NET 资源和特征进行配置。使用 IIS 的配置特征可以配置非 ASP.NET 资源。更多关于 IIS 的配置信息,请参考“操作 IIS 元数据库”和“IIS 元数据库属性参考”。
配置文件的安全
下表列出了 Machine.config 文件和根 Web.config 文件中默认设置的访问控制列表(ACLs),这两个文件都位于 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG 目录下。这些访问控制列表(ACLs)同样被设置在目录本身之上,并为 Power Users 用户组提供了更改权限。还有,该目录是只读的。
Windows 帐号 | 权限 |
---|---|
管理员 |
完全控制 |
ASP.NET 机器帐号(<服务器>\ASPNET) |
读取和执行 |
IIS_WPG(<服务器>\IIS_WPG) |
读取和执行 |
LOCAL SERVICE |
读取和执行 |
NETWORK SERVICE |
读取和执行 |
Power Users (<服务器>\Power Users) |
更改 |
SYSTEM |
完整控制 |
Users (<服务器>\Users) |
读取和执行 |
下表列出了设置在 Web.config 文件和任何被列在 configSource
参数集中的文件上的访问控制列表(ACLs)。
Windows 帐号 | 权限 |
---|---|
管理员 |
完全控制 |
IIS_WPG(<服务器>\IIS_WPG) |
读取和执行 |
INTERACTIVE |
读取 |
Internet 来宾帐号(<服务器>\IUSR_<服务器>) |
读取 |
NETWORK |
读取 |
NETWORK SERVICE |
读取 |
SYSTEM |
完整控制 |
Users (<服务器>\Users) |
读取和执行 |
ASP.NET 网站管理工具帐号 |
专用 |
ASP.NET 配置系统尊重被设置在配置文件上的 ACLs,不管配置设定如何被编辑。
更改配置会引起应用程序的重启
对 Web.config 文件配置设定的更改会间接引起应用程序域空间被重启。这个行为通常发生在设计时。你可以有选择地使用 configSource
参数对扩展配置文件进行引用,这样就可以避免更改配置文件时应用程序会频繁地重启。
更改 Web.config 文件中的配置设定将会导致应用程序的重启,甚至如果锁定被高级别层次所使用的 location
元素时也是这样。某个恶意用户可能会使用这个行为尝试对你的网站进行破坏。因为这个原因,最好是使用严格的 ACLs 对 Web.config 文件的访问进行限制,如上述表格中的那些所列内容。
不具备文件的编辑权限而尝试对配置文件进行的更改不会导致应用程序域空间的重启。
保护配置的设定值
在应用程序的配置文件中保存有机密信息的时候,你应该使用被保护的配置对机密的设定值进行加密。重要机密信息包括 machineKey
元素中的加密关键字和 connectionStrings
元素中的数据库连接串。
共享托管环境的安全配置
在共享托管环境中,因为更改操作可以通过使用配置 API、以及其他管理员和配置工具等多种方式来完成,所以恶意用户有可能通过直接更改配置文件的方式对配置设定进行潜在的更改。因此,通过对应用程序的配置段进行锁定有助于防止配置不被恶意更改。你可以在 Machine.config 文件或任何一个需要限制的更高层次配置文件中添加 location
元素。location
元素用于防止来自子配置文件对设定的更改。
远程配置
远程配置默认时是被禁用的。在启用之后,用户会获得 DCOM 级别的授权并且只有本地管理员才能够被授权对配置数据进行读取或写入。
自定义配置提供者
除了当前用户的安全标识之外,自定义配置段处理器代码在运行时还使用了被信任的托管进程帐号。在 Web 环境下,指的是 Windows 2000 和 Windows XP 的 <服务器>\ASPNET 帐号,Windows Server 2003 中的 NETWORK SERVICE 帐号,或者其他被显式配置的用户帐号。在客户端环境下,则是指当前运行进程的标识符。
配置系统在调用自定义配置段处理器之前会对权限进行设置,不过这些调用过程并不被 .NET Framework 中的任何方式所信任。调用过程只能够在可信任权限的应用程序中才能够运行。不过,ASP.NET 配置系统信任 %SystemRoot%\Microsoft.NET\Framework\版本\CONFIG 目录,但并不信任位于更低层次中的目录。
自定义配置段处理器必须对代码访问安全(CAS)的需求参数进行设置来获取权限。
保持配置文件的锁定
只有在对同一个配置文件尝试多次保存或打开文件句柄时才可能需要对配置文件进行锁定。虽然可能有某个恶意用户会尝试对 Machine.config 文件或根 Web.config 文件进行锁定,但是需要完全信任才可以完成该操作,然而 ASP.NET 默认时已经对此进行了禁止。
使用配置 API 读取任意文件
配置 API 的成员类不能读取任何一个位于应用程序域空间之外的目录,或者任何一个扩展名不是 .config 的文件。
应用于 ASP.NET 请求的 IIS 元数据库设定
当 IIS 接收到 ASP.NET 应用程序的请求时,不管应用程序的配置设定是怎样,IIS 元数据库的设定都会应用于该 ASP.NET 应用程序。这个约束可以导致用户无法访问 ASP.NET 应用程序或者即使能够访问也只有相对较少的受限安全设定。
例如,如果 Web.config 文件被设置成允许对网站进行匿名访问,而 IIS 元数据库中的安全设定却被设置成只允许被授权用户访问网站的时候,那么匿名用户将仍然无法对网站进行访问。要避免这种情况的发生,你需要在 IIS 管理器中把 Web 应用程序配置成允许匿名用户的访问。
关于 IIS 安全特征的更多信息,请参考“保护 IIS 6.0”。
错误消息和事件
下面的部分讨论你应该如何减少暴露于未知错误消息和事件中的潜在安全风险。
异常
要防止在未知异常中出现被暴露的机密信息,请对你的应用程序进行配置,使其不为任何客户端显示详细的错误信息或者是仅在客户端是 Web 服务器本身的时候才显示详细的错误信息。
事件日志
如果你的服务器运行的是 Windows Server 2003,你可以通过对事件日志进行保护,并设定日志容量参数、保持时间、以及事件日志的其他特征来改进应用程序的安全性,从而防止间接的拒绝服务攻击。
健康状态监视
成功的和失败的登入尝试都会被 ASP.NET 的健康状态监视特征一一记录。在默认配置中,这意味着失败的登入尝试会把用户名和其他诊断信息记录到应用程序事件日志中。另外,你还需要确保已经对事件日志的访问进行限制以有保持日志信息的机密性。