Java安全机制在移动Agent中的应用

  • 来源: 计算机与信息技术 作者: 若水   2008-05-07/15:33
  • 摘 要 移动Agent技术已成为计算机网络和分布式系统最具活力的发展方向,但在复杂的网络环境下,移动Agent对安全性提出了特殊的要求。本文介绍了移动Agent所带来的安全隐患、讨论了Java语言的安全机制,最后给出了用Java安全机制解决移动Agent安全问题的方法。虽然Java的安全机制本身存在一些不完善的地方,但随着其进一步改进,Java的安全机制将为移动Agent的应用提供更有力的保障。

    关键词 移动Agent, Java,安全

    引言

    随着Internet覆盖范围的日益扩大,有价值的信息资源在不断的增长,对网络的高效性、智能性、主动性和灵活性提出了更多的要求,对于如何捆绑分布异构环境中信息源的问题变得越来越突出。在网络分布式系统的实际应用中,一般采用Server/Client结构,在这种结构中,运行于Server和Client上进程间的通信是通过信息传送和远程过程调用(RPC)实现的,一般是同步实现的,即Client向服务器发出请求后就挂起本地进程而等待结果,远地Server按要求执行完所要求的数据处理后返回结果,当本地进程得到结果后就恢复运行。移动agent是这些概念的延伸,它是一个由Client向Server发送的一个程序,包括了代码、数据和执行逻辑。移动agent不必把结果返还给客户机,它可以迁移到其它服务器,把信息传回给源客户机,也可以通过适当安排迁移回源客户机。因此,与简单的过程调用相比,移动agent具有更强的自治性。它很好地解决了网络通信的瓶颈问题,增加了任务处理的并行程度,增强了系统的灵活性、可扩充性及容错能力。因此移动agent己经逐渐应用到各种分布式网络中,相信移动agent在未来的军事信息安全、企业信息传输安全保密方面会有好的发展前景。

    移动Agent技术应用范围日益广泛,随之而来的系统安全性问题也就日益突出。本文对移动Agent系统中的主要安全威胁和Java语言的安全机制做了细致的分析,提出了利用java安全机制解决移动Agent安全问题的方法。

    移动agent 的安全问题

    虽然移动Agent技术具有很多优点,但是一个严峻的问题——安全却阻碍了它的应用。移动Agent可以把多台分布的计算机连接起来,构成一个计算基础设施,在其上可同时运行属于不同用户而且是潜在的不可信任用户的分布式应用程序。这些计算机分别属于不同的组织,有各自不同的用途,通过公共通信设施进行通信。在这样的环境下,存在着各种可能的不安全因素以及安全攻击。例如,未被授权的用户可以监听网络线路,在移动Agent 传输过程中窃听甚至修改其代码或数据;当 Agent 运行时,可能会攻击当地的主机,故意占用过多资源,或者利用系统中的漏洞取得特权,进而攻击主机或其它Agent 等等。归纳为如下几类:

    第一类安全问题主要是恶意的或者是有错误的 Agent 利用主机上安全设施的不足或缺陷发起针对主机的攻击,主要有伪装、拒绝服务和未授权访问。

    第二类问题是指 Agent 可能会利用系统的缺陷对在主机上运行的其它Agent 进行攻击,包括伪装、未授权访问、拒绝服务和抵赖。其实这个问题可以看成是第一类问题的子问题,首先,因为主机上的Agent 支持环境可能就包含一些 Agent,如负责通信的Agent,管理 Agent 名字空间的Agent 等,对这类Agent 的攻击等于是对系统进行攻击。其次,可以把主机上运行的Agent 看成是主机的一部分资源,Agent 对其它Agent 进行攻击也就是对主机的攻击。再次,从目前已有的安全措施来看,解决这两类问题所使用的技术十分类似。

    第三类,在移动 Agent 环境下,不仅可能会有恶意的 Agent,而且也会存在恶意的主机对 Agent 进行破坏。由于 Agent发送到主机后要在其上运行,它的代码和数据以及运行时刻的通信对主机来说都是暴露无疑的,可以说主机为刀俎,Agent 为鱼肉,主机可以对 Agent 采取任何动作,所以保护 Agent 是所有问题中最困难的。也正因如此,才吸引了许多人花费大量的精力进行研究。

    第四类,Agent 可以在一个站点上只消耗少量的资源,其行为也完全符合站点的安全策略,但它却暗中以隐蔽的方式破坏着网络的可用性,进而会使一些主机瘫痪。如恶意移动Agent不断地复制自身,产生大最的移动Agent,并让它们在网络上来回流动,从而大量染耗系统的通信与计算资很,并可能最终导致运行环境的瘫痪。对这类攻击的防治也比较困难,从单个主机着手显然不能解决问题,必须从网络整体考虑。当网络从属于一个管理者时,网络上的各个主机之间比较信任,找到一个统一的方法相对来说还容易一些,否则,在像 Internet 这样无中心、无权威的网络上,困难就会大得多。

    Java语言的安全机制

    移动Agent需要在不同的主机上迁移,这样异质的环境下,移动Agent需要有可移植性,能在不同的主机上执行,因此,像JAVA这样的语言具有平台无关性、动态类装载、多线程和对象序列化等特点,使用相关的Java安全机制解决移动Agent的安全问题便是最佳的选择。

    在Java中能够安全地运行通过Internet传递的各种Applet,正因为如此,Java不像别的语言和系统,在事后才想到要实现安全性,或者作为一种对应措施,插入一些安全性组件,安全机制是Java技术的一个不可分割的组成部分。

    1、Java沙箱 (早期安全机制)

    Java安全模式的重点在于保护最终用户不受从网上下载的破坏性程序的干扰。为达到这个目的,Java提供了一个专用的运行Java程序的沙箱。 安全模型的关键在于沙箱(sandbox)的概念。其思想是,若在主机上允许驻留一个程序,就必须为该程序提供一个“玩耍”的场所(即运行环境),但是一般情况下,必须保证程序限制在沙箱中,Java程序在它的沙箱内可做任何事情,但出此边界就不能有任何操作。例如,未经确认的Java Applet的沙箱禁止许多操作,其中包括:

    禁止对本地磁盘的读写;

    除了下载此Applet的主机外不能与任何别的主机连接;

    禁止建立一个新的进程;

    禁止载入一个直接调用本地方法的新的动态库。

    通过限定下载代码的可执行操作的范围,在经过字节编码检验器、类加载器和安全管理器检查使得Java程序高效而安全。Java安全模式可使用户免受破坏性程序的威胁。#p#分页标题#e#

    2、Java2所引入的新的安全机制

    随着Java程序的复杂化、实用化,必须要脱离沙箱运行。核心 Java 2 平台提供了 Java 安全的基本功能:

    · 可配置的安全策略可以防止Java程序非法读取文件,或非法建立与其它主机的网络连接,或在未经允许的情况下访问打印机等等。此策略建立在Java的存取控制机制上,相应的存取控制器则依赖于Java的类装载器、安全管理器和语言保护等安全机制。

    · 要判定程序所读取的数据是否被修改过,可以简单地利用生成消息摘要的方式来实现,但这种方式安全性并不很高。

    · 如果对完整性要求很高,那么可以生成数字签名(digital signature)来检测程序所读取的数据是否被修改过(或者在发送数据时,使接收数据的一方可以检测数据在传输过程中是否被修改过)。

    · 密钥管理系统可以管理数字签名时用到的密钥。

    Java2引进了一种改进的新型安全结构,主要组件包括:访问权限、安全策略、保护域、访问控制检查器、对象级的安全等。

    Java提供了三种标准Java扩展包:JCE(Java Cryptography Extension,Java加密扩展包)、JSSE(Java Secure Sockets Extension,Java 安全套接字扩展包)和JAAS(Java Authentication and Authorization Service,Java 鉴别与授权服务)。它们所提供的技术都为Java的安全性助了一臂之力

    利用Java解决移动agent 的安全问题

     

    Java不仅提供了一套安全机制,而且由于移动Agent中的很多功能在Java中有直接的对应实现,Java具有丰富的支持对象串行化、支持远程方法调用以及映射的库。移动Agent状态的移动可以用Java对象的串行化表示;Agent代码的移动用字节码的传递和加载;Agent运行上下文用方法的控制流表示。因此Java是开发移动Agent系统的优先选择。本文利用Java所提供的安全模型,提出了一些解决移动Agent系统安全问题的措施。

    1、利用Java的字节码验证器保证Agent的正确性

    字节代码验证器保证只有合法的代码才可以执行,“合法”的具体含义如下:

    · JVM对类文件中的代码作了严格的格式和结构限制;

    · 验证器也核查是否违反内存管理规定、堆栈下溢或溢出、以及非法数据类型的丢弃。

    字节码验证器可以检测Agent的程序代码是否被破坏,然后采取相应的措施。但是由于Agent本身需要和服务器交换数据,这对于数据窃取和篡改的检测来说是一个难点。可以使原始状态数据只能读取,已查询到的结果加密起来,只对某台特定主机可见,而其它主机不能访问。并且可以建立可信主机列表来让Agent避免到不能保证安全的运行环境上运行,但这要求提供评价各主机可信度的方法,同时这也是同Agent的移动性相抵触的。

    2、利用Java的类装载器、命名空间和线程组来实现动态agent的隔离

    当执行一个Java程序时,该程序可能需要从网络上装载一到多个类。如果传送过来的代码顺利通过了字节码检验器的检查,并被确认为完全正确,那么下一道安全防线就是Java类装载器。

    所有Java 类都是通过一个或多个类装载器实现载入的。类装载器可以程序化地设置其载入类的权限。JVM对每个它所载入的类都记下了是用哪种类载入程序装入的,当一个被载入的程序引用另一个类时,虚拟机要求用同一个类载入程序装入被引入的类。

    因为JVM用这种方法装载类,在默认条件下某个类只能看见用同一个类载入程序装入的其它类。Java体系结构用这种方法在单个Java应用中建立多个命名空间。命名空间是一些由特定的类载入程序装入的类的独一无二的名字集合。JVM为每个类载入程序维护一个命名空间,所有由该类载入程序装入的类的名字组成了这个命名空间。

    Java应用能使多个类载入程序对象实例化,不管它是否来自同一个类。因此它能根据需要建立多个类载入程序对象。用不同的类载入程序装入的类在不同的命名空间中,并且除非明确许可外都不能互相访问。因此在开发Agent系统时,可以把从不同来源载入的类隔离到不同的命名空间中。这样一个Agent不可能用它自己的类冒名顶替另一Agent的类,可以防止破坏性代码访问正常的代码,从而保证了Agent之间的安全。

    每当一个新Agent到达后,就为其建立一个线程组。Agent在执行中可能会派生一些新线程,或者有多个Agent并发执行某任务,为安全需要,这些新线程必需是属于该Agent线程组的。这样,任何执行该Agent的线程其组号是相同的。那么,只要为这个线程组分配权限,即就为该Agent分配了权限,就实现了Agent与主机的隔离。

    3、利用Java网络软件包实现agent的传输与验证

    Java网络软件包提供了处理各种网络协议(如FTP、 HTTP和Telnet等)的用户接口,其安全保障是用户在网络接口级的最前沿防线。用户可以按自己的需要来设置网络访问权限。这些权限级别有:

    · 禁止所有的网络访问;

    · 只允许访问输入代码的源主机;

    · 设置防火墙。对来自防火墙以外的代码,只允许其访问防火墙之外的网络;

    · 允许所有的网络访问。

    根据Sun公司的承诺,在网络接口级,今后的Java版本将采用公开密钥法以及其它加密技术来核实从网络上传输过来的代码的源主机以及代码的完整性。

    授权也就是给Agent对主机资源相应地进行某些操作的权限。只有具有对资源的操作的权限,Agent才可以访问对应的资源。

    Agent主机要对外来的Agent的身份进行验证,确定其是否为可信任的Agent。数字签名可以证明代码或者数据的来源,能防止抵赖,确保信息的完整性。带数字签名的Agent除了代码和数据外,还要附上代码编制者或者发送者的数字签名,这样不仅可以确保在传输过程中没有被篡改,而且如果该Agent的执行引起了安全事故,用户可以根据签名信息追踪到肇事者。

    Java提供了RSA、DSA、MD5等大量的加密算法类,此时网络上的移动Agent可看作一个个签名对象和密封对象,并且能够通过安全算法管理器来更新安全算法库;同时还可以将Java加密扩展机制和Java安全套接字扩展机制结合来实现将Agent代码数据进行压缩后加密处理,然后通过SSL(Secure Socket Layer)协议进行传递。这样经过压缩不仅降低了网络流量,而且也大大增加了破译该数据的难度。#p#分页标题#e#

    数字签名与验证可以结合Java认证和授权服务来实现。JAAS的身份验证组件能够可靠并安全地确定目前谁在执行Java代码,而JAAS的授权组件根据用户和源代码来限制用户执行操作,从而也扩展了Java的安全模型。

    结束语

    移动agent是一种比较新的技术,在大规模、分布式、跨平台的应用中,移动agent有特有的优势。但是应当指出,代理技术,尤其是移动代理技术目前还未成熟,其管理、通信机制、移动、人工智能以及安全等诸多方面需要进一步研究。它的网络安全问题尤其重要,移动Agent安全问题的复杂性不是仅仅依靠Java就可以解决的,在文中只不过讨论了与之相关的部分。Java提供了一个可以容忍的安全模型,对其加以修改提出了一个参考实现,具体运行中还要根据实际情况编写不同的安全策略。随着其不断改进,移动Agent系统的安全性问题也将得到逐步的解决。


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多