· 可配置的安全策略可以防止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的安全性助了一臂之力。
4 利用Java解决移动agent 的安全问题
Java不仅提供了一套安全机制,而且由于移动Agent中的很多功能在Java中有直接的对应实现,Java具有丰富的支持对象串行化、支持远程方法调用以及映射的库。移动Agent状态的移动可以用Java对象的串行化表示;Agent代码的移动用字节码的传递和加载;Agent运行上下文用方法的控制流表示。因此Java是开发移动Agent系统的优先选择。本文利用Java所提供的安全模型,提出了一些解决移动Agent系统安全问题的措施。
4.1 利用Java的字节码验证器保证Agent的正确性
字节代码验证器保证只有合法的代码才可以执行,“合法”的具体含义
· JVM对类文件中的代码作了严格的格式和结构限制;
· 验证器也核查是否违反内存管理规定、堆栈下溢或溢出、以及非法数据类型的丢弃。
字节码验证器可以检测Agent的程序代码是否被破坏,然后采取相应的措施。但是由于Agent本身需要和服务器交换数据,这对于数据窃取和篡改的检测来说是一个难点。可以使原始状态数据只能读取,已查询到的结果加密起来,只对某台特定主机可见,而其它主机不能访问。并且可以建立可信主机列表来让Agent避免到不能保证安全的运行环境上运行,但这要求提供评价各主机可信度的方法,同时这也是同Agent的移动性相抵触的。
4.2 利用Java的类装载器、命名空间和线程组来实现动态agent的隔离
当执行一个Java程序时,该程序可能需要从网络上装载一到多个类。如果传送过来的代码顺利通过了字节码检验器的检查,并被确认为完全正确,那么下一道安全防线就是Java类装载器。
所有Java 类都是通过一个或多个类装载器实现载入的。类装载器可以程序化地设置其载入类的权限。JVM对每个它所载入的类都记下了是用哪种类载入程序装入的,当一个被载入的程序引用另一个类时,虚拟机要求用同一个类载入程序装入被引入的类。
因为JVM用这种方法装载类,在默认条件下某个类只能看见用同一个类载入程序装入的其它类。Java体系结构用这种方法在单个Java应用中建立多个命名空间。命名空间是一些由特定的类载入程序装入的类的独一无二的名字集合。JVM为每个类载入程序维护一个命名空间,所有由该类载入程序装入的类的名字组成了这个命名空间。
Java应用能使多个类载入程序对象实例化,不管它是否来自同一个类。因此它能根据需要建立多个类载入程序对象。用不同的类载入程序装入的类在不同的命名空间中,并且除非明确许可外都不能互相访问。因此在开发Agent系统时,可以把从不同来源载入的类隔离到不同的命名空间中。这样一个Agent不可能用它自己的类冒名顶替另一Agent的类,可以防止破坏性代码访问正常的代码,从而保证了Agent之间的安全。
每当一个新Agent到达后,就为其建立一个线程组。Agent在执行中可能会派生一些新线程,或者有多个Agent并发执行某任务,为安全需要,这些新线程必需是属于该Agent线程组的。这样,任何执行该Agent的线程其组号是相同的。那么,只要为这个线程组分配权限,即就为该Agent分配了权限,就实现了Agent与主机的隔离。
4.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)协议进行传递。这样经过压缩不仅降低了网络流量,而且也大大增加了破译该数据的难度。
数字签名与验证可以结合Java认证和授权服务来实现。JAAS的身份验证组件能够可靠并安全地确定目前谁在执行Java代码,而JAAS的授权组件根据用户和源代码来限制用户执行操作,从而也扩展了Java的安全模型。
5 结束语
移动agent是一种比较新的技术,在大规模、分布式、跨平台的应用中,移动agent有特有的优势。但是应当指出,代理技术,尤其是移动代理技术目前还未成熟,其管理、通信机制、移动、人工智能以及安全等诸多方面需要进一步研究。它的网络安全问题尤其重要,移动Agent安全问题的复杂性不是仅仅依靠Java就可以解决的,在文中只不过讨论了与之相关的部分。Java提供了一个可以容忍的安全模型,对其加以修改提出了一个参考实现,具体运行中还要根据实际情况编写不同的安全策略。随着其不断改进,移动Agent系统的安全性问题也将得到逐步的解决。
参考文献
[1] 朱向华,万 燕,孙永强.移动代理系统的安全机制[J].计算机工程,2001,27(1):137-139.
SUN公司.Java软件包开发工具(JDK)文档[M].美国:SUN公司,2002.
李新等.软件Agent的安全性研究.计算机科学,1998,25(4):54-56
陶先平,吕建,张冠群等.一种移动agent结构化迁移机制的设计和实现.软件学报,2000,11(7):918-923.
SUN Microsystem.Java Core Reflection[EB/OL].
http://www.java.sun.com/products/jdk/1.2/docs/guide/reflection/spec/java-reflection.dc.html,1998
WANG JIi-yong,WEN Tao,LI Chun-guang.A security architecture model of mobile agents based on Java[J].Computer engineering and application,2000,36(10):141_144