一种对用户进行区分和跟踪的中间系统的制作方法

文档序号:7627399阅读:127来源:国知局
专利名称:一种对用户进行区分和跟踪的中间系统的制作方法
技术领域
本发明属于网络安全技术领域,特别是涉及一种对访问被保护Web网站的用户进行区分和跟踪的技术。利用该技术使得网络安全系统可以对用户的访问行为进行有区别的控制。
背景技术
传统的对到达网络服务器的数据流进行分类的方法是利用数据包中的源目IP地址、端口号、协议等元素进行区分,但这样做不能区分在防火墙、代理服务器、网络地址转换器(NAT)后面的用户。常用的对用户会话状态进行跟踪的方法是采用应用层的cookie、动态页面,或者浏览器的plug-ins(插件程序)等,利用它们能够透过防火墙、代理服务器、地址转换器将所需的信息送达用户端,又能够得到用户端送出的某些信息的功能。但这些跟踪方式都是所谓的无状态跟踪方式,即把用户的会话状态信息送给用户端保留,服务器端不保留这些状态信息,但期待它们在用户端发出的请求中会被带回。很显然,从安全的角度来看,这些无状态跟踪方式难以防御重放攻击,因为系统无法区分被攻击者重放的请求与用户停留了较长时间以后发出的请求。另外,这些会话状态跟踪机制本身都不提供安全功能,即不能防止攻击者伪造或者重放合法的会话包。例如,cookie需要通过附加数字签名的方式来防止伪造,并利用快速更新的方式来防止重放。但cookie快速更新会导致cookie快速过期,因而不利于记录空闲时间比较长的浏览行为。
采用有状态跟踪的方式,即由服务器端保留用户的会话状态的方式,服务器端可以很容易地发现重放的或者伪造的请求包。但有状态跟踪方式面临的一个严重问题是如何在有限的内存空间内保留无限个用户的状态信息。还要解决对记录的快速搜索和快速操作的问题等。
所以,现有的区分和跟踪用户会话状态的技术,仍然存在安全、效率等方面的问题。而且这些技术主要是解决服务器对到访用户的会话状态进行跟踪的问题,不适合于在入侵检测和入侵防御系统等中间系统上采用。
为此,本发明提出了一种快速安全的对用户进行区分和跟踪的中间系统技术。它的基本思想之一是结合无状态与有状态跟踪的特点,由用户端和服务器端同时保留会话状态,并在服务器端将最长时间没有活动的(即最有可能已经停止了的)会话状态记录所占用的空间分配给新的会话使用。所以,服务器端保留的是正在进行会话的用户状态,而在一次会话结束的时候用户端保留的是这次会话的最后状态。这样一来,如果被攻击者重放的是正在进行的会话的请求包,则由服务器端保留的会话状态就很容易将它们区别出来;如果被重放的是已结束的会话的请求包,则系统中没有状态可查,因而也可以区别出来。这些被重放的已结束的会话的请求包,只有其中第一个可能被系统误认为是一个老用户在停止活动很长时间以后开始了一个新的会话过程。其它重放包将会被系统过滤掉,因而不会对系统造成任何影响。
本发明的基本思想之二将用户的唯一且永久的标识与用户的一次会话的临时标识结合起来使用。其目的是为每个曾经到访的用户分配一个唯一且永久的标识,以区分包括内网用户在内的所有用户。这使得系统可以知道哪些用户是经常访问网站而又正常的用户,哪些是行为怪异甚至有害的用户。但由于用户的数量巨大,这种永久标识不适合于直接用作对用户状态记录的索引。所以本发明还给每个正在进行的会话分配一个本地唯一的临时的标识,并以此标识为索引,对该会话的记录进行操作。以此达到对用户的快速区分、对会话记录的快速索引和对存储空间的高效管理。已结束了的会话的标识,可以被重用于其它新开始的会话。由于这个会话标识是临时性的,所以必须配合永久标识使用,否则当这个用户结束一次会话很长时间以后又开始一个新的会话时,就会与正在进行会话一个其它用户混淆。这样结合的好处还在于,这种结合关系是在变化的,因而可以在一定程度上防止伪造和重放。

