3 详细解决方案
3.1 系统模型
我们充分利用了Filter技术,实现了管道式的过滤机制。通过Filter链的配置,可以根据用户对服务器的不同请求达到特定的身份认证、访问控制、访问跟踪、审计日志记录等功能。同时,基于对CC 准则的研究,我们提出了如下的审计模型:

图1 安全审计系统模型
规则管理:为保证系统在有安全保障的条件下有效运行,我们为审计管理员提供了详细的规则管理,包括对来访IP的过滤,对特定注册用户的过滤,对恶意刷新(可自定义设置次数/秒数)的屏蔽等。
审计事件鉴别:在实施审计过滤体系前,我们需要对审计事件进行鉴别,以确定哪些事件需要重点审计,据此来配置相应的过滤器链,开发相应的审计事件记录组件等。
报警处理及报警行为:对于违规访问及恶意刷新,系统会进行报警处理,自动提取来访IP或用户名,将其置入危险IP库或者拒绝服务用户库,再次地访问将被服务器拒绝,同时,系统将向审计管理员发出Email以提示系统可能潜在的危险。
日志采集:日志采集完成了安全审计的核心功能。在本项目中主要实现了在线日志采集和离线日志显示。在线日志通过访问者的SessionID可以得到用户访问的序列,而离线日志则会利用Filter过滤器组件或者数据库层触发器,存储审计日志于数据库中。
审计事件日志:审计事件日志采用数据库存储,重要包括用户的访问日志,如会话标识符、用户名、IP地址、资源URL等主要信息,以供审计使用。
安全审计报告:安全审计模块要为管理员提供各种查询统计的接口,以做到有效的追踪,对具体操作的有据可考。具体包括:对各类别日志的自定义模糊查询、提取高频率信息流、对大量访问日志的挖掘分析、对海量日志的转储方案等。
同时,日志作为安全审计系统得到的核心数据,考虑其安全性也是十分必要的,方案中通过数据库系统设置和文件过滤器的配合,来控制对日志物理文件的访问,以确保日志文件不被非授权访问和篡改。
3.2 管道过滤器体系的实现
在安全审计模型中,我们充分利用了管道过滤器体系结构。通过这种方式,可以配置完整的过滤器链,对应用系统的访问进行有效安全控制、过滤和审计事件采集。下面的配置文件说明了如何通过应用服务器来对应用系统资源进行过滤器配置:
<filter>
<filter-name>RefreshFilter</filter-name>
<description>恶意刷新过滤器</description>
<filter-class>cn.gov.bjmi.filter.RefreshFilter </filter-class>
</filter>
<filter>
<filter-name>IpFilter</filter-name>
<description>危险IP过滤器</description>
<filter-class>cn.gov.bjmi.filter.IpFilter</filter-class>
</filter>
……
3.3 过滤器的具体实现
上节讲述了如何来构建过滤体系,接下来我们来看看如何具体实现一个Filter。笔者使用的开发环境是Netbeans 5.0,它可以方便使用图形化界面来对web.xml进行配置,从而可以在其内方便地配置过滤器体系结构,避免了手工配置的错误。下面我们来看看如何实现上节提到的IP过滤器,来过滤危险IP,并同时获取非受限用户的访问记录。
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {HttpServletRequest req = null;
HttpServletResponse res = null;
if(request instanceof HttpServletRequest && response
instanceof HttpServletResponse) {req = (HttpServletRequest)request;
res = (HttpServletResponse)response;
}
//获取客户端IP
String remoteAddr = request.getRemoteAddr();
if(!req.getRequestURI().toUpperCase().equals("ERR.JSP")) {
IP ipControl = new IP();//这里是我们定义的IP类
try {
if((remoteAddr != null )
&&(ipControl.IsRestricted(remoteAddr))) {
res.sendRedirect("/err.jsp?errmsg=ip");
}
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
chain.doFilter(request, response);//过滤器链传递
}
我们只需要在定义一个类的时候,使用 implements Filter让该类实现Filter接口即可,就可以在doFilter方法内实现自己的逻辑控制,它就像client和server之间的一道防火墙,你可以在请求到达服务器之前进行对客户端请求的定制响应,或者进行自定义的业务逻辑,是Java Web开发领域一项常用的技术。
4 结论
我们在实际项目中的电子政务系统提出了良好的安全审计模型,通过过滤器体系获取了格式良好、可利用性高的日志记录,并充分、深入地进行了统计分析和挖掘,为发现系统漏洞和提高系统性能提供了良好的数据支持,并为网络犯罪行为的事后调查取证提供了证据。