举例详解ISAHTTP过滤功能
记得当初ISA2004发布时,微软大肆宣传ISA2004带来的各种新特性,其中很有分量的一个就是HTTP过滤。HTTP过滤其实就是ISA能够“理解”HTTP协议的一部分内容,可以根据协议内容对访问请求进行更准确的控制,ISA2004被当作应用防火墙和这个功能有很大的关系。其实一个全功能的应用防火墙对所有的管理员都是一个不可抗拒的诱惑,试想,传统防火墙根据IP和端口限制访问,应用防火墙则可以根据内容限制访问,两者的准确程度根本不在一个档次上。打个比方就象我们要拦截恐怖分子寄来的包裹,传统防火墙是根据包裹的邮寄地址来进行判断,看,这个包裹是伊拉克寄来的,拉出去砍了……这样当然不够准确;应用防火墙则根据包裹内容进行判断,哇,这个包包中居然藏有很多爆炸物,快跑啊!…..
ISA2006HTTP过滤功能基本和ISA2004完全一样,对于大多数用户来说,最常使用的的服务器就是Web服务器,因此了解ISA2006中提供的HTTP过滤功能对更好地进行访问控制有很大的意义。
ISA Server 2006究竟能够过滤HTTP数据包中的哪些内容,在此列举如下:
头长度的上限。
要求负载长度的上限。
URL与查询长度的上限。
验证正则化与阻止高位字符
阻止可执行Windows命令的数据包通过。
阻止指定的HTTP连接方法(Method)。
阻止执行或下载指定的扩展名文件。
阻止指定的请求头或响应头的内容。
阻止包含的签名内容。
看完了上述HTTP数据包过滤策略的说明之后,接下来就让我们来看看它的设置方法。目前我的ISA2006中只有一条访问规则Allow all,内容是允许内网和本地主机任意访问,我们如果想在这条访问规则上设置HTTP过滤,只要在规则属性中切换到“协议”标签,如下图所示,点击右下角的“筛选”,选择“配置HTTP“,就可以进行HTTP过滤设置了。
  举例详解ISA的HTTP过滤功能:ISA2006系列之九_方法
常规设置
如下图所示,在HTTP策略的“常规“标签中,我们可以设置头长度的上限、负载长度的上限、URL长度上限、查询长度、验证正则化与阻止高位字符以及阻止可执行Windows命令的数据包通过,具体解释如下:
 举例详解ISA的HTTP过滤功能:ISA2006系列之九_ISA2006_02
头长度的上限:此参数设置为较小的值可有效防止一些会导致缓冲区溢出的黑客程序的攻击,不过在此不建议设置小于10000字节的大小,因为它可能也会导致一些合法的应用程序无法访问。
负载长度的上限:有效地设置此值,可防止企业内部所发布的网站遭受到通过HTTP中的POST方法传送大量的恶意数据包,而导致网站系统的负载过大。
URL长度上限:设置超过此设限的网址长度将被阻止掉。
查询长度上限:在过去有一些蠕虫程序就是通过传送大量的GET要求给受害的目的地网站,藉此来瘫痪该网站的系统资源。
验证正则化与阻止高位字符:对于一些连接要求的数据包中,如果含有非正则化的字符与高位的内容可以在此加以阻止,不过必须注意的是如果网站是全中文化的,那么阻止高位的设置将会导致该网页无法正常显示,例如中文版Exchange Server 2003 OWA的发布就是如此。
阻止包含Windows可执行文件内容的响应:还记得最早以前的红色警戒病毒吗?它就是凭借传送带有可执行Windows命令(CMD/C)的数据包给目的地的IIS网站,来藉此入侵该网站的操作系统。ISA现在可以利用HTTP过滤有效阻止这种攻击。
 
方法
切换到HTTP策略的“方法“标签,如下图所示,我们可以阻止特定的HTTP方法。例如有些公司不希望员工在上班时间去论坛发贴子,我们就可以通过阻止POST方法来完成。
 举例详解ISA的HTTP过滤功能:ISA2006系列之九_请求头_03
如下图所示,我们阻止了客户机使用HTTPPOST方法,我们看看能否起到作用?
 
在客户机上访问百度的贴吧,准备发个帖子测试一下,如下图所示。
 
测试结果如下图所示,ISAHTTP过滤器拒绝了这个访问请求。
 
阻止方法还可以用于别的用途,例如我们想禁止用户访问代理服务器,就可以考虑阻止CONNECT方法,这样一来用户就不能和Web代理服务器建立连接了。
 
扩展名
切换到HTTP过滤的“扩展名”标签,如下图所示,我们在此可以阻止通过HTTP协议访问一些具有特定扩展名的文件。如果我们希望阻止用户不小心从网站下载或执行恶意代码,那么就可以在扩展名中阻止*.exe*.vbs*.js*.com等。
 
HTTP过滤中阻止了访问*.exe扩展名后,我们来实验一下,如下图所示,我们在客户机上下载ISA2006180天试用版,下载的文件扩展名是exe
 
