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

检查表:保护 ASP.NET 的安全

2012年04月10日 ⁄ 综合 ⁄ 共 6285字 ⁄ 字号 评论关闭
文章目录

检查表:保护 ASP.NET 的安全

更新日期: 2004年04月12日
本页内容
如何使用此检查表
如何使用此检查表
设计注意事项
设计注意事项
应用程序类别注意事项 应用程序类别注意事项
配置文件设置 配置文件设置

如何使用此检查表

该检查表是模块 10 构建安全的 ASP.NET 网页和控件、模块 19 保护 ASP.NET 应用程序和 Web 服务的安全以及模块 20 驻留多个 Web 应用程序的配套指南。该检查表可以帮助保护 ASP.NET 应用程序的安全,还可以作为相应模块的快照。

设计注意事项

检查 说明

安全决策不应依赖于客户端验证,而应在服务器端进行。

将网站划分为公共访问区域和需要身份验证访问的受限制区域。这些区域之间的导航不应传递敏感的凭据信息。

应明确区分用于从 ASP.NET Web 应用程序访问远程资源的标识。

已经确定了要采用哪些机制来保护在网络上和持久性存储区中的凭据、身份验证票证以及其他敏感信息。

标识用于例外管理的安全方法。如果出现例外,应用程序会安全地失败。

网站为网页和目录提供了精确的授权检查。

将 Web 控件、用户控件和资源访问代码按照各自的集合进行划分,以获得精确的安全性。

应用程序类别注意事项

输入验证

检查 说明

应对用户输入的类型、长度、格式和范围进行验证。检查输入时,先检查已知、有效和安全的数据,然后检查恶意、危险的数据。

使用正则表达式来验证字符串表单域的输入,例如使用 RegularExpressionValidator 控件。

对于常规的 HTML 控件、查询字符串、cookie 以及其他形式的输入,可以使用 Regex 类和/或自定义验证代码来验证。

RequiredFieldValidator 控件用于必须输入数据的场合。

服务器控件中的范围检查是由 RangeValidator 控件来检查。

净化自由格式的输入以便除去恶意数据。

输入文件名的格式应是正确的,并且在应用程序上下文中经过验证是有效的。

使用 HtmlEncode 和 UrlEncode 对包含输入的输出进行编码。

在适当情况下,使用 MapPath 限制跨应用程序的映射。

字符编码应由服务器设置(建议设置为 ISO-8859-1)。

启用 ASP.NET 版本 1.1 的 validateRequest 选项。

在 Web 服务器上安装 URLScan。

对于深层防御,使用 HttpOnly cookie 选项,以便帮助防止 cross-site 脚本。(应用于 Internet Explorer 6.1 或以上版本。)

在数据访问代码中使用 SQL 参数来验证数据的长度和类型,并帮助防止 SQL injection。

身份验证

检查 说明

将站点划分为受限制区域和公共区域。

将站点划分为安全和不安全文件夹时,应使用绝对 URL 进行导航。

使用安全套接字层 (SSL) 来保护凭据和身份验证 cookie。

如果没有使用 SSL 对 cookie 进行保护,则将 slidingExpiration 属性设置为“false”,并使用有限的身份验证 cookie 超时。

通过使用 requireSSL 属性或 Secure cookie 属性,将表单身份验证 cookie 限制在 HTTPS 连接中。

加密身份验证 cookie,并检查其完整性 (protection="All")。

身份验证 cookie 不是持久的。

应用程序 cookie 有唯一的路径/名称组合。

个人化 cookie 应与身份验证 cookie 分开。

不应将密码直接存储在用户存储区,而是存储在带有 salt 的密码摘要中。

通过使用 Aspnet_setreg.exe,在配置文件中加密模拟凭据(如果使用固定标识)。

实施强密码策略来进行身份验证。

不应在 <forms> 元素中使用 <credentials> 元素进行表单身份验证,而应当仅用它进行测试。

授权

检查 说明

使用 URL 授权对网页和目录进行访问控制。

与 Windows 身份验证一起使用文件授权。

使用主要权限需求来保护对类和成员的访问。

如果需要精确的授权,则使用明确的角色检查。

配置管理

检查 说明

通过使用 HttpForbiddenHandler 来阻止对配置文件的检索。

使用最低权限的帐户运行 ASP.NET。

通过使用 Aspnet_setreg.exe,在 <processModel> 元素上对自定义帐户凭据(如果使用)进行加密。

要强制实施计算机范围的策略,可以通过使用 Machine.config 中的 allowOveride="false",来锁定 Web.config 的设置。

敏感数据

检查 说明

