一情况下w3wp.exe进程,是运行在系统内置的Network Service帐户下,可以通过 IIS应用程序池->标识,进行配置,以指定为自己建立的帐号,需要注意的是指定的帐号要想启动W3wp.exe进程,必须是IIS_WPG(IIS,Work Process Group)的成员,比如您建立一个叫admin的windows本地帐号,并且将其添加到administrators组(超级管理员组),如果没将其添加到IIS_WPG组的话,访问对应asp.net站点会得到Service Unavailable错误.
当然我们不可能使用一个Administrators组的帐号做w3wp.exe进程的工作帐号,那样只要asp.net程序被人拿到webshell,那么就等于控制整个服务器了。
建议做法:
1.分配好IIS匿名帐号(asp,静态文件--jpg,html等读写权限),将ftp张跟IIS匿名帐号分开设置
2.建立一个Windows帐号如,www.xxxx.com_aspx,供asp.net站点使用.(假设站点跟目录是H:/xxx.com/)
3.将www.xxx.com_aspx添加到IIS_WPG组内
4.分配H:/xxx.com/目录的读权限给www.xxx.com_aspx帐号。
4.1.分配H:/xxx.com/uploadfile/目录的读写权限给www.xxx.com_aspx (这里假设uploadfile目录是用户上传文件的目录,故需要写权限)
5.其他asp.net工作目录(如Windows/Temp,Assembly等)一般分配到IIS_WPG组,而不是每个自定义帐号分配一次权限。
注意,无论什么情况都不要给w3wp.exe进程的工作帐号分配"读取与运行"权限,最好不要在asp.net中写Process启动进程代码,类似的任务考虑设计成Windows Service、控制台程序+计划任务 形式安排在服务器上运行,给asp.net网站分配可执行权限(完全控制等)是不明智的做法。
以下是ASP.net ACL 说明摘自MSDN方便查阅
------------------------------------------
表显示 ASP.NET Web 应用程序的标识必须具有哪一类型的文件和文件夹权限才能正常工作。一些权限只是 ASP.NET 进程的运行帐户所需要的,而其他权限则是任何模拟帐户也都需要的。有关更多信息,请参见 ASP.NET 模拟。
位置 | 访问类型 | 帐户 | 注释 |
---|---|---|---|
%SystemRoot%\Microsoft.NET\Framework\versionNumber\Temporary ASP.NET Files |
读/写 |
进程或已配置的模拟。 |
这是用于动态编译文件的位置。在此位置下,在不同的目录中为每个应用程序生成应用程序代码。可以使用 <compilation> 配置节的 tempDir 属性来配置根位置。 |
%SystemRoot%\assembly |
读取 |
进程或已配置的模拟。 |
这是全局程序集缓存 (GAC) 的位置。 |
%SystemRoot%\System32 |
读取 |
进程 |
包含由 .NET Framework 加载的系统 DLL。 |
%SystemRoot%\Temp |
读/写/删除 |
进程 |
用于 Web 服务支持。 |
用户配置文件目录 |
读/写 |
进程 |
由 GAC 缓存锁文件和公共语言运行库的安全配置缓存机制使用。如果帐户的用户配置文件目录不存在,则 ASP.NET 将使用默认的用户配置文件目录。 |
Web 应用程序目录 |
读取 |
进程或已配置的模拟。 |
这是应用程序文件的位置。 |
Web application directory\App_Data |
读/写 |
进程或已配置的模拟。 |
这是 ASP.NET Web 应用程序中的数据文件的默认位置。如果您的应用程序使用 App_Data 子目录,则 ASP.NET 进程必须能够写入该目录,对于某些数据库来说,还必须能够在该子目录中创建临时文件。 |
%SystemRoot%\Microsoft.NET\Framework\version 和子目录 |
读取 |
进程或已配置的模拟 |
ASP.NET 必须能够访问 %SystemRoot%\Microsoft.NET\Framework\version\ 下 CONFIG 子目录中的 Machine.config 文件所引用的系统程序集。 |
-------------------------------------------
关于Windows 读取与运行的说明
一般指可执行文件,在asp.net 中使用System.Diagnostics.Process.Start()来启动进程,
在Windows系统中,被启动进程的运行帐号继承启动进程的帐号,如果asp.net在administrator帐号下允许,那么在执行cmd.exe进程时,cmd.exe就在administrator帐号下运行。
可以通过
System.Security.Principal.WindowsIdentity.GetCurrent().Name,来查看当前进程运行的Windows帐号