打印本文 打印本文 关闭窗口 关闭窗口
确保 ASP.NET 应用程序和 Web Services 的安全
作者:武汉SEO闵涛  文章来源:敏韬网  点击数5004  更新时间:2009/4/23 10:47:44  文章录入:mintao  责任编辑:mintao
L="true"。这将设置 Cookie 中的 Secure 属性,该属性可确保不通过 HTTP 链接将 Cookie 从浏览器传送到服务器。要求使用 HTTPS (SSL)。

注意 这是 .NET Framework 1.1 的设置。它采用明确的编程,在基于 1.0 版本构建的应用程序中设置 Cookie 的 Secure 属性。有关详细信息和示例代码,请参阅模块 10 生成安全的 ASP.NET 网页和控件。

如果不使用 SSL,请设置 slidingExpiration = "false"

通过将 slidingExpiration 设置为 false,可以将 Cookie 的超时期限固定为自初始创建 Cookie 之后的某段时间(以分钟表示)。否则,应该针对每个 Web 服务器请求更新超时时间。如果 Cookie 被捕获,它将为攻击者提供足够的时间,使其作为已通过身份验证的用户来访问您的应用程序。

注意 在 .NET Framework 1.1 中提供了此项功能。

不要在生产服务器上使用 <credentials> 元素

可以在 XML 配置文件中存储用户凭据,以支持快速开发和有限测试。请不要使用实际的最终用户凭据。最终用户凭据不应存储在生产服务器上的配置文件中。生产应用程序应该实现自定义用户凭据存储,例如,在 SQL Server 数据库中。

配置 MachineKey

<machineKey> 元素定义了用于加密表单身份验证 Cookie 的加密算法。此元素也可用于维护加密密钥。有关详细信息,请参阅本模块的计算机密钥部分。

使用唯一的 Cookie 名称和路径

唯一的 name 和 path 属性值。确保名称具有唯一性,可以防止在同一服务器上驻留多个应用程序时出现问题。

返回页首返回页首

授权

除非用户具有明确的资源访问权限,如特殊的网页、资源文件、目录等,否则配置在默认情况下应该拒绝访问。ASP.NET 提供了两个可配置的网关守卫,可用来控制对受限制资源的访问。分别为:

文件授权。此网关守卫由 ASP.NET
FileAuthorizationModule HTTP 模块实现。

URL 授权。此网关守卫由 ASP.NET
UrlAuthorizationModule HTTP 模块实现。

文件授权

只有使用 Windows 身份验证并具有以下配置的应用程序才可以使用此网关守卫:

<authentication mode="Windows"/>   

使用 Windows 身份验证时,此网关守卫会自动有效,而无需进行模拟。要配置网关守卫,请在文件和文件夹上配置 Windows ACL。请注意,网关守卫只控制对由 IIS 映射到以下 ASP.NET ISAPI 扩展的文件类型的访问:Aspnet_isapi.dll。

URL 授权

任何应用程序都可使用此网关守卫。它是使用 <authorization> 元素进行配置的,这些元素可以控制哪些用户和用户组有权访问应用程序。Machine.config 中的默认元素如下所示:

<authorization>   
<!-- 允许/拒绝属性: 
users="[*|?|name]" 
* - All users 
? - Anonymous users 
[name] - Named user 
roles="[name]" --> 
<allow users="*"/> 
</authorization>    

URL 授权说明

以下说明有助于您成功配置 URL 授权:

Web.config 中的授权设置通常应用于当前目录及其所有子目录中的所有文件,除非子目录中包含其自身的具有 <authorization> 元素的 Web.config。在这种情况下,子目录中的设置会覆盖父目录的设置。

URL 授权仅应用于由 IIS 映射到 ASP.NET ISAPI 扩展的文件类型:Aspnet_isapi.dll。

当应用程序使用 Windows 身份验证时,则为 Windows 用户和组帐户授予访问权限。用户名采取“authority\WindowsUserName”的格式,而角色名采取“authority\WindowsGroupName”的格式,此处的“authority”可以是域名或本机名,具体取决于帐户类型。

许多人们熟知的帐户都以“BUILTIN”字符串表示。例如,本地管理员组表示为“BUILTIN\Administrators”。本地用户组表示为“BUILTIN\Users”。

注意 对于 .NET Framework 1.0,机构名和组名是区分大小写的。组名必须与出现在 Windows 中的组名完全匹配。

当应用程序使用表单身份验证时,则为在自定义用户存储中维护的自定义用户和角色授权。例如,如果使用表单对访问数据库的用户进行身份验证,则根据从数据库中检索的角色进行授权。