结果如下图所示,下载请求被ISA过滤器阻止了。
 
HTTP
HTTP策略属性中切换到“头”标签,如下图所示,我们可以阻止指定的请求头或响应头。
 
下面是一些最常见的请求头,大家可以参考使用。
Accept:浏览器可接受的MIME类型。
Accept-Charset
:浏览器可接受的字符集。
Accept-Encoding
:浏览器能够进行解码的数据编码方式,比如gzipServlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少510倍的下载时间。
Accept-Language
:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization
:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection
:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小。
Content-Length
:表示请求消息正文的长度。
Cookie
:这是最重要的请求头信息之一
From
:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Host
:初始URL中的主机和端口。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
Referer
:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent
:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
UA-Pixels
UA-ColorUA-OSUA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
 
签名
很多文档在介绍ISAHTTP过滤功能时都会重点介绍签名,签名其实就是HTTP数据包中有规律出现的特征数据。我们想阻止一些HTTP应用程序,就可以分析一下这些程序在通讯时有哪些特征数据,然后把这些特征数据以签名的形式提交给ISA,这样ISA就可以阻止这些应用程序了。最典型的例子就是即时通讯软件,如QQMSN等。
XP中自带了一个MSN客户端软件Windows  Messenger,以此软件为例,Windows Messenger登录服务器时有三种方式
1 使用MSN Messenger协议直接连接MSN服务器的 1863端口。
2 使用HTTP协议连接MSN服务器的80端口。
3 使用代理服务器连接到MSN服务器的80端口。
其中第一种和第二种连接方式是很容易控制的,我们在ISA上封掉MSN服务器即可,虽然MSN服务器数量不少,但毕竟只是时间问题。第三种方法就不太好控制了,访问者通过代理服务器绕到MSN服务器上,从ISA的角度来看这只是内网的一台客户机访问外网的一台服务器而已。我们不可能封掉所有的代理服务器,这时就要靠签名了,我们要找出MSN客户端通过代理服务器访问MSN服务器时的特征数据,依靠这个来封掉MSN
微软网站给出了常用的即时通讯软件的签名,如下表所示。
应用程序名称
搜寻范围
HTTP头定义
签名内容
MSN Messenger
Request headers
(请求头)
User-Agent:
MSN Messenger
Windows Messenger
Request headers
(请求头)
User-Agent:
MSMSGS
Netscape 7
Request headers
(请求头)
User-Agent:
Netscape/7
Netscape 6
Request headers
(请求头)
User-Agent:
Netscape/6
AOL Messenger
Request headers
(请求头)
User-Agent:
Gecko/
Yahoo Messenger
Request headers
(请求头)
Host
msg.yahoo.com
Kazaa
Request headers
(请求头)
P2P-Agent
Kazaa
Kazaaclient:
Kazaa
Request headers
(请求头)
User-Agent:
KazaaClient
Kazaa
Request headers
(请求头)
X-Kazaa-Network:
KaZaA
Gnutella
Request headers
(请求头)
User-Agent:
Gnutella
Gnucleus
Edonkey
Request headers
(请求头)
User-Agent:
e2dk
Internet Explorer 6.0
Request headers
(请求头)
User-Agent:
MSIE 6.0
Morpheus
Response header
(响应头)
Server
Morpheus
Bearshare
Response header
(响应头)
Server
Bearshare
BitTorrent
Request headers
(请求头)
User-Agent:
BitTorrent
SOAP over HTTP
Request headers
(请求头)
Response headers
(响应头)
User-Agent:
SOAPAction
 
按照表中内容,我们在ISA中利用签名封锁MSN。在HTTP策略属性的“签名”标签处点击“添加”,如下图所示,我们为签名取名为“MSN”,查找范围是“请求头”,HTTP头是“User-Agent”,签名内容是“MSMSGS”。
 
HTTP过滤中阻止了MSN签名后,再用Windows Messenger通过代理服务器登录,原本是可以登录的,现在只能收到如下图的错误提示,签名设置成功了。
 
 
那如果我们要的签名在表中没有怎么办呢?我们可以通过抓包器来抓包分析。以Windows Messenger为例,如果我们想获取签名,只要在一台客户机上用Windows Messenger登录,然后启动抓包器抓包就可以了。抓包器我一般喜欢用Ethereal,其实用Windows自带的网络监视器也可以,我们甚至可以用网络监视器抓包,然后用Ethereal解码分析。下图就是网络监视器抓到的Windwos Messenger登录服务器时的数据包,图中很明显地看到User-Agent的内容是MSMSGS,这就是我们要的签名。
 
分析签名是比较复杂的,尤其是有些程序的签名会发生改变,例如QQ,想要准确地分析签名需要能够熟练使用抓包工具并能深入理解HTTP协议。以后有时间我会写篇介绍使用抓包工具的博文,希望大家都能利用好HTTP过滤提供的高级功能,做好ISA的访问控制。