使用 SSL 保护网络上的敏感数据。

不应在网页间传递敏感数据,而是使用服务器端的状态管理来维护。

不应将敏感数据存储在 cookie、隐藏的表单域或查询字符串中。

关闭包含敏感数据的网页的输出缓存。

避免在 Web.config 和 Machine.config 文件中使用明文密码。(使用 Aspnet_setreg.exe 来加密凭据。)

会话管理

检查 说明

使用 SSL 保护需要身份验证访问的所有网页上的会话 cookie。

如果不使用,应禁用会话状态服务。

如果使用会话状态服务,应使用最低权限的帐户运行该服务。

使用 Windows 身份验证连接到 Microsoft® SQL Server™ 状态数据库。

限制对 SQL Server 中的状态数据的访问。

使用 Aspnet_setreg.exe 对连接字符串进行加密。

对通向状态存储区的通讯通道进行加密(IPSec 或 SSL)。

参数操纵

检查 说明

使用消息验证代码 (MAC) 来保护查看状态。

对带有服务器机密的查询字符串进行哈希运算。

验证所有输入参数。

使用 Page.ViewStateUserKey 来防范 One-click 攻击。

例外管理

检查 说明

使用结构化的例外处理。

在服务器上记录例外详细信息。

将无有害消息的一般错误页面返回客户端。

执行页面级别或应用程序级别的错误处理程序。

应用程序应区别错误和例外条件。

审核与日志记录

检查 说明

配置 ASP.NET 进程,以便允许在运行时新建事件源,或在安装时创建应用程序事件源。

配置文件设置

检查 说明

<trace/>
在生产服务器上禁用跟踪。

<trace enabled="false"> 

<globalization>
正确配置请求和响应编码。

<httpRuntime>
配置 maxRequestLength 以防止用户上载非常大的文件(可选)。

<compilation>
通过设置 debug="false",在生产服务器上
禁用调试编译。

<compilation debug="false" . . ./> . ./>

<pages>
如果应用程序不使用查看状态,应将 enableViewState 设置为 "false"。

<pages enableViewState="false" . . ./> . ./>

如果应用程序使用查看状态,应将 enableViewState 设置为 "true",并将 enableViewStateMac 设置为 "true",以便检测查看状态的篡改。

<pages enableViewState="true" enableViewStateMac="true" /> 

<customErrors>
将自定义的错误页返回客户端,并通过设置 mode="On",防止返回例外详细信息。

<customErrors mode="On" /> 

由 defaultRedirect 属性来指定一般的错误页。

<customErrors mode="On" defaultRedirect="/apperrorpage.htm" /> 

<authentication>
正确配置身份验证模式,以满足应用程序的要求。要强制使用特定的身份验证类型, 可以使用带有 allowOverride="false" 的 <location> 元素。

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

<forms>
对网站进行划分,以便进行公共的和受限制的访问。
通过以下设置,表单身份验证配置是安全的:

<forms loginUrl="Restricted\login.aspx"  
protection="All"        
requireSSL="true"        
timeout="10"        
name="AppNameCookie"        
path="/FormsAuth"        
slidingExpiration="true" /> 

对身份验证 cookie 进行加密,并检查其完整性 (protection)。
身份验证 cookie 需要 SSL (requireSSL)。
如果不使用 SSL,则应将滑动期限设置为 false (slidingExpiration)。
会话生存时间受到限制 (timeout)。
Cookie 的名称和路径是唯一的(name 和path)。
没有使用 <credentials> 元素。

<identity>
如果使用模拟标识,可以通过使用 Aspnet_setreg.exe 在注册表中对其进行加密:

<identity impersonate="true"           
userName="registry:HKLM\SOFTWARE\YourApp\ 
identity\ASPNET_SETREG,userName"           
password="registry:HKLM\SOFTWARE\YourApp\ 
identity\ASPNET_SETREG,password"/> 

<authorization>
验证角色名称的格式是否正确。

<machineKey>
如果在同一个 Web 服务器上部署多个 ASP.NET Web 应用程序,应使用“IsolateApps”设置,以确保为每个 Web 应用程序生成单独的密钥。

<machineKey validationKey="AutoGenerate,IsolateApps" 
decryptionKey="AutoGenerate,IsolateApps"       
validation="SHA1" /> 

如果ASP.NET Web 应用程序运行在 Web 场中,则需要特定的计算机密钥,并且这些密钥是通过 Web 场中所有服务器来复制的。
如果启用查看状态,则应将 validation 属性设置为 "SHA1"。
如果对应用程序的表单身份验证 cookie 进行加密,则应将 validation 属性设置为 "3DES"。