可以使用 <location> 标记将授权设置应用于单个文件或目录。以下示例显示如何将授权应用于特定文件 (page.aspx):

<location path="page.aspx" /> 
<authorization>   
<allow users="DomainName\Bob, DomainName\Mary" /> 
<deny users="*" /> 
</authorization>    
</location>         
返回页首返回页首

会话状态

依赖于每个用户会话状态的应用程序可以在下列位置存储会话状态:

在 ASP.NET 工作进程中

在进程外状态服务(可以在 Web 服务器或远程服务器上运行)中

在 SQL Server 数据存储中

<sessionState>

相关位置与连接详细信息一起存储在 Machine.config 的 <sessionState> 元素中。默认设置如下:

<sessionState mode="InProc" 
stateConnectionString="tcpip=127.0.0.1:42424"  
stateNetworkTimeout="10" sqlConnectionString="data  
source=127.0.0.1;Integrated Security=SSPI"  
cookieless="false" timeout="20"/> 

注意 如果不在 Web 服务器上使用 ASP.NET 状态服务,可以使用 MMC 服务管理单元来禁用该服务。

确保 SQL Server 会话状态存储区的安全

如果使用 SQL Server 会话状态存储,以下建议有助于确保会话状态的安全:

对数据库使用 Windows 身份验证

加密 sqlConnectionString

限制数据库中的应用程序登录

确保通道安全

有关设置 SQL Server 会话状态存储数据库的详细信息,请参阅 Microsoft 知识库文章 311209 How To:Configure ASP.NET for Persistent SQL Server Session State Management(英文)。

对数据库使用 Windows 身份验证

如果使用 mode="SQLServer",可使用 Windows 身份验证连接到状态数据库,并使用最小特权帐户,如本地 ASPNET 帐户的副本。这意味着您可以使用受信任连接,而不必在连接字符串中提供凭据,因此凭据不会通过网络传送到数据库。

加密 sqlConnectionString

可以使用 Aspnet_setreg.exe 工具加密 sqlConnectionString 属性值。如果使用 SQL 身份验证连接到状态数据库,这一点尤其重要,因为凭据在连接字符串中,但在使用 Windows 身份验证时同样建议使用上述加密。

加密 sqlConnectionString

1.

从命令提示符处运行以下命令。

aspnet_setreg -k:Software\YourApp\sessionState -c:{your connection string} 

此命令会将加密的连接字符串存储在指定的注册表项中,并通过受限制的 ACL 来确保注册表项的安全,该 ACL 为 System、Administrators 和 Creator Owner 授予完全控制的权限。

2.

重新配置 <sessionState> 元素,并添加下面的 sqlConnectionString 属性。

sessionState mode="SQLServer" 
sqlConnectionString="registry:HKLM\SOFTWARE\YourApp\sessionState
\ASPNET_SETREG,sqlConnectionString" /> 

3.

使用 Regedt32.exe 在上述注册表项上创建 ACL,为 ASP.NET 进程帐户授予读取权限。

限制数据库中的应用程序登录

应该对数据库中的应用程序登录进行限制,以使应用程序只能访问所需的状态表和 ASP.NET 用于查询数据库的存储过程。

限制状态数据库中的应用程序登录

1.

使用运行 ASP.NET 应用程序的帐户的同一名称和强密码在状态数据库服务器上创建重复的本地帐户副本。

有关使用 ASPNET 帐户访问远程数据库的详细信息,请参阅本模块后面的数据访问

2.

在数据库服务器上创建本地 Windows 组(如 ASPNETWebApps),并将本地 ASPNET 帐户添加到该组。

3.

通过新建登录为 Windows 组授予对 SQL Server 的访问权限。

sp_grantlogin ''''MACHINE\ASPNETWebApps'''' 

注意 使用数据库服务器的名称替换 MACHINE。

4.

授予对 ASPState 数据库的 SQL 登录访问权限。下面的 T-SQL 将创建一个名为 WebAppUser 的数据库用户,并使登录与之关联。

USE ASPState  
GO
sp_grantdbaccess ''''MACHINE\ASPNETWebApps'''', ''''WebAppUser'''' 

5.

创建用户定义的数据库角色。

USE ASPState 
GO
sp_addrole ''''WebAppUserRole''''

6.

将数据库用户添加到新的数据库角色。

USE ASPState  
GO
sp_addrolemember ''''WebAppUserRole'''', ''''WebAppUser''''

7.

在数据库中为数据库角色配置权限。为随 ASPState 数据库提供的存储过程授予执行权限。

grant execute on CreateTempTables to WebAppUserRole