发明内容
本发明的目的在于克服现有技术的不足,提供一种适合于中间系统采用的快速安全的对用户进行区分和跟踪的技术。本发明采用给每个到访的用户分配唯一且永久的标识和给每次会话分配一个临时标识的方式,提供一种对用户同时进行无状态跟踪和有状态跟踪的机制,并实现对用户的跟踪数据记录进行快速操作和高效管理,防止可能的伪造和重放攻击。该技术可以应用于入侵检测和入侵防御系统等连接于用户端与服务器之间的中间系统上,实现对用户有区分的跟踪、分析和控制。
为了实现本发明的目的,本发明采用的技术方案为构造一种快速安全的对用户进行区分和跟踪的中间系统。它连接于服务器前端、在客户机访问服务器的必经之链路上。采用长期标识PID和短期标识SID相结合的方式区分及跟踪访问服务器的用户,以PID为标识对用户进行长期跟踪,以SID为标识对活动用户进行快速区分,以SID为索引对用户会话状态记录进行高效管理,以附加的经常变化的随机数和数字签名,对传输过程中的PID和SID进行完整性保护,并防止重放攻击。所述长期标识PID是所述中间系统赋给每个曾经访问过所述服务器的用户的唯一且永久性的标识;所述短期标识SID是所述中间系统赋给每个活动用户的临时标识;所述活动用户是正在与服务器会话的用户。
所述中间系统采用在用户端和服务器之间截获会话数据包、并对其中的部分字段进行改写的方式来携带所述的长期标识PID和短期标识SID。所述的会话数据包是在可以透过防火墙、代理服务器、网络地址转换器进行的用户与服务器之间的应用层会话过程中产生的数据包;所述数据包中的部分字段是应用层会话过程中可以到达用户端又可以从用户端返回的内容。
实际上,任何可以透过防火墙、代理服务器、NAT到达用户端,又能够由用户端返回的应用,都可以被本发明用来携带(SID,PID)。例如,在每一个网页中都设置一个内嵌的链接,使得它从形式上看是一个对动态内容,即不可缓存内容的链接,但其URL实际上是(SID,PID)。也可以利用浏览器plug-ins插件程序的功能,在每个HTTP请求中嵌入(SID,PID)。但最简便的方法是利用HTTP的cookie功能来传送(SID,PID)。
本发明区分用户的方法是根据数据包中是否携带PID将用户分为旧用户和新用户,旧用户又由二维向量(SID,PID)分为活动的和不活动的用户,再由SID将活动用户细分为单个用户分别进行跟踪。所述新用户是第一次到访的用户,还没有分配PID和SID;所述活动用户是正在与服务器进行会话的用户,具有有效的(SID,PID),且可以以SID为索引进行快速查验;所述不活动用户是很长时间没有发出请求包的用户,临时分配给它的SID已经分配给其他活动用户。
在实际应用中,最开始的时候用户浏览器发出的请求中不含有(SID,PID)。这个请求会被中间系统当作新用户的请求直接送给被保护Web服务器。被保护Web服务器在给该请求给予响应的时候,在其中给(SID,PID)预留足够的字节空间。所以,当中间系统接收到服务器送来的所述响应时,给该用户分配一个永久的用户标识PID和一个临时的会话标识SID。在重新计算tcp和ip的checksum以后,发给用户。
当用户浏览器收到(SID,PID)的响应以后,会将(SID,PID)保留在浏览器内,并在后续的请求中带上(SID,PID)。中间系统将把带有(SID,PID)的请求看作旧用户的请求,并按照其中的SID查到在中间系统中保存的(SID,PID)。通过比较,可以知道该请求是否合法。如果合法,则送出到被保护Web服务器。被保护Web服务器对该请求给予正常的响应,并在该响应中原样带回(SID,PID)。
如果一个用户停止活动过长时间,则保存在中间系统中的有关该用户的会话记录将被清除,清理出的资源被用于记录其他用户的会话过程。因此,当一个用户过了很长时间以后重新浏览被保护Web服务器时,在中间系统中通过SID索引找到的(SID,PID)将与该用户请求中的(SID,PID)不一致,所以中间系统能够判断出这是一个不活动用户正在开始一个新的会话过程。
中间系统在收到一个不活动用户新开始会话过程的第一个请求包时,将该用户标记为活动用户。具体做法是将其PID记录下来,用于发现后续的重放包,即那些在中间系统找不到匹配的(SID,PID)而PID已经标记为“活动状态”的请求包。为了实现对用户“活动状态”的快速检测,需要采用hash函数将PID映射到一个较小的集合内。这里则简单地将PID的低位数取出,与SID的位数相同,例如4位,记为Last(PID)。这主要是考虑到PID是由一个累加计数器获得的,所以同一时间出现的新用户具有不相同的低位数,但它们以后同时为活动用户的可能性却比较大。对于其中具有相同Last(PID)的活动用户,用一个线性搜索列表来记录,如下表所示。
活动用户列表入口活动用户列表


