安全的代价

1/5/2008来源:Java教程人气:7252


内容:

安全模型
安全准则
关于作者

java的力量是不容置疑的,但安全问题也是开发者的关注焦点. 本文将权衡其益处与随之而来的危险.
如今,Internet正在显著的改变着我们的生活与工作方式.

即使那些最狂热的愤世嫉俗者也会承认,在不远的将来,我们的指尖将控制这个世界。然而,对于生活的各个方面,新的自由并不会毫无代价的就可获得。所以,随之而来的问题会让人相当头痛的。对于那些在网上冲浪的人和不断扩大网上业务的公司来说,安全已经成为他们的一个按语。在Internet上,只要有一扇开着的门,我们便要找到一把防止各种恶意攻击的钥匙。下面是一些很普遍的例子:

一种毁坏硬盘数据的病毒。.
一个落入恶人之手的信用卡号码.
被窃取的客户清单.
一些新的Internet执行模式正逐渐为人所关注:下载程序的时代已经到来。是的,从表面上看,理智的个人从未知的站点下载他们未见过的程序,使他们的系统有勿庸置疑的访问权限。

Java作为一种为Web而产生的语言,正冲在计算浪潮的最前沿。applet已被添加到计算机科学词汇中,这充分说明了Java的巨大成功。一个Java applet正如它听上去那样:一个从远程主机处下载,并在本地机器上执行的小程序。 这种新结构无疑会有很多功能,但安全问题也随之而来。

任何一个人假如在使用浏览器,并在浏览一个包含applet的网页,他便在使用Java。而且,applet会将你暴露在更加复杂的攻击之下,如:

黑客编写一个似乎是本地的、可信赖的applet。这种漏洞需要两个技巧:黑客要设法将程序放到用户的本地硬盘上(利用一般浏览器的特点:文件缓冲) ,并骗过浏览器使之以一个applet调入。
黑客利用Java DNS翻译处理的弱点:黑客设法骗过 runtime环境,使之认为他的系统是一个可信赖的主机。然后初始化一个突破牺牲品的防火墙网路连接。

若基于applet的计算已成为Internet生活的一个实事,那么重要的问题应该为:

好的安全保障由什么构成
对执行环境的依靠程度到底应多大?
充分的安全保障的成本有多大?

让我们从显而易见的问题开始:真正安全的系统是没有任何外部访问能力 (如电话线、 LAN连接等) 并在一封闭环境中保持锁定和警戒。显然,这样的系统对用户的价值相当有限。所以,安全问题归根到底是对一种危险的分析,是Internet访问带来的益处和疏漏导致的后果的权衡。但是,权衡危险必须建立在理解安全模型的基础之上。这对下载环境尤为重要:因为你不知道一个applet会干些什么,你毫无办法,只有依靠Java内置的安全特性。但你能这么放心吗?

安全模型
Java的安全模型被分为三个主要的防范区域: Byte-code验证器、 类装人器和安全治理器。虽然我们将逐个的讨论,但注重到这三个部分是Java运行环境执行模式的一个整体是非常重要的。也就是说,它们在Java设计时是相当重要的,而不是一种追思。

编译后,Java原代码被转换成为独立与平台的字节代码。applet安全便开始与Byte-code验证器,它将:

保证编译后的代码格式正确。
对每个成员函数进行检查以确保其字节代码不会违犯访问类型限制和指针寻址规则(见下文)。

通过验证后,以下几点将得到保证:

Internet堆栈不会发生溢出或下溢。 (若两种情况中的一种发生,系统的稳定程度下降,黑客也将得到“混水摸鱼”的机会。) 这种类型的攻击都是针对一些很闻名的安全疏漏的。
不会发生非法数据转换 (验证器不答应整数作为指针来处理)。这点保证了变量不会访问限制访问的内存区域。
字节代码指令将有正确类型的参数 (与上面的原因相同)。
在一个对象的内部,只有公共数据和函数才可被访问。限制对所有部件的访问,所以属性数据保持为私有的。
另一个防范领域, Java类装入器,决定了类(代码)将如何(和何时)被调入。它许多重要功能中的一项就是要确保在运行环境中正在执行的applet不会取代系统级的部件。这个部分是由浏览器生产商提供---通常它是基于由Sun Microsystems公司提供的模板

Java安全模型的第三个,同时也是最重要的部分便是安全治理器。它的任务对所有所谓“危险方法”(要求文件输入/输出、网络访问或想要定义一个心得类装入器)进行 runtime验证。其中包括:

治理所有的socket操作。
控制对操作系统线程的创建和访问。
阻止新的类装入器的安装。
治理对文件的访问 (显然,我们不想让applet随便阅读文件l)。

为保证安全,基本Java类库(由Sun提供的)中的所有的方法必须在执行任何危险操作之前得到安全治理器的许可。安全治理器对任何请求都有否决权。

在未来的日子里,Java的安全模型还会不断的发展---堵住已被发现的缺口同时不断支持新的语言特点。这些特点包括:

数字签名,这样你便可以放心执行的applet确实是你想要执行的。
答应站点互相识别的有验证能力的证书。
安全 Sockets, 通过加密来确保相互协作的构件间的私有和互相信任的通讯。

安全准则
Java用户目前所经历的问题中,绝大多数都应被划分到实现方面的欠缺,而不是安全模型本身的错误。 (例如,上文所提到的两个漏洞已经被改正)。但是,为了增加Internet上的经验,用户和系统治理圆应遵循以下的准则:

只使用网络软件的最新版本,非凡是浏览器。较早版本将存在更多的错误。
能被你的系统所识别。例如,你是通过你的个人笔记本电脑或企业网络系统访问Net吗?
警惕并调查最小的可疑之处。一次“文件丢失”很可能由一次攻击所导致。

本文只是对Java安全模型的简略描述。还有很多的问题和计策需要治理员(和用户)去了解与探究(如防火墙、企业内部网等等)。但到此为止,你应该思考一下这两个问题:

Java applets确实安全吗?
你应该使用 Java吗?当然 --假如你能持之以恒,益处会远远多于危险。要害就在于要先于黑客一步。

关于作者
Charles F. Bowman 是一位精通关系型数据库、GUI和面向对象技术的独立的顾问、作家和演说家。可以通过[email protected]和71700. [email protected]与他联系。

--摘自IBM网站
http://www-900.ibm.com/developerWorks/cn/java/security/index.sHtml