对随 ASPState 数据库提供的所有存储过程重复此命令。使用 SQL Server 企业管理器查看完整列表。

确保通道安全

要保护通过网络在 Web 服务器和远程状态存储之间传输的敏感会话状态,应使用 IPSec 或 SSL 确保到两个服务器的通道的安全。这为整个网络间的会话状态数据提供了私密性和完整性。如果使用 SSL,必须在数据库服务器上安装服务器证书。有关在 SQL Server 上使用 SSL 的详细信息,请参阅模块 18 保证数据库服务器的安全。

确保进程外状态服务的安全

如果使用 mode=StateServer,以下建议有助于确保会话状态的安全:

使用最小特权帐户运行状态服务

确保通道安全

考虑更改默认端口

加密状态连接字符串

使用最小特权帐户运行状态服务

默认情况下将使用 ASPNET 本地最小特权帐户运行状态服务。无需更改此配置。

确保通道安全

如果状态服务位于远程服务器上,应使用 IPSec 确保到远程状态存储的通道的安全,以确保用户状态保持私密性,并且不会被修改。

考虑更改默认端口

ASP.NET 状态服务在端口 42424 上侦听。为了避免使用此众所周知的默认端口,可以通过编辑以下注册表项来更改端口:

HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 

端口号由名为 Port 的值定义。如果更改了注册表中的端口号,例如,改为 45678,必须同时更改 <sessionState> 元素中的连接字符串,如下所示:

stateConnectionString="tcpip=127.0.0.1:45678" 

对 stateConnectionString 进行加密

可以对 stateConnectionString 属性值进行加密,以隐藏状态存储的 IP 地址和端口号。使用 Aspnet_setreg.exe 工具。

对 stateConnectionString 进行加密

1.

从命令提示符处运行以下命令。

aspnet_setreg -k:Software\YourApp\sessionState -d:{连接字符串}

此命令会将加密的连接字符串存储在指定的注册表项中,并通过受限制的 ACL 来确保注册表项的安全,该 ACL 为 System、Administrators 和 Creator Owner 授予完全控制的权限。

2.

重新配置 <sessionState> 元素,并添加以下 stateConnectionString 属性:

<sessionState mode="StateServer"
sqlConnectionString="registry:HKLM\SOFTWARE\YourApp\sessionState
\ASPNET_SETREG,sqlConnectionString" ... />

3.

使用 Regedt32.exe 在上述注册表项上创建 ACL,为 ASP.NET 进程帐户授予读取权限。

返回页首返回页首

视图状态

如果应用程序使用视图状态,一定要使用消息验证代码 (MAC) 提供保护,以确保不会在客户端上修改该视图状态。可以使用 Machine.config 中的 <pages> 元素,为计算机上的所有应用程序启用或禁用视图状态和 MAC 保护。

<pages>

默认情况下, Machine.config 中的 <pages> 元素上的 enableViewStateMac 属性可以确保通过 MAC 保护视图状态。

<pages buffer="true" enableSessionState="true"
enableViewState="true" enableViewStateMac="true" 
autoEventWireup="true" validateRequest="true"/>

如果使用视图状态,应确保将 enableViewStateMac 设置为 true。<machineKey> 元素定义保护视图状态所使用的算法。

返回页首返回页首

计算机密钥

<machineKey> 元素用于指定保护表单身份验证 Cookie 和页面级视图状态所使用的加密密钥、验证密钥和算法。以下代码示例显示了 Machine.config 中的默认设置:

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

在配置 <machineKey> 时应考虑以下建议:

对多个应用程序使用唯一的加密密钥

设置 validation="SHA1"

手动为 Web 场生成密钥

对多个应用程序使用唯一的加密密钥

如果在一个 Web 服务器上驻留多个应用程序,应该对计算机上的每个应用程序使用唯一的密钥,而不是对所有应用程序使用一个密钥。这样可以避免在驻留环境中,一个应用程序可以欺骗视图状态或加密的表单身份验证 Cookie。

还应使用 IsolateApps 设置。这是 .NET Framework 1.1 中的新设置,用于指示 ASP.NET 自动生成加密密钥,并使每个应用程序的密钥是唯一的。

设置 validation="SHA1"

validation 属性指定页面级视图状态的完整性检查所使用的算法。可能的值为“SHA1”、“MD5”和“3DES”。

如果在 <forms> 元素上使用了 protection="All",将对表单身份验证 Cookie 进行加密,同时还可以确保完整性。无论 validation 属性如何设置,表单身份验证均使用 TripleD

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页

打印本文 打印本文 关闭窗口 关闭窗口