平时做项目的时候,对于Web Server的设置都是某种视角功能最大化使用设置,很少去想和研究里面的具体设置,尤其是权限的设置,在一次发布的公开测试项目中,竟然被黑客的程序植入了一段脚本,结果嘛,可以想象啦……
抽了一天的功夫,仔细总结一下:
Apache 的名声可能比 IIS 好,但我相信用 IIS 来做 Web 服务器的人一定也不少。说实话,我觉得 IIS 还是不错的,尤其是 Windows 2003 的 IIS 6(马上 Longhorn Server 的 IIS 7 也就要来了,相信会更好),性能和稳定性都相当不错。但是我发现许多用 IIS 的人不太会设置 Web 服务器的权限,因此,出现漏洞被人黑掉也就不足为奇了。但我们不应该把这归咎于 IIS 的不安全。如果对站点的每个目录都配以正确的权限,出现漏洞被人黑掉的机会还是很小的(Web 应用程序本身有问题和通过其它方式入侵黑掉服务器的除外)。下面是我在配置过程中总结的一些经验,希望对大家有所帮助。
IIS Web 服务器的权限设置有两个地方,一个是 NTFS 文件系统本身的权限设置,另一个是 IIS 下网站->站点->属性->主目录(或站点下目录->属性->目录)面板上。这两个地方是密切相关的。下面我会以实例的方式来讲解如何设置权限。
IIS 下网站->站点->属性->主目录(或站点下目录->属性->目录)面板上有:
- 脚本资源访问
- 读取
- 写入
- 浏览
- 记录访问
- 索引资源
6 个选项。这 6 个选项中,“记录访问”和“索引资源”跟安全性关系不大,一般都设置。但是如果前面四个权限都没有设置的话,这两个权限也没有必要设置。在设置权限时,记住这个规则即可,后面的例子中不再特别说明这两个权限的设置。
另外在这 6 个选项下面的执行权限下拉列表中还有:
- 无
- 纯脚本
- 纯脚本和可执行程序
3 个选项。
而网站目录如果在 NTFS 分区(推荐用这种)的话,还需要对 NTFS 分区上的这个目录设置相应权限,许多地方都介绍设置 everyone 的权限,实际上这是不好的,其实只要设置好 Internet 来宾帐号(IUSR_xxxxxxx)或 IIS_WPG 组的帐号权限就可以了。如果是设置 ASP、PHP 程序的目录权限,那么设置 Internet 来宾帐号的权限,而对于 ASP.NET 程序,则需要设置 IIS_WPG 组的帐号权限。在后面提到 NTFS 权限设置时会明确指出,没有明确指出的都是指设置 IIS 属性面板上的权限。
1 —— ASP、PHP、ASP.NET 程序所在目录的权限设置:
如果这些程序是要执行的,那么需要设置“读取”权限,并且设置执行权限为“纯脚本”。不要设置“写入”和“脚本资源访问”,更不要设置执行权限为“纯脚本和可执行程序”。NTFS 权限中不要给 IIS_WPG 用户组和 Internet 来宾帐号设置写和修改权限。如果有一些特殊的配置文件(而且配置文件本身也是 ASP、PHP 程序),则需要给这些特定的文件配置 NTFS 权限中的 Internet 来宾帐号(ASP.NET 程序是 IIS_WPG 组)的写权限,而不要配置 IIS 属性面板中的“写入”权限。
IIS 面板中的“写入”权限实际上是对 HTTP PUT 指令的处理,对于普通网站,一般情况下这个权限是不打开的。
IIS 面板中的“脚本资源访问”不是指可以执行脚本的权限,而是指可以访问源代码的权限,如果同时又打开“写入”权限的话,那么就非常危险了。
执行权限中“纯脚本和可执行程序”权限可以执行任意程序,包括 exe 可执行程序,如果目录同时有“写入”权限的话,那么就很容易被人上传并执行木马程序了。
对于 ASP.NET 程序的目录,许多人喜欢在文件系统中设置成 Web 共享,实际上这是没有必要的。只需要在 IIS 中保证该目录为一个应用程序即可。如果所在目录在 IIS 中不是一个应用程序目录,只需要在其属性->目录面板中应用程序设置部分点创建就可以了。Web 共享会给其更多权限,可能会造成不安全因素。
2 —— 上传目录的权限设置:
用户的网站上可能会设置一个或几个目录允许上传文件,上传的方式一般是通过 ASP、PHP、ASP.NET 等程序来完成。这时需要注意,一定要将上传目录的执行权限设为“无”,这样即使上传了 ASP、PHP 等脚本程序或者 exe 程序,也不会在用户浏览器里就触发执行。
同样,如果不需要用户用 PUT 指令上传,那么不要打开该上传目录的“写入”权限。而应该设置 NTFS 权限中的 Internet 来宾帐号(ASP.NET 程序的上传目录是 IIS_WPG 组)的写权限。
如果下载时,是通过程序读取文件内容然后再转发给用户的话,那么连“读取”权限也不要设置。这样可以保证用户上传的文件只能被程序中已授权的用户所下载。而不是知道文件存放目录的用户所下载。“浏览”权限也不要打开,除非你就是希望用户可以浏览你的上传目录,并可以选择自己想要下载的东西。
3 —— Access 数据库所在目录的权限设置:
许多 IIS 用户常常采用将 Access 数据库改名(改为 asp 或者 aspx 后缀等)或者放在发布目录之外的方法来避免浏览者下载它们的 Access 数据库。而实际上,这是不必要的。其实只需要将 Access 所在目录(或者该文件)的“读取”、“写入”权限都去掉就可以防止被人下载或篡改了。你不必担心这样你的程序会无法读取和写入你的 Access 数据库。你的程序需要的是 NTFS 上 Internet 来宾帐号或 IIS_WPG 组帐号的权限,你只要将这些用户的权限设置为可读可写就完全可以保证你的程序能够正确运行了。
4 —— 其它目录的权限设置:
你的网站下可能还有纯图片目录、纯 html 模版目录、纯客户端 js 文件目录或者样式表目录等,这些目录只需要设置“读取”权限即可,执行权限设成“无”即可。其它权限一概不需要设置。
有时,如果服务器端安装过一些软件防火墙等防毒软件,可能也会限制一些文件访问权限(特别是exe,dll文件),在确认IIS设置无误后,也需要留意这个问题。
转载IT168:
在Windows Server 2003安装IIS 6.0:
单击“开始”“控制面板”→“添加/删除程序”→“添加/删除 Windows 组件”按钮,启动“Windows 组件向导”。在“Windows 组件”列表中,选中“应用程序服务器”旁的复选框,单击“详细信息”。在“应用程序服务器”→“应用程序服务器子组件”下方,突出显示“Internet 信息服务 (IIS)”,单击“详细信息”。在“Internet 信息服务 (IIS) 子组件”列表中,选择“万维网服务”,单击“详细信息”。要添加可选组件,选中要安装的组件旁的复选框。单击“下一步”,然后单击“完成”。
在解释IIS 6.0安全性配置之前,首先应该介绍一下IIS 6.0的几个不安定因素:IIS管理服务(inetinfo.exe,提供IIS的管理工作,SMTP,NNTP,FTP等服务),WWW管理服务(WAS,工作处理程序管理,组态管理),HTTP.sys(负责出来Request,提供Cache,Queue等功能),工作处理程序(W3Wp.exe)。接下来笔者围绕这些因素谈谈相关安全配置的取舍。
WEB应用程序(如ASP)缓冲池
实验证明,在给网站配备了应用程序缓冲池之后,网站的访问效率提高的几倍甚至十几倍。IIS 6.0最大的改进之一就是应用程序缓冲池允许隔离。IIS 5.0中,所有WEB应用程序只允许共用一个缓冲池。由于将web应用程序隔离在独立的单元将会导致严重的性能下降,因此没有实现应用程序隔离。
通常一个web应用程序的失败会影响同一服务器上其他应用程序。然而,IIS 6.0在处理请求时,通过将应用程序隔离成一个个叫做应用程序池的孤立单元这种设计上的改变,成倍的提高了性能。每个应用程序池中通常由一个或多个工作进程。这样就允许确定错误的位置,防止一个工作进程影响其他工作进程。这种机制也提高了服务器以及其上应用的可靠性。
这样的结构明显很不合理,造成了权限的混乱。而在IIS 6.0中,也许是微软汲取了非典期间的智慧,把各个缓冲池进行了隔离。可以设定多个缓冲池,定义它们的名字。指定在网站,目录,甚至虚拟目录中的WEB程序到任何一个缓冲池。
首先要选择到底采用IIS 5.0还是采用IIS 6.0的隔离措施。出于对旧版本的兼容性,IIS 6.0允许仍然采用IIS 5.0的方式。但两种方式不能同时启用。
点击“开始”→“设置”→“控制面板”→“管理工具”→“IIS管理器”,右键单击网站,点击“属性”→“服务”,把“以IIS 5.0的隔离模式运行WWW服务”复选框前的钩去掉。
单击“应用程序池”,右键单击右边空白处,点击“新建”→“应用程序池”,给新建的应用程序池设置一个名字,点击确定即可。这里所谓的依照某一模板新建,是指新建的应用程序池的属性配置与之前建好的某应用程序池。点击“网站”前的加号,展开当前目录下的所有网站,右键单击目标网站,点击“属性”→“主目录”→“应用程序池”,选定刚刚建好的缓冲池。重复这些步骤,便可为不同的网站设立不同的应用程序缓冲池。这些缓冲池是隔离开的,提高了服务器的稳定性和安全性。
1.右击适当的应用程序池,然后单击“属性”。出现应用程序池的属性对话框。 单击“回收”选项卡,然后设置适当的应用程序池设置。“内存回收”是等效于 memoryLimit ASP.NET 进程模型设置的应用程序池设置。它指定辅助进程可以使用的最大内存量。如果辅助进程超出了这一数量,将创建新的进程来替换它,并且当前所有请求都被重新分配给该新进程。
2.右击适当的应用程序池,然后单击“属性”。出现应用程序池的属性对话框。 单击“性能”选项卡,然后设置适当的应用程序池设置。“空闲超时”是指定辅助进程或应用程序池在开始处于不活动状态后,过多长时间将其关闭。
默认情况“空闲超时”是启用的而且设置为 20 分钟。通过更改数值调节框中的值,可以指定一个不同的时间限制。“请求队列限制”指定在异常终止后等待辅助进程启动时在 ASP.NET ISAPI 中排队的请求的最大数目。默认情况下“请求队列限制”是启用的而且设置为 1000 个请求。通过更改数值调节框中的值,可以对排队的请求的数目指定不同的限制。
3.右击适当的应用程序池,然后单击“属性”。出现应用程序池的属性对话框。 单击“健全”选项卡,然后设置适当的应用程序池设置。“启用 ping”是指定 ASP.NET ISAPI 检查辅助进程是否存在的时间间隔。如果没有辅助进程,则重新启动辅助进程。默认情况下“启用 ping”是启用的而且设置为 30 秒。
通过更改数值调节框中的值,可以指定一个不同的时间间隔。“关闭时间限制”是指定提供给辅助进程的用来正常关闭的时间长度。如果辅助进程在指定的时间长度内没有关闭,则 ASP.NET ISAPI 将结束该辅助进程。默认情况下“关闭时间限制”设置为 90 秒。通过更改数值调节框中的值,可以指定一个不同的时间限制。