您现在的位置: 万盛学电脑网 >> 网络安全 >> 安全资讯防护 >> 正文

用日志与监控构建安全的应用程序

作者:佚名    责任编辑:admin    更新时间:2022-06-22

 本篇文章根据作者多年来对数百万行代码执行安全分析,得出了在应用层日志方面的脆弱现状。文章讨论了在应用程序的安全方面,日志常常被忽略,并证明了应用程序通过实时的安全检查可以获得许多好处。文章提出了一个可操作的执行思路,并提供了相关的风险和成本分析。

  应用程序安全的推动力

  开发人员与安全人员开始重视安全编程的实践,实际上,IT厂商也正在利用这个趋势来向用户保证应用程序与基础设施的安全性。然而不幸的是,许多人认为访问控制和加密差不多囊括了应用程序安全的全部领域。

  实际上,一些其它的领域也包含在应用程序安全中。OWASP Guide是识别这些领域的一个很好的出发点。工业界的开发小组对OWASP-identified领域有着不同的认识。例如,大部分开发者都已经认识到他们不能开发自己的加密算法,然而很少人意识到用伪随机数产生器(例如java.util.Random)产生Session IDs所带来的问题。另外一个被很多人忽视的特别领域就是日志与监控。

  检测应用层的攻击

  在一个典型的企业环境下,几乎很少应用程序内置了检测并通知潜在恶意行为的功能,相反,这些软件依靠基础设备,如防火墙,来执行这个功能。但是,不可避免地会存在一些攻击,它们可能绕过设备的保护机制:例如,来自内部网络的拒绝服务攻击,或者绕过客户端的验证并被企业网络认为合法流量的攻击。当然阻止其中的一部分攻击是网络层的入侵检测系统和入侵阻止系统的任务,但是随着网站服务的出现、内部网络和网络边界合作访问的发展,单独的IDS/IPS系统可能不足以检测出这些攻击。

  当然,为每个应用程序定置一个入侵检测引擎,这是不切实际的。实际上,这种配置入侵检测引擎的方法与应用程序安全的原则相矛盾:“要安全地编程,而不是另外再编写一个安全工具”。一种更可行的办法是:使用一个日志文件分析引擎来实时地读取日志文件,运用智能的规则来查找攻击模式。这类工具已经存在,如Sawmill和Network Intelligence,它们并不是为某个特定的应用程序日志文件分析而设计,通过配置,它们能满足多个应用程序的需求。本文并不深入讨论这些工具;本文的重点是如何使应用程序符合这些工具的要求。大多数应用程序缺乏的是用标准的格式和协调的方法来记录日志,使得分析引擎能够从日志文件中提取有用信息。

  实例一:应用程序中的认证日志

  许多应用程序,包括那些符合CMM Level 5组织的应用程序,都在使用并不协调的日志模式。下面的例子展示了一个Java程序通过Log4J来记录非法验证请求的过程。需要注意的是,在C#.Net领域,这个例子必须采用Log4net而不是Log4J。本文假设已经在使用一些日志工具,如何配置和部署这样的工具在此并不作讨论。

  if (!request.password.equals(result.password))

   { //user supplied wrong p/w

   log.debug("Invalid access attempt for " + request.usernane + "

   with password " + request.password);

  ...

  同一个应用程序在用户认证模块可能采用下面这个不同的接口:

  if (myRequest.getPassword() != data.getPassword()) {

   log.info("Login failed");

  ...

  除了没有对密码进行加密这个明显的安全漏洞之外,上面的编码方法还有一些其它的问题:

  两个例子采用不同的日志等级(“debug”和“info”)来记录失败的认证尝试。这就意味着每个程序员必须单独决定一个日志事件的敏感度。当一个程序员认为这是一个调试事件时,另一个程序员可能认为它稍微有些重要于是把它确定为第二级(“log”)日志,这就意味着这些事件将写到不同日志文件中。对失败认证尝试的相关分析将会变得很复杂甚至不可能。

  两个例子使用了不同的语法。这将再次归因于每个程序员在记录日志时的个人习惯。许多程序员把低级日志当作调试信息的扩展,并不遵循相关的标准。上面的例子仅仅展示了两个程序员输出的不同;在实际的应用程序开发中,可能有几十个、几百个甚至几千个程序员都采用他们各自的语法,这将导致分析这些信息会是一个可怕的事情。而且这也无法保证如果日志发生改变,在软件新版本中这些分析将仍然有意义。