其中PID,PID1,PID2,...,PIDn都具有相同的LID,即入口。用BGN和END表示该线性搜索链的开始标志和结尾标志。
在本发明的技术方案内,所述的SID被作为所有记录操作的索引,并且存放记录的缓冲区通过SID的重复使用来进行管理。所述记录就是对用户进行跟踪的数据;所述管理方法就是由缓冲区的大小和每条记录的长度确定SID的最大数,再采用堆栈对SID的使用进行管理;所述SID堆栈的管理方法就是先将所有的SID依次压入堆栈,然后在每次为活动用户分配一个SID时,都从堆栈的底部取出一个SID,将它赋给活动用户之后又将它压入到堆栈的顶部,并且在每次对用户记录进行操作时,都将该用户的SID从堆栈中取出,再将它压入到堆栈的顶部,使得堆栈底部的SID代表的是最长时间没有活动的用户,因而可以被重新使用。所述SID堆栈的构成方法如下TOP.dwn=SID1,SID1.dwn=SID2,...,SIDn-1.dwn=SIDn,SIDn.dwn=BTM;BTM.up=SIDn,SIDn.up=SIDn-1,...,SID2.up=SID1,SID1.up=TOP其中,TOP和BTM是两个与SID类似的地址,但不在SID集合内。例如,设SID的集合是0001~9998,则可以设TOP=0000,BTM=9999。SID堆栈的结构如下SID堆栈表

所以,利用对SID堆栈的管理可以保证中间系统不会因为并发会话数过多而溢出。并发会话数过多、产生频率过快所带来的影响是使得每个会话可以允许的空闲时间减少。
在本发明的技术方案中,防止伪造SID和PID的方法是利用SID经常变和PID不变的特性将SID和PID捆绑使用,由所述中间系统以SID为索引将这种捆绑关系记录下来用于查验数据包中所携带的SID和PID的合法性,并丢弃不合法的数据包。所述SID经常变的特性是指每次用户由不活动状态变为活动状态都会被随机地赋予一个闲置的SID。所述SID经常变的特性可以通过串接一个更经常变化的随机数R以加大变化的频率,也可以附加一个数字签名DS对其完整性进行保护和验证。
(SID,PID)与R和DS组成的字符串是具有完整性保护和防重放等安全属性的一个特殊的字符串,这里简称为ips_ckie。利用cookie来携带ips_ckie的方式如下表所示。其中ips_ckie的名字是一个特殊的字符串,例如vErY_sPecIL_iPs_CoOkIE_NaME*,所以通过对该字符串进行匹配搜索就可以发现一个HTTP请求或响应包中是否含有ips_ckie。一般情况下,HTTP请求和响应的头部都不太长(例如小于1500字节),所以ips_ckie被分割在两个包中的可能性比较小,因而被中间系统漏检的可能性比较小。当从用户来的请求包中的ips_ckie被漏检时,该请求包会被当作新用户发来的请求,放到新用户请求一起被服务,所以在正常情况下对用户没有影响;当来自被保护Web服务器的响应中的ips_ckie被漏检时,除了错过一次更新和分配新SID与PID以外,对用户也没有影响。但在可能的情况下可以对ips_ckie附加上有效时间控制,这样可以使得被漏检的ips_ckie在到达用户端时立即作废(其中的时间属性Max-Age=″00000000″)或者使得正常的ips_ckie在用户端保留足够长的时间(例如,其中的时间属性Max-Age=″86400000″)。

本发明的技术方案的防重放攻击方法是根据数据包中所携带的字符串ips_ckie将其分为合法的和过时的,并将过时的数据包滤除掉,所述合法的数据包是满足以下两个条件之一的数据包带有当前有效的ips_ckie,或者在当前有效的ips_ckie到达用户端之前已经带有前一个有效的ips_ckie。当前有效的所述字符串在经过一个短的时间以后,中间系统将对其进行更新,以防重放攻击。具体做法是,当中间系统接收到带有ips_ckie的响应时,要检查当前时间与上次更新时间的差值,如果它大于给定的阈值(例如1分钟),则对该ips_ckie作更新,并将原ips_ckie保留作为前一个有效的ips_ckie。显然,如果给定阈值等于0,则中间系统将对ips_ckie作不间断地更新。所谓更新,即重新产生一个随机数R,重新计算数字签名DS,并重新计算tcp和ip的checksum。
本发明技术方案所述的所有方法都是基于对数据包中对用户与服务器之间的正常会话过程没有影响的字段的读写操作。所述的没有影响的字段是由被保护服务器预留的冗余的字节空间,由所述中间系统负责填入、读取和修改所需的内容。在具体实现上,将尽可能减少与被保护服务器之间的互动关系。这里只要求被保护Web服务器在给ips_ckie预留字节空间方面或者网页设置方面予以少量的配合。例如,要求被保护服务器对新用户设置一个空的ips_ckie或者一个虚拟的URL(=ips_ckie的长度),这不会影响被保护Web服务器任意设置自己所需的cookies。由于ips_ckie的名字特殊,所以中间系统可以在不进行分片重组和对HTTP解析的情况下,通过名字匹配而找到ips_ckie所在的位置,然后对它重新赋值。进一步考虑到网络中各级代理服务器和cache对静态内容的缓存作用,也即对Web服务器负载的分担作用,本系统通常只对动态内容(dynamic content)和其它un-cacheable content设置ips_ckie。
当实际应用中要求所述中间系统完全独立于被保护的Web服务器时,中间系统需要增加对应用层进行解析的功能,其中包括在响应包已经达到最大传输单元MTU,例如1500字节时,将新增加的ips_ckie作为新的分片处理,并同步TCP层的序列号。这种情况下,将大大增加中间系统的复杂性和响应包在中间系统中处理的时延,因为需要对分片进行重组和解析所有层次的协议。
本发明的优势在于适用于在被保护Web服务器前端构建一个安全防御系统或者一个分类控制系统,利用本发明提供的对用户的安全区分技术,进一步实现对各个用户行为的跟踪和分析,进而实现有区别的服务、速率控制和过滤等,同时又不影响Web服务器在用户端设置cookie等应用的便捷性,所以,同时兼顾方便及安全的性能,适合推广使用。


