为了研究下asp和asp.net虚拟主机更好的安全配置,决定对自己的机子下手。
下面对win2003+SP2+IIS6配置成功,系统安装在c盘下,所有盘的文件系统都为ntfs,如果是fat32就没什么意思了。
第一步,系统盘的权限。
1)C盘中除了administrators,system外其他的组或者用户全部删除。
2)C盘下的所有文件和文件夹(包括windows)把除了administrators,system外其他的组或者用户全部删除【以前看的一些文章说需要把user组加载windows上,其实并不需要】。
3)C:\Program Files\Common Files\System下的所有dll文件加上user组的读取和运行权限。(对asp的,server.createobject时需要,如adodb.connection什么的之类的dll在此文件夹下放着。),如果想偷懒,可以直接加载system目录上。
4)c:\windows下的所有文件和文件夹把除了administrators,system外其他的组或者用户全部删除。
【可以安全设置的高级选项中的“允许父项的继承权限传播到该对象和所有子对象,包括哪些在此明确定义的项目”和“用在此显示的可以应用到子对象的项目替代所有子对象的权限项目”复选框】
在下面就是重点了。是asp和asp.net程序运行时要用到的权限。
asp.net程序
1)增加iis工作进程组IIS_WPG对c:\windows\assembly的读取和运行权限(由于assembly是特殊目录,不能直接使用右键然后属性来添加,需要使用cacls命令来添加),要不访问asp.net程序会出现“服务器应用程序不可用”的错误。运行命令“cacls c:\windows\assembly /T /G IIS_WPG:R administrators:F SYSTEM:F”【命令就是给iis_wpg组的读权限,administrators和system的完全控制权限并且更改当前目录及其所有子目录中指定文件的ACL。】,加上权限后需要重新启动对应的应用程序池或者从任务管理器中结束对应的w3wp.exe进程使用权限生效,要不刷新网页还是出现如上错误。
2)C:\WINDOWS\Microsoft.NET\Framework目录,加上IIS_WPG的读取和运行权限。此时只剩下了IIS_WPG,administrators和system。C:\WINDOWS\Microsoft.NET\Framework目录下的你对应的framework版本文件夹加上user的读取和运行权限,其他的文件夹如URTInstallPath_GAC可以不加。又到重点了,asp.net编译生成的文件在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files下,所以需要给user组对Temporary ASP.NET Files的写权限。如果你用到了其他版本的framework(如1.1的),注意对应的Temporary ASP.NET Files也要有user组的写权限。
3)IIS_WPG需要有对C:\WINDOWS\WinSxS目录的读取和运行权限。要不访问时应用池程序会自动停止。事件查看器中出现“启动应用池失败"的错误。
附:如果Temporary ASP.NET Files下出现编译文件有多个文件的提示错误【大概是这个意思吧,公司服务器没安装中文帮助文档,显示的英文信息。。】,可以先停止iisadmin,删除Temporary ASP.NET Files 文件夹下的asp.net编译生成的所有文件和文件夹,然后启动iis让asp.net重新编译即可。【要注意停止iis,要不删除了Temporary ASP.NET Files下的文件和文件夹,提示文件被占用】。
asp程序
1)如果你使用的数据库是mssql什么的非access数据库,可以忽略此步骤。如果你使用的是access数据库那就要注意,需要给C:\WINDOWS\temp加上user组的写权限。要不连接access数据库时会出现“Microsoft JET Database Engine 错误 '80004005' 未指定的错误 ”次错误。
2)给C:\WINDOWS\system32加上user组的读取和运行权限,这是fso要用到的,如scrrun.dll。【当然如果你有时间,可以找到对应的dll文件加上user组的读取和运行权限,个人是直接加system32上了。】
asp程序和asp.net共同需要的
1)IIS_WPG组需要对C:\WINDOWS\IIS Temporary Compressed Files有读权限。这个好像是iis压缩网页需要的。如果没有IIS_WPG组的读权限,在“时间查看器”的系统那栏目那里会出现一条“指定的用来缓存压缩的内容 C:\WINDOWS\IIS Temporary Compressed Files 的目录无效。将禁用静态压缩。”警告信息。
2)user组需要拥有对c:\windows\Registration文件夹的读取和运行权限,要不当使用了session对象时会提示“http1.1无法建立新的会话”的错误。需要重新启动iis或者对应的应用程序池才能消除此错误。
到此已经完成系统盘的安全配置了。
第二步,其他盘(包括放asp,asp.net程序的盘)
盘和盘下面的所有文件和文件夹全部设置为只有administators组有完全控制权限,其他的组和用户全部删除。
第三步,IIS和用户部分(建立测试应用程序池,测试站点和系统用户)
1)运行compmgmt.msc打开计算机管理,找到本地用户和组,点击用户,然后新建用户。(为了简便我就把密码和用户名都设置一样了)
useriis:用来运行iis的,隶属于IIS_WPG组。
userweb:用来访问web站点的,隶属于GUESTS组,权限最低。
2)打开iis,新建应用程序池。然后右键刚才建的应用池,选择属性。在“标志”页,选择“配置”,而不是“预定义账户”【预定义是使用默认的network service用户来运行IIS】。然后输入用户名useriis或者浏览找到useriis,并且输入密码。
3)_建立一个测试站点,站点指向“e:\iisdebug”。右键此站点选择属性,目录安全性,编辑。勾选“启用匿名访问”,然后输入刚才建立的userweb用户名和密码。
4)选择iis的“web 服务扩展”,允许"Active Server Pages"和"ASP.NET v2.0.50727",iis6默认是禁止asp的,后面安装framework2.0也不会自动允许。
到此完成第三步。
第四步,放置asp,asp.net程序的文件夹的权限(我的放到e:\iisdebug,下面均直接称为iisdebug)
给iisdebug加上刚才建立的两个用户名useriis和userweb,权限为读写和运行。
在iisdebug下建立两个文件,test.asp和test.aspx和t.mdb(access数据库文件)用来测试刚才的配置是否成功。
test.asp文件可以把useriis用户删除,但是test.aspx文件不能删除,需要useriis和userweb。【意思就是asp程序只需要加上访问网站的用户名即可,asp.net程序需要访问网站的用户和运行iis的用户】。t.mdb需要加上userweb的写权限,如果你需要向access数据库写数据或者更新里面的数据时。还有一点注意的是如果有上传文件到某个文件夹时,此文件夹需要有useriis和userweb的写入权限。
到此基本上已经完成配置了,下面是test.asp和test.aspx的代码。
test.asp
+展开-VBScript
sub testObj(key)
on error resume next
err=0
set o=server.createobject(key)
if err<>0 then
response.write "创建“"&key&"”<font color='red'>失败</font><br/>"
else
response.write "创建“"&key&"”<font color='green'>成功</font><br/>"
set o=nothing
end if
on error goto 0
end sub
set cn=server.createobject("adodb.connection")
response.write cn.state&"<br/>"
cn.open "provider=microsoft.jet.oledb.4.0;data source="&server.mappath("t.mdb")
response.write cn.state&"<br/>"
cn.close
set cn=nothing
'测试木马常用的组件,最后再给出如何防止asp木马的配置。
call testobj("scripting.filesystemobject")
call testobj("adodb.stream")
call testobj("wscript.network")
call testobj("wscript.shell")
call testobj("shell.application")
response.write now
test.aspx
+展开-HTML
<%@ Page Language="C#" debug="true"%>
<%
Response.Write(System.IO.File.Exists(Server.MapPath("jtb.rar"))+"<BR/>");
System.IO.File.Delete(Server.MapPath("t.htm"));
Response.Write(DateTime.Now);
%>
|
请发表评论