<sessionState>
如果 mode="StateServer",则凭据是以加密的形式(通过使用 Aspnet_setreg.exe)存储在注册表中。
如果 mode="SQLServer",则使用 Windows 身份验证连接到状态存储数据库,并且凭据是以加密的形式(通过使用 Aspnet_setreg.exe)存储在注册表中。

<httpHandlers>
将不用的文件类型映射到 HttpForbiddenHandler,以防止通过 HTTP 检索文件。例如:

<add verb="*" path="*.rem"             
type="System.Web.HttpForbiddenHandler"/>  

<processModel>
使用最低权限的帐户,如 ASPNET,来运行 ASP.NET 进程。

<processModel userName="Machine" password="AutoGenerate" 

不应使用系统帐户运行 ASP.NET 进程。
不应将“作为操作系统的一部分”特权授予此进程帐户。

<processModel   
userName="registry:HKLM\SOFTWARE\MY_SECURE_APP\   
processmodel\ASPNET_SETREG,userName"   
password="registry:HKLM\SOFTWARE\MY_SECURE_APP\   
processmodel\ASPNET_SETREG,password" . . ./> . ./>

如果应用程序使用企业服务,则应正确配置 comAuthenticationLevel 和 comImpersonationLevel。
将调用级别的身份验证设置为最低,以确保远程应用程序可以对所有方法调用进行身份验证。
如果没有基础结构通道安全 (IPSec),应使用 PktPrivacy 对网络上的数据进行加密并防止篡改。
使用 PktIntegrity 可以在不加密的情况下防止篡改(拥有网络监视器的偷听者可以查看您的数据)。

<webServices>
禁用不使用的协议。
禁用“自动生成 Web 服务描述语言 (WSDL)”(可选)。

Web 场注意事项

检查 说明

会话状态为了避免服务器的相似性,应在进程外维护 ASP.NET 会话状态,如在 ASP.NET SQL Server 的状态数据库,或运行在远程计算机上的进程外状态服务中。

加密和验证用于加密和验证表单身份验证的密钥

DPAPI DPAPI 不能与计算机密钥一起用于对农场中所有服务器都需要访问的公共数据进行加密。要对远程服务器上的共享数据进行加密,应使用另外的方案,如 3DES。

驻留多个应用程序

检查 说明

应用程序有独特的计算机密钥。
在 <machineKey> 上使用 IsolateApps 或使用每个应用程序的 <machineKey> 元素。

<machineKey validationKey="AutoGenerate,IsolateApps"  
decryptionKey="AutoGenerate,IsolateApps" . . . /> . . />

启用每个应用程序的表单身份验证 cookie 的唯一路径/名称组合。

在 Microsoft Windows® Server 2003 上使用多个进程(IIS 6.0 应用程序池)进行应用程序隔离。

在 Windows 2000 上使用多个匿名用户帐户(和模拟)进行应用程序隔离。

在 Web 农场中的所有服务器上启用公共计算机密钥。

如果在单个服务器上驻留多个应用程序,则每个应用程序都使用单独的计算机密钥。

使用代码访问安全信任级别进行进程隔离,并限制对系统资源的访问(需要 .NET Framework 版本 1.1)。

ACL 和权限

检查 说明

临时的 ASP.NET 文件

%windir%\Microsoft.NET\Framework\{version}Temporary ASP.NET Files

ASP.NET 进程帐户和模拟标识:完全控制

临时目录

(%temp%) 

ASP.NET 进程帐户:完全控制

.NET Framework 目录

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

ASP.NET 进程帐户和模拟标识:
读取和执行
文件夹内容

.NET Framework 配置目录

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

ASP.NET 进程帐户和模拟标识:
读取和执行
列出文件夹内容
读取

网站根目录

C:\inetpub\wwwroot 

或默认网站指向的路径
ASP.NET 进程帐户:完全控制

系统根目录

%windir%\system32 

ASP.NET 进程帐户:读取

全局程序集缓存

%windir%\assembly 

进程帐户和模拟标识:读取

内容目录

C:\inetpub\wwwroot\YourWebApp 

进程帐户:
读取和执行
列出文件夹内容
读取
注意:在 .NET Framework 版本 1.0 中,从内容目录到文件系统根目录的所有父目录也都需要以上权限。这些父目录包括:

C:\ 
C:\inetpub\ 
C:\inetpub\wwwroot\ 

应用程序的 Bin 目录

检查 说明

配置 IIS Web 权限。
Bin 目录没有读取、写入或目录浏览权限。
将执行权限设置为 None。

删除身份验证设置,因而拒绝所有访问。


抱歉!评论已关闭.