图1为快速安全的对用户进行区分和跟踪的中间系统的结构示意图;图2为客户机至服务器的数据包分类流程图;图3为被保护Web服务器对ips_ckie的处理流程图;图4为服务器至客户机的数据包分类处理流程图;图5为ips_ckie的实现原理图;图6为客户机至服务器的数据包分类处理的系统模块结构;图7为被保护Web服务器处理用户请求的软件模块结构;图8为服务器至客户机的数据包分类处理的系统模块结构。
具体实施例方式
下面结合附图对本发明作进一步的说明。
本发明的快速安全的对用户进行区分和跟踪的中间系统的结构示意图如附图1所示。本实施例重点是对HTTP请求包进行处理,而对于其它数据包,则可以采用类似于防火墙的访问列表控制和入侵检测系统的滥用检测等成熟的技术,实现对源目IP地址、协议、速率、过程和关键特征的检测和过滤。来自Internet的数据包经接收和分类后,分离出HTTP请求。HTTP请求经过用户的短期状态与长期标识的验证和分类后,不合法的、或者伪造的请求被过滤掉,通过的是新用户请求和旧用户请求,其中旧用户的请求包中带有合法的ips_ckie。旧用户请求再经过防重放检验,将重放的请求过滤掉,然后送到后续的分类控制系统。分类控制系统将以SID为索引,对不同活动用户分别进行跟踪和处理。新用户请求和其它合法的数据包,在分类控制系统被作为与旧用户不同类型的流采用不同的控制方式。分类控制系统对新旧用户流和所有数据包的分类控制可以采用入侵检测、入侵防御、速率控制、优先级排队、业务质量控制等方法,使得被访问的Web服务器受到保护。被保护Web服务器对请求进行响应后,须将响应包通过本中间系统转送至用户端。来自被保护Web服务器的数据包在中间系统首先也要经由包接收与分类程序筛选出HTTP响应包,再进行分类,具体分为对旧用户的正在进行的会话的响应包和对新用户或旧用户重新开始的会话的响应包。对旧用户的正在进行的会话的响应包必须进行短期状态更新,即赋予新的随机数R并重新计算数字签名,以防止重放式攻击;而对于新用户的响应包则分配新的PID和SID,给旧用户新开始的会话包保留原有的PID并赋给新的SID。无论是旧用户开始新的会话还是新用户开始新的会话,都把该用户标记为活动状态,使之处于活动用户列表中。最后在组成ips_ckie和重新计算checksum以后,把响应包通过Internet发回给用户。
客户机至服务器的数据包分类流程如附图2所示,从Internet来的数据包,先按照IP的协议protocol和端口port分成HTTP请求包与其它数据包,例如ICMP、UDP、TCP建立/拆除连接的包等,使得这两类数据包可以分别处理。由于HTTP请求包通常比较短,所以通常不需要进行分片重组。分离出来的HTTP请求经过对ips_ckie的搜索,被分成有ips_ckie的请求和无ips_ckie的请求。无ips_ckie的请求被看作是一个新用户的请求,这个请求也可能是一个旧用户清除了浏览器中保存的cookie或关闭了浏览器的cookie功能后发出的请求。对于新用户请求包,由于没有该用户的历史数据可以判断其行为,所以系统只能从所有新用户请求组成的流的总体情况进行判断和控制,例如对新用户请求包的总到达率进行控制,或者对其来源IP地址进行控制,或者进一步对这些新用户请求包进行深层次检查,即对每个请求包进行特征和规则检测,并滤除有害的请求包。有ips_ckie的请求是旧用户发出的请求。对其所带的ips_ckie要进行验证,即以ips_ckie中的SID为索引在系统的内存中找到相应的记录进行比较,即比较请求中的ips_ckie是否与系统中保留的当前的和前一个ips_ckie的拷贝是否一致,由此将有ips_ckie的请求包分成三类带新ips_ckie的、带旧ips_ckie的、无记录的。其中,带新ips_ckie的请求是活动户正在进行的浏览过程中发出的请求。由其中的SID可以区分这些用户和会话。对于带旧ips_ckie的请求,如果是在新ips_ckie到达客户端之前发出,则是有效的请求,可以与带新ips_ckie的请求同等对待;如果已超出过渡时间,则属于非法,应该滤除。对于无记录的请求,由于其所携带的ips_ckie没有相应的拷贝用于比对,所以必须通过验证其数字签名验证其合法性。如果非法,则该请求有可能是一个伪造合法的请求,应该予以丢弃。如果合法,则由该ips_ckie中的PID搜索活动用户集,以检查该用户是活动用户还是非活动用户。如果是非活动用户,则该请求是由一个合法的旧用户在停止浏览很长时间以后,新开始的一个浏览过程,其ips_ckie所带的SID已经被其它用户的会话过程所使用。如果是活动用户,则说明该用户已经开始一个新的会话过程,但该ips_ckie是旧的,它只有在新ips_ckie到达用户端的来回时间内有效,否则就可能是被攻击者重放的请求,因而要予以丢弃。
被保护Web服务器对ips_ckie的处理流程如附图3所示。它将提供最低限度的cookie功能。其中包括,对没有ips_ckie的用户请求,设置一个新ips_ckie;对于有ips_ckie的请求,只是简单地将其复制到响应中带回。new_ckie的name必须是一个特殊的名字,可以与ips_ckie的name基本上一样,只有标志位不同,以便于系统识别;其value不重要,可以是全0,主要是为系统预留足够的字节长度;但其path则要求指明页面所在位置,并将其最大有效时间设置为0,以避免new_ckie在系统漏检情况下,对客户端可能产生的影响。
附图4是服务器至客户机方向上的数据包的分类处理流程图。当从被保护Web服务器来的数据包到达中间系统时,中间系统采取类似于客户机至服务器的数据分类的方法,将数据包分成其它数据包、对新用户的响应、对旧用户新开始的会话的第一个请求的响应、带有旧ips_ckie的响应、对正在进行的会话的请求的响应。对于其它数据包,系统不做任何处理,直接发送回给用户;对于新用户响应,系统应该由一个累加计数器给该用户分配一个新的用户标识PID,然后,与新会话响应一样,从SID堆栈中获取一个最长时间没有使用的SID,作为其会话标识。再将SID和PID记录到活动用户集内,使其成为活动用户。对于带有旧ips_ckie的响应,则不能将该ips_ckie发回到用户端,以避免它覆盖前一个新的ips_ckie。所以,应该从系统中将该新ips_ckie的拷贝调出来,替换该响应中的旧ips_ckie,然后再发回给用户。对于正在进行的会话的响应,需要检查其ips_ckie是否需要更新。如果不需要更新,则直接发回给用户。如果需要更新,则应该产生新ips_ckie,并将新的ips_ckie和刚被更新的ips_ckie都记录在系统内,以便用于后续的查验。SID堆栈的操作,是要把最新使用过的SID放到堆栈的顶部,使得堆栈底部的SID是最长时间没有使用过的SID,因而可以被重用。
ips_ckie的实现原理如附图5所示。开始的时候,用户浏览器发出的请求不带有系统设定的ips_ckie。这个请求会被系统当作新用户的请求直接送给被保护Web服务器。被保护Web服务器在给该请求给予响应的时候,在其中设置一个new_ckie。它主要是为系统设置ips_ckie预留足够的字节空间。所以,当系统接收到服务器送来的该响应时,给该用户分配一个永久的用户标识PID和一个临时的会话标识SID。在将SID、PID串接上一个新产生的随机数以后,用MD5等计算其数字签名DS,由此得到ips_ckie的value。然后,令其Max-Age=″86400000″,再用ips_ckie替代该响应中的new_ckie,经过重新计算tcp和ip的checksum以后,发给用户。
用户浏览器收到带有ips_ckie的响应以后,会将该ips_ckie保留在浏览器内,并在后续的请求中带上这个ips_ckie。当带有ips_ckie的请求到达系统时,系统将把该请求看作旧用户的请求,并按照ips_ckie中的SID查到保存在系统中的拷贝。通过比较,可以知道该ips_ckie是否合法。如果合法,则送出到被保护Web服务器。被保护Web服务器对该请求给予正常的响应,并在该响应中原样带回这个ips_ckie。经过一个短的时间以后,系统会对ips_ckie进行更新,以防重放攻击。具体做法是,当系统接收到带有ips_ckie的响应时,要检查当前时间与上次更新时间的差值,如果它大于给定的阈值,例如1分钟,则对该ips_ckie作更新。显然,如果这个阈值等于0,则系统将对ips_ckie作不间断地更新。所谓更新,即重新产生一个随机数,并重新计算ips_ckie的数字签名,在重新计算tcp和ip的checksum之后,送给用户。
如果一个用户停止活动过长时间,则保存在系统中的有关该用户的会话记录将被清除,清理出的资源用于记录其他用户的会话过程。这就是说,SID的个数是由系统的存储容量的大小所决定的,即可存储会话记录的个数所决定的。有限个SID可以保证系统不会因为并发会话数过多而溢出。新增会话数过多产生的影响是使得每个会话可以允许的空闲时间减小。因此,当一个用户过了很长时间以后重新浏览被保护Web服务器时,系统将没有保留的拷贝与该用户请求中的ips_ckie进行比对。所以,系统只能通过验证数字签名验证其ips_ckie的有效性。由于ips_ckie中带有的SID已经过时,它可能已经被用于标识其它用户的会话过程,所以,在ips_ckie通过验证以后,需要给该用户分配一个新的、没有正在被使用的SID,这里记为SID′。系统在重新产生一个随机数、计算新的数字签名、并更新tcp和ip的checksum以后,发送给用户浏览器。
客户机至服务器方向的数据包分类处理的系统模块结构如附图6所示。数据包接收模块1是本系统的入口,将从Internet来的数据包存入大容量的内存DRAM 0,并将该数据包有关的描述信息存入速度较快的内存SRAM备用。分离HTTP模块2首先按照数据包的协议字段的值分离出TCP包,再根据其端口号,分离出具有HTTP协议端口号,默认的是80的HTTP包。然后按照HTTP请求的格式和关键词,例如GET,HEAD,POST等将HTTP请求与其它数据包区分开来,并送到后续模块分别处理。ips_ckie的匹配解析模块4通过检查DRAM 0存放的数据包中是否含有预设的ips_ckie的name,然后从DRAM 0存放的数据包中读取相应的SID′,PID′,R′,DS′字段,并将这些字段存放到寄存器中备用。
在找到ips_ckie以后,ips_ckie查验与分类模块6,将检查其数字签名,或整个ips_ckie,即同时检查用户标识PID和随机数R,与系统中保存的拷贝是否一致,或者与前一个拷贝是否一致。这主要是考虑到,在新的ips_ckie到达用户端之前,有些带有前一ips_ckie的请求可能已经离开用户浏览器,正在来到本系统。所以,在更新ips_ckie后的过渡时间内,过渡时间控制模块11还允许带有前一ips_ckie的请求通过。如果系统中没有拷贝与请求中的ips_ckie相符合,则说明系统中没有关于该用户会话的记录。所以要将该请求送给数字签名验证模块8,以验证其签名的合法性。
新旧ips_ckie查验表

