翻译:中国科学技术大学信息安全专业老师第1页共9页创建日期:2003-11第十一章万维网(万维网)已经把分布式计算提升到了一个新的水平。移动(Mobile)代码通过Internet移动,而且在客户的机器上运行。电子商务带来了新的商业机会。在IT(信息技术)领域安全突然变成了一个非常关注的问题。这样,你自己会再次发现过去习惯使用的IT系统已经有了相当大的变化。这些问题是显而易见的。·老的安全范例(paradigm)还适合吗?或者我们需要新的策略和新的安全机制吗?·对于在设计时并不支持安全的IT系统,我们应该怎样布置其安全基础?这一章带你漫游由安全引起的主要挑战。目标·了解Web计算模型的某些方面已经导致了新的保护要求。·理解存在各种各样的不同的保护问题。·给出目前用于解决这些问题的机制的综述。·快速地考查围绕知识产权的保护方面的问题。11.1背景已经引起了大量的和压倒性地对安全不感知的(已使得大量的压根没有安全意识的)用户群与新的计算范例直接接触。早期的分布式系统应用是基于客户服务器模型的。客户想要在服务器上执行计算时,服务器便认证客户以保护它自己。在这种方式下提供服务的数量不是太多,以至于存在一个适当机会,在服务中的安全缺陷最终被消除。这种情况是怎样改变的呢?首先,提供了创建和处理复杂的超文本文档的标准,超文本包括文本、图形、声音等。编写超文本文档的原始标准是HTML(HypertextMarkupLanguage),与之对应的通信协议是HTTP(HypertextTransferProtocol,RFC1945)。超文本的特征对于新的一组允许用户检索任何信息(内容)的应用来说是非常有吸引力的。新闻内容、像时刻表或地图这样的旅游信息、会议通告、图片、音频、软件、技术文档和其他许多信息都可以是内容。近年来,大量的商业服务公司已经进入了这个市场。不可避免地改变了分布式计算的本质。·程序和数据的分离再一次被取消。内容提供者可以在文档中嵌入可执行内容(applets,Java的小应用程序),来创建可以处理用户输入的交互的Web页面。·计算被移到了客户端。文档中包含了可执行代码,客户端运行在相当有功效的机器上,所以服务器可以把一些计算任务转移到客户机上,而释放它自己的一些资源。所以现在需要保护的是客户,以防止恶意的内容提供者威胁安全。·移动代码从一台机器传送到另外一台机器,从不同的地方收集信息,或者寻找空闲的计算资源。客户需要保护以防止来自移动代码的威胁;移动代码也可能需要保护,以防止来自移动代码正在其上运行的客户机的安全威胁。·用户被迫地变成了系统管理员和策略制定人。Web也为软件的分发建立了一个新的范例(paradigm)。软件恰恰是另外一种可以从Internet上下载的内容。可以说出很多赞同这种模型的理由。因为你已经通过网络连接到你的软件提供者,你为什么还应该必须从软盘上获得软件呢?然而,在你思考从早期的PC时代获得的经验时,你的积极性可能会受到抑制。从任意来源接受软盘变成了传播计算机病毒传染的高速途经。许多组织在认识到这个问题的时候,都对软盘输入进行了严格的管制。同样的警戒措施必须在中采用。没有引起从根本上来说是新的安全问题,但是它改变必须实施安全的上下文翻译:中国科学技术大学信息安全专业老师第2页共9页创建日期:2003-11环境到这样的程度,以至于万维网的安全值得用一章的篇幅来描述。安全是一个快速变化的主题,我们的处理办法既不主张是完全的,也不主张是最新的。所有我们瞄准的是解释那些已经被提出来的安全机制,而且注意这些解决方法的内在的局限性。这本书的主题是讨论计算机安全,我们将仅仅简要地提到对Internet上传输数据的保护。11.2Web浏览器为了访问(万维网)服务,客户端需要一个Web浏览器。Web浏览器仅仅是一个程序,给用户提供图形化用户界面(GUI),包括连接到Web必须的协议。最常用的浏览器是美国网景公司的Navigator和微软的因特网浏览器IE。这些浏览器:·提供铃声和哨声,以呈现有吸引力的Web页面;·是Web应用的服务层;·包括与Web服务器通信的各种协议;·为客户管理与安全相关的信息。在我们的Web安全模型中,最主要的部分是客户、客户浏览器和Web服务器。在这一章,我们提到的Web服务器常常指提供服务的软件,而不是运行服务软件和维护Web页面的机器。浏览器对于客户的安全是重要的,你应该能够区别当前产品特定的特征和对于浏览器的概念是固有的一般特征。由于很多原因,使得浏览器变成了TCB(可信计算基)的一个部分。·浏览器处理客户的Web通信(traffic)。在客户和服务器之间平稳地传输数据,浏览器将关于用户和用户计算环境的很多信息报告给服务器。最低限度,浏览器必须说明一个返回地址。这就产生了关于隐私(privacy)保护的问题,由于服务器是处在建立和使用关于它的客户的数据库的位置,用于客户并不欣赏的目的。·浏览器管理客户环境的缺省设置和优先选择。缺省设置包括可执行的位置。安全优先选择指出了客户对它们的Web会话想要应用的保护。·浏览器保存历史记录和最近访问的web页面的高速缓存。这样方便了用户。当用户要返回前面已经浏览过的页面时,可以从本地高速缓存很快且很容易地获得先前浏览过的页面。现在想象一个公共终端,例如,在一个机场的休息室,为旅客提供Web服务。不同的旅客轮流使用这个终端。屏幕显示内容滚动回到先前的页面也就意味着返回到其他旅客浏览过的页面。一个安全的Web浏览器必须处理好对象的重用(reuse)问题!·Web安全应用喜欢使用加密和数字签名算法。当浏览器为客户执行这些任务时,客户会把自己的私有密钥委托给浏览器。对输入通信(traffic)的数字签名和证书的数字签名必须进行验证。所以,目前浏览器以主证书主要部分的根验证密钥出现。显而易见,浏览器必须保护好验证密钥,使它不被修改,并且使签名和加密密钥不被泄漏。·为了对用户友好且呈现给他们简单的访问Internet工具,浏览器集成了其他的通信服务,例如电子邮件。从安全角度来说,这样构成了复杂程序的不必要的使用。一个攻击者可能发送一个利用浏览器中的漏洞的E-mail消息。最初的mail程序对这种攻击可以是有免疫力的。但是集成服务可能导致无法预料的相互作用,这在服务分离的情况下是不会出现的。·浏览器常常运行在系统模式下,对所有的系统资源有完全访问权。·综上所述,浏览器呈现了越来越多的功能,包括那些原来由操作系统执行的功能。到适当时候,浏览器变成了操作系统整体的一部分,比如Microsoft的浏览器IE4。在这个过程中,浏览器承担了与安全有关的任务,比如用户认证,或者控制对浏览器自身的访问,或者控制对某些Web页面的访问。当浏览器变成商业产品的时候,问题变得复杂起来,而且它们的内在规范是不公开的。即使专家有时也不得不承认这是一个失败,且承认某些细节是超出他们的影响范围之外的[128]。翻译:中国科学技术大学信息安全专业老师第3页共9页创建日期:2003-1111.3CGI脚本在传统的客户服务器模型中,许多的客户只允许访问少数的服务,比如FTP,而且几乎没有客户可以通过RPC(remoteprocedurecall,远程过程调用)进行大范围的访问。CGI(CommonGatewayInterface,公共网关接口)脚本授予许多客户更灵活的访问服务。安全问题的实质并没有改变。服务器对它的客户提供控制调用。然而,问题的规模是不同的。现在,要求服务器运行越来越多的程序,这些程序能完成更多的任务,且是由更多的程序设计者编写的。在它里面的每一项对安全来说应该是受关注的。CGI是一种元语言(中间件,middleware),用来传送URLs(UniformResourceLocator,统一资源定位器)或者HTML表单(form)到可执行程序。这些程序可以用任何语言编写,只要它们满足CGI要求的几个标准。像Perl、Tcl或者Safe-Tcl这样的脚本语言特别适合于这种目的。在更通用意义上来说,CGI代表了给客户更多选择的全部的概念,这些选择影响着他们要求服务器执行的计算。CGI工作如图11.1所示。客户发送一个URL或者一个HTML表单的内容到服务器,指定了CGI脚本和它的输入参数。这个请求被传送到一个程序,而该程序以Web服务器程序的用户身份执行。Web服务可以调用像服务器端嵌入(Server-SideIncludes,SSIs)这样的应用程序。用服务器端嵌入,在服务器上的文档可以包括系统命令,称为内嵌的SSI。当客户请求这样的文档时,文档中的这些系统命令就被计算,且结果插入在返回给客户的文档中。图11.1运行CGI脚本的服务器根据文献[128]改编的例子举例说明了CGI脚本怎样可能成为破坏的原因。给客户发送文件的脚本程序可以像:catthefile|mailclientaddress其中,thefile是文件的名字,clientaddress是客户的邮件地址。当一个恶意的用户输入:user@address|rm–rf/作为邮件地址时,服务器将执行如下命令:catthefile|mailuser@address|rm–rf/而且在把文件邮寄给用户以后,删除这个脚本文件允许删除的所有文件。所以为了管理Web服务器主机的安全,必须执行很多任务。在下面的描述中,我们假设主机是Unix系统。首先,系统管理员必须明了在主机上的所有CGI脚本。存在两种选择:·混淆脚本CGI(Scrip-aliasedCGI):所有的CGI脚本都存放在一个目录下,例如,./cgi-bin,或者在Web服务器的根目录,例如,/var/httpd。·非混淆脚本CGI(Non-script-aliasedCGI):所有的CGI脚本都由它们的扩展名来标识,例如,.cgi。第一种选择较安全,因为这样比较容易找到所有的脚本程序。下一步,你必须为Web服务器程序决定UID(用户标识符)。你必须对最坏的情况有所准备,并且假设有些奇怪的CGI程序可能会失去控制。以root权限运行web服务器程序可能引起灾难性的后果。所以你最好的选择是创建一个特殊的Web服务器UID,并且小心地控制它的访问权限。注意,这种解决方案不提供在属于不同用户的Web页面之间区别。所有的CGI脚本都在同一个UID下运行。为了使脚本在它的作者允许权限范围内运行,你需要像CGIWrap这样的包装(wrapper)软件。为了保护Web服务器的完整性,Web服务器UID将不应该拥有Web服务器的bin文件和配置文件。为了同样的理由,Web服务器UID不应该与其他的服务一起共享。Web服务器特别不应该在特殊用户Nobody(UID是-2)下运行。你应该认为在这个UID下已经运行的其他服务。CGI脚本的代码检查可以清除具有安全漏洞的脚本。如果你有这样做的时间和专门技术,这当然是一个很好的想法。如果你正在为顾客管理一个Web站点,而用户只想尽快翻译:中国科学技术大学信息安全专业老师第4页共9页创建日期:2003-11地看到在服务器上的他们新的Web页面,这种选择对你来说可能是不可利用的。最后,像在任何其他的控制调用情况一样,给CGI脚本的输入应该经过过滤。调用操作功能越是强大,你越是要小心地对待它接收的输入。服务器端包含(SSI,serversideincludes)的功能可以是非常强大的。内联(in-line)SSI的格式是:!-#operatorarg1=string1arg2=string2…-最终的灵活性是通过带有参数cmd的操作符exec提供的。内联SSI是:!-#execcmd=myprogrammyparameters-传送字符串myprogrammyparameters到/bin/sh目录下执行。恶意代码可能来自于程序,或者来自于一个给完全无知的程序传递的参数,如果myparameters包含shell(命令解释程序)转义字符的话。“非转义操作”(u