摘自MSDN:
新日期: 2004年04月20日
本页内容目标
本章的目标是:
• | 创建能够正确运行 ASP.NET 应用程序的权限最少的帐户。
|
• | 将 ASP.NET 配置为使用自定义的最少权限帐户来运行。
|
返回页首适用范围
本章适用于以下产品和技术:
• | Microsoft® Windows® XP 或 Windows 2000 Server (Service Pack 3) 以及更高版本的操作系统
|
• | Microsoft .NET Framework 版本 1.0 (Service Pack 2) 以及更高版本
|
• | Internet 信息服务 (IIS) 5.0 或 6.0(仅限使用 IIS 5.0 隔离模式时)
|
返回页首如何使用本章内容
若要学好本章内容:
• | 您必须具有开发 ASP.NET Web 应用程序的经验,熟悉 machine.config 文件的用途和结构。
|
• | 您必须具有使用 Windows 管理工具来创建和管理独立的或基于域的 Windows 用户帐户的经验。
|
• | 阅读第 8 章 ASP.NET 安全性。此章为您提供了有关以下内容的详细信息:ASP.NET 安全性如何工作、ASP.NET 辅助进程标识对执行应用程序的权限有什么影响、如何使用模拟向 Web 应用程序的用户轻松授予适当级别的权限。
|
返回页首摘要
默认情况下,每个 ASP.NET 辅助进程都在名为 ASPNET 的最少权限帐户的上下文中运行。如果您的 ASP.NET 应用程序部署在基于域的服务器上或者需要访问远程服务器上的资源,则可以将 ASP.NET 配置为在另一个帐户的上下文中运行来简化管理。
本章说明如何配置 ASP.NET 以在自定义本地帐户或域帐户的上下文中运行,以及您为了使此帐户正确工作而必须为它分配的权限。
返回页首您必须了解的背景知识
在开始学习本章之前,您应该知道:
ASP.NET 辅助进程标识
在安装时为运行 ASP.NET 而创建的默认帐户是最少权限本地帐户,并且在 machine.config 中指定,如下所示:
<processModel enable="true" userName="machine" password="AutoGenerate" />
该帐户在“本地用户和组”下标识为 ASPNET,并且在本地系统机构 (LSA) 中使用强密码保护。
当需要使用 ASP.NET 进程标识来访问网络资源(如数据库)时,您可以执行下列操作之一:
• | 使用域帐户。
|
• | 使用“镜像的”本地帐户(即,在两台计算机上具有相匹配的用户名和密码的帐户)。在以下情况下需要使用这种方法:计算机位于单独的域中,并且域之间没有建立信任关系;或者计算机被防火墙隔开,并且您无法打开进行 NTLM 或 Kerberos 身份验证所需的端口。
最简单的方法是,在 Web 服务器上将 ASPNET 帐户的密码更改为已知值,然后在目标计算机上创建名为 ASPNET 且具有相同密码的帐户。在 Web 服务器上,必须先在“本地用户和组”中更改 ASPNET 帐户密码,然后替换由 machine.config 中的 <processModel> 元素指定的凭据。您不应该在 machine.config 中存储明文密码,而应该使用 aspnet_setreg.exe 在注册表中存储加密的密码。有关详细信息,请参见第 8 章“ASP.NET 安全性”。
<processModel enable="true"
userName="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
ASPNET_SETREG,userName"
password="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
ASPNET_SETREG,password" . . ./> 您可以使用本章中介绍的步骤来创建具有最少权限的本地帐户。
|
模拟固定标识
您可以通过在 web.config 中使用以下设置来为特定虚拟目录设置固定标识。使用 aspnet_setreg.exe 在注册表中存储加密的凭据。
<identity impersonate="true"
userName="registry:HKLM\SOFTWARE\YourSecureApp\
identity\ASPNET_SETREG,userName"
password="registry:HKLM\SOFTWARE\YourSecureApp\
identity\ASPNET_SETREG,password" />
这种方法通常用于以下情况:同一个 Web 服务器上有多个 Web 站点,并且需要以不同的标识来运行;例如,在应用程序托管方案中。
本章介绍如何创建具有最少权限的本地帐户。如果您主要关心管理问题,可以使用具有最少权限的限定域帐户和强密码。
考虑用于运行 ASP.NET 的帐户时,请切记以下事项:
• | 默认情况下,ASP.NET 不进行模拟。因此,Web 应用程序进行的任何资源访问均使用 ASP.NET 进程标识。在这种情况下,Windows 资源必须拥有一个访问控制列表 (ACL),它可授予对 ASP.NET 进程帐户的访问权限。
|
• | 如果启用模拟,则应用程序使用原始调用者的安全性上下文来访问资源;如果已针对匿名身份验证配置了 IIS,则应用程序也可以使用匿名 Internet 用户帐户(默认为 IUSR_MACHINE)来访问资源。在这种情况下,资源必须具有基于原始调用者标识(或 IUSR_MACHINE)的 ACL。
|
• | 在创建自定义帐户时始终坚持分配最少权限的原则,即只分配一组必需的权限。
|
• | 避免使用 SYSTEM 帐户运行 ASP.NET。
|
• | 避免向帐户授予“作为操作系统的一部分”的权限。
|
返回页首创建一个新的本地帐户
此过程可创建一个新的本地帐户。默认情况下,它将添加到本地“用户”组中。
• | 创建一个新的本地帐户
1.
| 创建一个本地帐户(例如,“CustomASPNET”)。 确保对该帐户使用强密码。强密码应至少包括 7 个字符并混合使用大小写字母、数字和其他字符,如 *、? 或 $。
| 2.
| 取消选中“用户下次登录时须更改密码”选项。
| 3.
| 选中“密码永不过期”选项。
|
|
返回页首分配最少的权限
此过程可分配运行 ASP.NET 所需的一组最低限度的权限。
• | 分配最少的权限
1.
| 从“管理工具”程序组启动“本地安全策略”工具。
| 2.
| 展开“本地策略”,然后选择“用户权限分配”。 右窗格中将显示出权限列表。
| 3.
| 为新帐户分配以下权限:
• | 从网络访问此计算机
| • | 以批处理作业登录
| • | 以服务登录
| • | 拒绝本地登录
| • | 通过终端服务拒绝登录
| 注意:要为某个帐户分配权限,请双击该权限,然后单击“添加”来选择所需的帐户。
| 4.
| 关闭该工具。
|
|
返回页首分配 NTFS 权限
此过程向自定义 ASP.NET 帐户授予在本地文件系统中所需的 NTFS 权限。
注意:此过程中的步骤适用于 Web 服务器上的文件系统,但不适用于远程计算机(可以在其中复制帐户以用于网络身份验证)上的文件系统。
• | 分配 NTFS 权限
1.
| 启动 Windows 资源管理器,然后为表 1 中指定的文件夹分配适当权限。
表 1 中列出的固定模拟帐户是指可以选择在 web.config 中使用 <identity> 元素配置的帐户,如下所示。
<identity impersonate="true"
userName="registry:HKLM\SOFTWARE\YourSecureApp\
identity\ASPNET_SETREG,userName"
password="registry:HKLM\SOFTWARE\YourSecureApp\
identity\ASPNET_SETREG,password" /> 在此示例中,aspnet_setreg.exe 已用于在注册表中以加密格式存储自定义帐户凭据。
表 1:所需的 NTFS 权限
| 位置 | 所需的权限 | 帐户 | 注释 | 临时 ASP.NET 文件: C:\WINNT\Microsoft.NET\ Framework\<version>\ 临时 ASP.NET 文件
| 完全控制
| 进程帐户和固定模拟帐户
| 这是 ASP.NET 动态编译 位置。可在单独的目录中 为此文件夹下的 每个应用程序生成应用程序代码。 可以使用 <compilation> 元素的 tempdir 属性 来更改此 默认位置。
| 临时文件夹: C:\WINNT\temp
| 读取/写入/删除
| 进程
| Web 服务 用于生成 串行化代理的位置。 注意,“删除” 权限是使用 Windows 资源管理器 “文件夹属性” 对话框的“安全”页上的 “高级”按钮设置的。
| 应用程序虚拟目录: C:\inetpub\wwwroot\webapp1
| 读取
| 进程
| Web 应用程序文件 的位置(即 应用程序的虚拟根 目录。 默认情况下,“用户”组 拥有适当的访问 权限。
| 安装 (%installroot) 层次结构:
(C:\WINNT\Microsoft.Net\ Framework\v1.0.3705)
| 读取
| 进程帐户和固定模拟帐户
| ASP.NET 必须能 访问 .NET Framework 程序集。 默认情况下,“用户”组 拥有适当的访问 权限。
| 全局程序集缓存: C:\WINNT\assembly
| 读取
| 进程帐户和固定模拟帐户
| 这是全局程序集 缓存。不能直接 使用 Windows 资源管理器来 编辑此文件夹的 ACL。 而应使用命令 窗口并运行 以下命令: cacls %windir%\assembly /e /t /p domain\useraccount:R 或者,在使用 Windows 资源管理器之前, 使用以下命令 注销 shfusion.dll: regsvr32 -u shfusion.dll 在使用 Windows 资源管理器 设置权限后, 使用以下命令 重新注册 shfusion.dll: regsvr32 shfusion.dll
| Web 站点根目录: C:\inetpub\ wwwroot 或默认 Web 站点 指向的路径
| 读取
| 进程
| ASP.NET 读取配置文件并监视此文件夹中的文件更改情况。
| 系统根目录: C:\WINNT\system32
| 读取
| 进程
| 用于 Framework 加载的系统 DLL。
| 应用程序文件夹层次结构 C: \C:\inetpub\ C:\inetpub\wwwroot\ C:\inetpub\wwwroot\ mywebapp1
| 列出文件夹/读取
| 进程
| 对于文件更改通知和 C# 编译器(出于文件规范化方面的原因),该进程帐户需要对应用程序文件夹层次结构具有列出文件夹和读取数据的权限。该层次结构指一直通向根目录的所有父文件夹。
|
|
|
返回页首将 ASP.NET 配置为使用新帐户运行
此过程编辑 machine.config,以便将 ASP.NET 配置为使用新帐户运行。
• | 将 ASP.NET 配置为使用新帐户运行
1.
| 在命令提示符处运行 aspnet_setreg.exe,向注册表添加自定义帐户的用户名和密码的加密版本。有关此实用程序的详细信息和下载链接,请参见 Microsoft 知识库文章 329290“HOWTO: Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings”(HOW TO:使用 ASP.NET 工具加密凭据和会话状态连接字符串):http://support.microsoft.com/default.aspx?scid=329290。
aspnet_setreg -k:SOFTWARE\YourSecureApp\processModel
-u:"CustomASPNET" -p:"YourStrongPassword" | 2.
| 使用 Visual Studio .NET 或记事本打开 machine.config。 Machine.config 位于以下文件夹中:
C:\WINNT\Microsoft.NET\Framework\v1.0.3705\CONFIG | 3.
| 找到 <processModel> 元素,并将“用户名”和“密码”属性设置为包含以下指向加密的凭据详细信息的字符串。
Default:
<processModel userName="machine" password="AutoGenerate" . . ./>
Becomes:
<processModel
userName="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
ASPNET_SETREG,userName"
password="registry:HKLM\SOFTWARE\YourSecureApp\processmodel\
ASPNET_SETREG,password" . . . /> | 4.
| 保存对 machine.config 所做的更改。
|
|