由于具有合法数字签名的ips_ckie的请求,可能是被攻击者重放的合法用户的请求,所以需要对该ips_ckie作进一步检查,以确定它是否是重放的请求。检查办法是先由活动用户检验模块9检查该用户是否活动用户。即以LID为入口线性搜索该用户的PID是否在活动用户集内。如果是活动用户,则说明该用户已经开始了一个新的会话,所以它的旧ips_ckie只有在更新后的ips_ckie到浏览器的来回时间内有效,即由防重放时间控制模块10来检查新会话已经开始了多长时间。如果是非活动用户,则说明该用户是在停留了很长时间以后开始一次新的浏览过程。这时,可以给这个新会话过程分配一个新的SID,将该用户加入活动用户集内,并给该用户产生一个新的随机数和一个新的数字签名,形成一个新的ips_ckie。但考虑到本系统必须要对响应中的new_ckie的value做相同的改变,为了减少相同功能的模块在一个系统内重复,也为了节省对DRAM的访问时间,这里不对数据包本身做任何改变。所有的HTTP请求包都由发送模块12从系统的DRAM 0中调出并发送到去往被保护Web服务器的端口。
附图7为被保护Web服务器处理用户请求的软件模块结构示意图。被保护Web服务器15搜索用户请求中是否含有本系统设置的特殊cookie,即ips_ckie。如果没有,则是新用户请求。如果新用户请求的是动态内容或者是不可缓存内容,或者是其它要跟踪的页面,则在服务器响应模块16给该用户的响应中设置value等于全0的new_ckie。该响应中还可以包含被保护Web服务器自身所需要的其它cookies。如果用户请求中有本系统所设置的特殊cookie,则是旧用户请求。对于旧用户请求中的ips_ckie,被保护Web服务器在服务器响应模块17仅仅是将请求中的ips_ckie复制到HTTP响应中。new_ckie和ips_ckie的name基本上是相同的,只有标志位不同,以便于该字符串的搜索。这个字符串应该是一个非常特殊的、不易与其它字符串混淆的字符串,例如vErY_sPecIL_iPs_CoOkIE_NaME。HTTP响应的Cooke头,按照RFC2965,例如Set-Cookie2cookie1,cookie2,...,ips_ckie,其中cookie1,cookie2,...是被保护Web服务器根据自身需要设置的0到多个cookies;new_ckie、ips_ckie是本系统所需的cookies,具体的例子如下vErY_sPecIL_iPs_CoOkIE_NaME0="00......0";Version="1";Path="/dynamic_content"vErY_sPecIL_iPs_CoOkIE_NaME1="12340123456789ABCDEFrandom_numDigtal_signature";
Version="1";Path="/dynamic_content",
其中,第一个是new_ckie,第二个是ips_ckie,它们的name都是给定的特殊字符串vErY_sPecIL_iPs_CoOkIE_NaME,差别是最后一位,分别为0,1。其中,new_ckie的value是46个0,主要是用于给对value实际赋值留取足够的字节数。ips_ckie的value是″12340123456789ABCDEFrandom_numDigtal_signature″,它包含四个部分,前面4个字节是该用户在本系统中的SID,这里是1234;接着的16个字节是用户的永久标识PID,这里是0123456789ABCDEF;然后是10个字节的随机数,这里是random_num;最后是16个字节的数字签名,用于系统验证该ips_ckie的合法性。
服务器至客户机的数据包分类处理的系统模块结构如附图8所示,接收模块21,分离http模块22,ips_ckie匹配解析模块23,ips_ckie验证与分类模块24,活动用户检验模块27与客户机至服务器的处理过程的对应模块的功能类似。当它们从链路上收到从被保护Web服务器来的数据包时,首先检查数据包的源端口号,以便将HTTP响应包与其它数据包区分开来。如果是其它数据包则直接转发到Internet;如果是HTTP响应包则检查该包中是否含有本系统设置的ips_ckie的特殊名字。如果不含有这种名字,则直接转发到Internet;如果含有这种名字,则进一步检查该名字后的标志,以区分它是new_ckie还是ips_ckie。如果是ips_ckie,则是对旧用户请求的响应。所以需要进一步区分它是正在进行会话的新ips_ckie、该ips_ckie之前的一个旧ips_ckie、或者是通过SID索引找不到相同拷贝的一个ips_ckie。如果是无会话记录的ips_ckie,则检查它是活动用户还是非活动用户。由此将从被保护Web服务器来的数据包分成五种,以便分别采取不同的处理方式。
如果是new_ckie,则说明这是对一个新用户的HTTP响应,因此在获取新PID与SID模块29需要给该用户分配一个未被使用的用户永久标识PID。PID的分配由一个累加计数器来实现。然后就是从SID堆栈的底部获取一个新的SID,并由激活模块28将其记录到活动用户集内。同时由的SID堆栈管理模块30将这个新获取的SID从堆栈底部提升到堆栈的顶部。
如果是非活动用户,则表明这是旧用户新开始的一个会话过程的第一个请求,应该在获取新PID与SID模块29从SID堆栈的底部获取一个SID作为它的新的SID,并在激活模块28将其记录到活动用户集内。同时在SID堆栈管理模块30将这个新获取的SID从堆栈底部提升到堆栈的顶部。
如果是具有旧ips_ckie的活动用户,则说明该用户刚刚已经开始了一个会话过程,该请求是新的ips_ckie到达用户端之前过渡时间内到达的。与正在进行的会话中出现的旧ips_ckie一样,系统不能让它们所携带的旧ips_ckie回到用户端,以免覆盖之前送出的新ips_ckie。所以,由的旧换新模块26将旧ips_ckie替换为新ips_ckie。这在一定程度上还可以提高系统ips_ckie设置的可靠性。
如果是新ips_ckie,则由更新时间控制模块25检查它是否需要更新。如果需要更新,则在SID堆栈管理模块30进行SID堆栈的操作,即将该SID移到SID堆栈的顶部。如果不需要更新,则可以将该ips_ckie直接发送回用户。
新用户、新会话和须更新的cookies都要进行ips_ckie的重组,即在数字签名模块31重新产生一个随机数并重新计算数字签名以后,将它们替换成ips_ckie。在替换模块32重新计算TCP的checksum和IP的checksum以后,发送模块34将这些HTTP响应包送出到Internet,使之可以到达发出请求的用户。
权利要求
1.一种对用户进行区分和跟踪的中间系统,连接于服务器前端、在客户机访问服务器的必经之链路上,其特征在于采用长期标识PID和短期标识SID相结合的方式区分及跟踪访问服务器的用户;所述长期标识PID是所述中间系统赋给每个访问服务器的用户的唯一且永久性的标识,通过PID对用户进行长期跟踪;所述短期标识SID是所述中间系统赋给正在与服务器会话的每个活动用户的临时标识,通过SID对活动用户进行快速区分,并以SID为索引对用户会话状态记录进行高效管理;通过附加的经常变化的随机数和数字签名,对传输过程中的PID和SID进行完整性保护。
2.根据权利要求1所述的对用户进行区分和跟踪的中间系统,其特征在于所述中间系统采用在用户端和服务器之间截获会话数据包、并对其中的部分字段进行改写的方式来携带所述的长期标识PID和短期标识SID,所述的会话数据包是在可以透过防火墙、代理服务器、网络地址转换器进行的用户与服务器之间的应用层会话过程中所传输的数据包,所述数据包中的部分字段是应用层会话过程中可以到达用户端又可以从用户端返回的内容。
3.根据权利要求1或2所述的对用户进行区分和跟踪的中间系统,其特征在于区分用户的方法是根据数据包中是否携带PID将用户分为旧用户和新用户;所述新用户是第一次到访,还没有分配PID和SID的用户,所述旧用户携带有PID和SID;所述中间系统通过二维向量(SID,PID)又将旧用户分为活动的和不活动的用户,所述活动用户是正在与服务器进行会话的用户,其具有有效的二维向量(SID,PID),且可以通过SID为索引进行快速查验,所述不活动用户是很长时间没有发出请求包的用户,其SID已被中间系统收回并分配给其他活动用户。
4.根据权利要求3所述的对用户进行区分和跟踪的中间系统,其特征在于所述中间系统在收到一个不活动用户开始新会话过程的第一个请求时,将该用户的PID记录下来,用于标记该用户已经处于活动状态,并用于对用户活动状态的快速检测,所述标记和快速检测用户活动状态的方法是将PID的低位数取出,所取出的低位数与SID的位数相同,记为Last(PID),并且对于一系列具有相同Last(PID)的活动用户,采用一个线性搜索列表来记录,所述线性搜索列表采用如下格式活动用户列表入口 活动用户列表
其中PID,PID1,PID2....,PIDn都具有相同的LID,即入口,用BGN和END表示该线性搜索链的开始标志和结尾标志。
5.根据权利要求3所述的对用户进行区分和跟踪的中间系统,其特征在于所述的SID被作为所有记录操作的索引,所述记录就是对用户进行跟踪的数据,并且存放记录的缓冲区通过SID的重复使用来进行管理,所述管理方法就是由缓冲区的大小和每条记录的长度确定SID的最大数,再采用堆栈对SID的使用进行管理,所述SID堆栈的管理方法就是先将所有的SID依次压入堆栈,然后在每次为活动用户分配一个SID时,都从堆栈的底部取出一个SID,将它赋给活动用户之后又将它压入到堆栈的顶部,并且在每次对用户记录进行操作时,都将该用户的SID从堆栈中取出,再将它压入到堆栈的顶部,使得堆栈底部的SID代表的是最长时间没有活动的用户,因而可以被重新使用,所述SID堆栈的构成方法如下TOP.dwn=SID1,SID1.dwn=SID2,...,SIDn-1.dwn=SIDn,SIDn.dwn=BTM;BTM.up=SIDn,SIDn.up=SIDn-1,...,SID2.up=SID1,SID1.up=TOP其中,TOP和BTM是两个与SID类似的地址,但不在SID集合内,SID堆栈的结构如下SID堆栈表
6.根据权利要求1或2所述的对用户进行区分和跟踪的中间系统,其特征在于通过利用SID经常变而PID不变的特性将SID和PID捆绑使用来防止伪造SID和PID,由所述中间系统以SID为索引将这种捆绑关系记录下来用于查验数据包中所携带的SID和PID的合法性,并丢弃不合法的数据包,所述SID经常变的特性是指每次用户由不活动状态变为活动状态都会被随机地赋予一个闲置的SID,所述SID经常变的特性可以通过串接一个更经常变化的随机数R以加大变化的频率,也可以附加一个数字签名DS对其完整性进行保护和验证。
7.根据权利要求1或2所述的对用户进行区分和跟踪的中间系统,其特征在于根据数据包中所携带的字符串SID‖PID‖R‖DS将其分为合法的和过时的,并将过时的数据包滤除掉的方式来防重放攻击,所述合法的数据包是满足以下两个条件之一的数据包带有当前有效的所述字符串,或者在当前有效的所述字符串到达用户端之前已经带有前一个有效的所述字符串。
8.根据权利要求1或2所述的对用户进行区分和跟踪的中间系统,其特征在于所述的数据包中的长期标识PID和短期标识SID存在于对用户与服务器之间的正常会话过程没有影响的字段中,所述的没有影响的字段是由被保护服务器预留的冗余的字节空间,由所述中间系统负责填入、读取和修改所需的内容。
全文摘要
本发明提供了一种适合于中间系统的快速安全的对用户进行区分和跟踪的技术,包括揭示用户的长期标识与短期状态相结合的用户区分方法、这种长期标识与短期状态的携带和记录方法、用于记录状态的内存的管理与重复使用方法、用户的激活方法、系统的实现原理及其安全措施等。本发明适用于在被保护Web服务器前端构建一个安全防御系统或者一个分类控制系统,利用本发明提供的对用户的快速安全区分技术,进一步实现对各个用户行为的跟踪和分析,进而实现有区别的服务、速率控制和过滤等。
文档编号H04L9/32GK1794656SQ20051012108
公开日2006年6月28日 申请日期2005年12月29日 优先权日2005年12月29日
发明者余顺争 申请人:中山大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1