一、前言
还记得美国为首的北约轰炸我驻南联盟使馆,大家义愤填膺但又无可奈何,于是有黑客呼吁黑美国佬的网站,很快大家纷纷学习攻击web的方法和技巧,并且成功的黑了美国的几个军事主页,有的还挂上了五星红旗。这令美国政府十分尴尬。要投巨资维护web站点的安全。另一个最近的例子是,国内最大的综合性网站新浪在某天上午被黑客成功攻击,其门户页面被换成了黄色页面。给新浪造成了不小的副作用。这两个例子说明了web站点的安全是十分重要的,可以说,随着internet的飞速发展,web的安全其重要性逐渐超过其他应用安全。同时,由于web必须要有开放性,这就是说,必须让任何人都能够有访问的权利,因此,使得防范更加困难。
web的安全分为服务器安全和客户端安全(浏览器),前者主要针对web的构建者,后者针对普通的用户。本章将就这两方面展开讨论。
二、什么是http
http(hypertext transfer protocol)超文本传输协议允许用户从www(world wide web)以及其他分布式信息系统请求和接受超文本的内容。它运行在tcp之上并用绑定服务器端口80,然后它还可以使用其他端口和协议来提供一个可靠的数据流。它是一个请求/响应协议。为了获得信息,一个浏览器客户程序(如netscape)向一个apache服务器建立一个tcp连接并请求一个资源(“get”)。服务器检查请求并根据服务器配置和包含的内容进行响应。服务器也许发送一个超文本标记语言(html)文件、文本、图片、声音、影像或一个java applet,它们可以在浏览器显示出来。服务器也可以运行一个程序来响应浏览器的请求(如通用网关接口或服务器的应用程序接口)。
测试http连接的一个简易方法(同时也是一个潜在的安全漏洞)是telnet到一个web服务器主机的端口80。可以输入“get/”来浏览站点的基本html文档(如index.html),如下所示(去掉了html内容):
$ telnet www.mysite.com 80
trying…
connected to www.mysite.com.
escape character is ‘^]’
(在此敲入get /) get /
下面刷的出来一个html的文件,例如:
<html>
<head>
<title>老虎之家</title>
<meta http-equiv=”content-type” content=”text/html; charset=gb2312″>
</head>
<frameset rows=”128,327*” frameborder=”yes” border=”0″ framespacing=”0″ cols=”*
<frame name=”topframe” scrolling=”no” noresize src=”index-3.html” >
<frame name=”mainframe” src=”index-2.html”>
</frameset>
<noframes><body bgcolor=”#ffffff”>
</body></noframes>
</html>
connection closed by foreign host.
三、安全风险的分类
web安全风险一般可以分为三类:
- l 对web服务器及其相连lan的威胁
- 对web客户机的威胁
- 对服务器和客户机之间的通信信道的威胁
1.服务器的风险
通常的网络安全总是设置各种各样的限制,使得不明身份的人无法获得非授权的服务但是web服务器恰恰相反,它希望接受尽可能多的客户,对客户几乎没有任何限制和要求,好了,这样,相对于其他网络服务器,web是最容易受到攻击的。最常见的威胁是http服务器软件中的bug、错误的配置、不安全的cgi程序或者缺乏强大的机密功能等等。服务器通常受到的侵害有:修改和替换服务器提供的内容;获得对服务器访问控制保护的保密文档的访问权;在服务器上执行任意命令并破坏服务器的系统安全;检查日志文件来危害用户的隐私;进行服务拒绝攻击,使服务器或者网络连接失败。
2.客户端风险
浏览网页是一个并不十分安全的活动。bug、不合适的“活跃内容”和脚本以及服务器管理可以带给浏览者如下危害:应用程序和系统崩溃;包括病毒和特洛一木马在内的恶意代码;丢失保密的信息;隐私被侵犯等等。
主要的web浏览器都支持下载嵌在html主页中的脚本并在浏览器中执行他们的功能。通常,这些程序用来与用户交互并在浏览器和服务器之间传输信息。例如,在netscape的javascript和微软的vbscript中都存在过bug。甚至在没有bug时,对一个有恶意的web管理员来说,把能够突破保密措施或引起严重损失的脚本放在html主页中也是挺容易的。一种常见的攻击方式是创建一个javascript来欺骗性的产生一个错误信息或一个提示来要求用户提供网络登录id和口令。其他的客户风险来自于隐私的侵犯。许多web站点为客户写了一个验证cookie,cookie可以跟踪用户并暴露他们去了什么站点。按照指定cookie处理的rfc的要求,客户软件应提供一种方式来指明cookie应该或不应该被保存的域。
3.传输安全
在web客户机和web服务器之间传输的信息可能在连接的任一端或中间任何地方被窃听或截取,包括客户机的lan、服务器的lan、客户机的isp、服务器的isp、两个isp之间的任何中介网络。
幸运的是,目前ipsec(ip协议安全体系结构)的提出,使得网络通信可以通过在ip层进行认证和加密。但是目前还没有普及。
四、保护web服务器的安全
1.选择安全的服务器软件
在linux上有很多的httpd服务器软件。例如:
* america online inc. aolserver2.x
* allegro software rompager 2.x
* apache group apache1.x
* hawkeye project hawkeye 1.x.x
* sun microsystems java server 1.x
* idonex ab roxen 1.x
* spyglass spyglass microserver 2.x
* rapid logic inc. webcontrol 2.x
* imatix xitami 2.x
* zeus technology zeus web application server 3
* vqsoft vqserver 1.x
如果大家有兴趣,可以到有关的站点去访问,了解其性能和特点。在这些软件中,apache无疑是最为成功的。在internet上有超过一半的网站使用apache。在apache的最新版本中有以下安全特征:
* 可以通过域名、ip地址、用户和分组来禁止访问
* 可以配置用户分组(而不是单独一个用户列表)
* 可以不重启服务器来修改用户访问控制列表
* cgi可执行程序能在拥有者的uid下执行
* 基于目录文档的权限是分层的
* 一个文档的一部分可以根据安全规则被隐藏
* 支持ssl2.0和3.0
* 有一个可用的口令机制
* 可以基于url制定安全规则
2.服务器配置的一般规则
通常,web服务器应该把一些好的系统安全路径、配置和工具结合起来加强安全。例如:
- 尽量让一个主机投入web服务器之中,不允许无理由的交互式登录。删除web管理员帐号之外的其他用户
- 从/etc/inetd.conf中禁止不需要的服务。如果站点需要ftp功能,那么让另外一台主机作为ftp服务器。其他服务应该被禁止或者限制,包括telnet、finger、netstat/systat、echo等等。
- 删除不需要的shell和解释器。如果不运行perl cgi脚本,就删除perl
- 不支持自动列目录、符号链跟随和服务器端包含这样的选项
- 密切检测web日志
- 应用安全的web服务器软件,如支持secure sockets layer(ssl)的软件
- 考虑在一个chroot环境中运行服务器
- 使用防火墙来控制对服务器的访问
仔细规划谁能访问一个安全服务器上的内容目录是很重要的。多数web服务器支持各种访问控制方式。通常可以把访问权限在指定的ip地址或dns主机名中,或指定必须提供口令来采访特定目录的用户。如果一个web服务器中有保密的公司信息,就需要采取措施保证资料在自己的手中。在一个服务器上使用cgi要格外小心。一个cgi程序可能在系统中做出任何事情,从向外部人员提供访问权限到删除重要文件。
五、保护web客户端的安全
客户端软件通常是微软的ie,或是被微软挤压的netscape(还好在x-window下使用率比较高),还有简单的lynx等等。
1.好的客户端安全经验
要认真考虑程序提供的安全设置,如果禁止了java和javascript,就会使浏览器更安全。应定期清理cache和cookie文件,避免去声誉不佳的站点以及使用“save”选项合为不可信的文件使用“open”选项。
2.mozilla
1998年,netscape公司决定发行navigator的源代码,并创建一个单独的机构来监控它的发行与维护:mozilla.org。我们如果有时间的话,分析它的源代码相信对我们提高客户端安全有很大好处。详见http://mozilla-crypto.ssleay.org/index.php
3.lynx
没有图片,没有声音的文本浏览器,我喜欢用它(在linux下),但是注意,在缺省情况下不支持ssl。
4.用户隐私
有些站点要求用户在得到访问权之前必须登记。多数站点维护服务器日志,这有可能泄漏敏感信息,包括ip地址、isp、前一个访问的站点等等。其他站点把cookie推到管道中以便在以后关联用户访问的站点。
用户可以遵循下面的规则:
- 不要求用户登记
- 只收集用户的电子邮件地址而不是完整的联系信息
- 不要与第三方共享电子邮件地址
- 不要使web上的日志文件可以被访问
- 当日志文件不再需要时删除他们
目前,world wide web consortium已经开始指定称为platform for privacy preferences的声明,允许用户根据自己的意愿来控制身份信息的公布。不过,对我们国家不使用。
六、保护传输安全
从用户的观点来看,web浏览可能危害隐私。它允许tcp/ip在两台机器之间提供一个匿名的数据流,但它不提供保密性、完整性和认证服务。有几个方案能为tcp/ip添加一个安全层,包括secure shell(ssh)和microsoft的pct。目前secure sockets layer(ssl)占优势。
1.ssl
ssl是netscape用来在应用协议(如http、telnet、nntp或者ftp)和更低的tcp/ip层之间提供数据安全的协议。他提供三种基本的安全特征:
- 保密性 保密是通过对进程加密来实现的。根据连接双方的秘密协商,对称加密的密钥对每个连接都是唯一的
- 服务器认证 客户端要检查一个有效服务器的x.508v3证明,不论是一个rsa公开密钥证明,一个数字签名标准(dss)证明,还是一个diffie-hellman证明。证明一般是由可信的证明代理发出的。
- 信息完整信 信息完整性(不被改动或者丢失)是由mac(message authentication code)保护的,它是一个根据信息和秘密数据进行计算的单项哈希函数。
另外,ssl提供一个可选的客户端认证。ssl的其他功能以及特殊的服务器认证被广泛应用于电子商务。虽然不同的web浏览器以不同的方式指明一个安全的ssl连接,但是以“https://”开始的url指明在客户端和服务器之间已经建立了一个安全的连接。
详见 http://home.netscape.com/products/security/ssl/index.html
2.tls
tls(transport layer security)是由transport layer security working group起草的,产生了一个rfc文档。
tls用来建立一个安全的“会话”——它是一个客户机和一个服务器之间的关联,用来避免进行昂贵的协商来为每个新的安全参数建立一个额外的连接。该协议分为上层的tls handshake协议和下层的tls record协议。tls handshake协议为一个安全的会话建立加密参数。当使用tls的客户端和服务器建立通信时,他们对协议版本达成一致,选择加密算法,还可以互相进行认证,并使用公开密钥加密技术来产生共享的秘密。
详见 http://www.ietf.org/html.charters/tls-charter.html
3.建立一个tls/ssl服务器
多数商用web服务器产品的使用ssl。ssleay使用了几个加密算法,某些可能要求商业许可证。ssleay实现了5个不同的算法:des、rsa、rc4、idea和blowfish。rsa的专利属于美国。使用它是需要许可证的。
ssleay和openssl都可以集成到apache web服务器中。程序员ben laurie开发了一个apache-ssl包,为apache提供一组补丁程序、一些额外的源代码、一些帮助文件和配置文件实例。补丁程序需要用在apache源代码中,其结果与ssleay或openssl编译并链接。
可以从下面的站点下载:http://www.apache-ssl.org
如果双方都知道另一方使用tls/ssl,那么可以使任何运行在任一端口上的基于tcp地协议得到透明的安全。但是由于实际原因,为每个使用tls/ssl保护安全的协议保留了几个端口号,这样允许包过滤防火墙让这些安全传输通过。例如:
名称 端口号 描述
nsiiops 261/tcp iiop名字服务
https 443/tcp http协议
ddm-ssl 448/tcp ddm-ssl
smtps 465/tcp smtp协议
nntps 563/tcp nntp协议
sshell 614/tcp sslshell
ldaps 636/tcp ldap协议
ftp-data 989/tcp ftp协议和数据
ftps 990/tcp ftp控制
telnets 992/tcp telnet协议
imaps 993/tcp imap4协议
ircs 994/tcp irc协议
pop3s 995/tcp pop3协议
七、其他
大多数web服务器被设计成是由超级用户启动的。服务器必须作为root运行,使他能监视端口80。一旦服务器开始运行,它要改变它的uid中规定在配置文件中的用户名。不要像root那样运行你的服务器,虽然你的服务器必须用root启动,http.conf文件中一定不要包括user root行。如果这样,你的web服务器执行的每个脚本都将作为超级用户运行,产生许多潜在地问题。
要当心把http和匿名ftp混合。许多站点用相同的目录来存储通过匿名ftp和通过网站访问的文档。例如,你可能有一个名为/netdocs的目录,他既是你的ftp用户的主目录又是你的web服务器的根目录。这就允许把文件归到两类urls,例如http://server.com/nosmis/myfile.html或者ftp://server.com/nosis/myfile.html。在ftp上的http的主要优点是速度快、效率高。但是混合出现了各种安全问题:
- 允许匿名ftp访问http目录,给用户提供了在任何web服务器上限制对文件的访问的办法。因此,如果在你的web服务器上有机密文件长久使用这个办法,可能失去文件的机密性。
- 如果一个攻击者能下载你的cgi脚本,他可以搜索出攻击的路径。
- 你必须完全的确保ftp用户无法上载一个能在你的服务器上运行的脚本
- 显示给你的/etc/passwd文件也可能被用www服务的人见到,从而导致它的内容受破坏。
另外,还有一些注意事项:
- 删除不必要的用户(前面提到过)
- 不要安放nfs或输出任何目录
- 删除所有的编译程序
- 删除所有的不是用作引导或者web服务器的实用程序
- 提供尽可能少的网络服务(再次重申)
- 不要运行邮件服务器
如果想知道更多关于http/www的安全知识,请访问http://www.w3.org/security/faq/