前言
自今年初以来发生了许多病毒攻击的事件,诸如︰CIH、Melissa与ILOVEYOU等,病毒似乎防不胜防。笔者记得就读大学二年级时碰到的第一只病毒是C_BRAIN,当时要防止病毒的肆虐是轻而易举、相当容易─就是不要随便执行来路不明的档案。几曾何时,这个定律在Internet时代已不再成立。 Internet虽然带来了便利,产生了许多商机,但也萌生了许多安全问题。如何维护网路的安全,不仅重要,而且复杂。当然病毒只是网路安全的一部份,也不是本文讨论的重点。网路安全性这个问题的范围相当大,可以从内部/外部、人为/软硬体、使用者资讯安全教育、电脑/网路安全管理、重要资料备份/完整备份管理政策,以及机房进出管制等方面来讨论。
Internet普及,为公司架设一个WWW伺服器,制作漂亮的Homepage已成为各大公司必备工作。稍具规模的公司甚至拥有两个以上的网站。再加上许多网路公司年轻员工一夕致富的例子,吸引许多人纷纷投入这个行业。以笔者服务的公司而言,寻求一位Programmer所收到的网路履历表中,100封网路求职信大概有75封是应征网页设计,这些人又以非资讯科系及社会新鲜人占大多数。即使是资讯科系毕业生,问起他们是否懂得C/C++程式设计,通常得到的答案为「学校修过,但精通Dreamweaver、Frontpage及ASP」。你很难想像在日益复杂的网路时代,这会有多大的弊端产生。因此,本文试着从Linux-based Web Server的安全建置作个粗浅的讨论。文中所讨论的系以Apache为主,但也会比较到一切其他的Web Server。
Linux-based Web Server的优缺点
Netscape的技术总监Eric Hahn在其Heresy Document中曾提到Linux的五大优点:免费、技术优异、原始码开放、有较多的开发者及能提供较佳支援。以笔者所用的Linux为例,1200元新台币的盒装版内附9片光碟与两本说明书,还加送一只可爱的企鹅,其中包含了众多功能强大的Server软体如︰Apache Server、Mail Sever、Ftp Server、Firewall + Proxy and Commercial Database,可说物超所值。而Linux当中所附的Apache Server是Internet中使用最广的Web Server,我们从Apache与微软IIS的比较(表一),以及Apache的规格说明(表二)可以得到一些概念。
《表一 June 1999 Market Penetration》 |
|
由表一与表二可以看出免费并不代表功能不完整或不实用。当然,除了Apache Server外,Linux上还有许多Web Server,且各有各的优点。不同于Windows NT,由于Microsoft的强势Marketing策略,配合完整的发展工具,因此Microsoft的IIS几乎成为Windows NT的唯一选择。但反观Linux,于Linux上的Web Server可以说是蓬勃发展,而且大多免费且为Open Source。以下列举常用的Web Server︰
●AOLserver a full-featured web server from AOL
●Apache HTTP Server a public domain HTTP server for UNIX and Linux
●Apache-SSL secure web server, based on Apache and SSLeay
●Boa a fast, lightweight web server for unix-like computers
●Hawkeye a complete, highly extensible Internet/Intranet server suite
●NCSA httpd Server web server from the developers of Mosaic
●Roxena modularised, object oriented World Wide Web server
●Stronghold commercial version of Apache web-server which uses SSL
●XS-HTTPD 2.3 very small and fast LINUX WWW server
●W3C (CERN) httpd web server from the World Wide Web Consortium (CERN)
众所皆知,Linux的特点为开放原始码(Open Source Code),平心而论,Open Source是武器也是罩门,对许多使用Open Source的WWW Server之机构而言,系统管理者可以迅速找到程式的漏洞而加以补救,但这也意味着入侵者可以检视原始码而寻找后门。
有一个相当有名的小故事,Netscape于释出Mozilla时,曾小心翼翼地将程式中有关于加密技术的模组拿掉,原因很简单,因为美国政府基于安全理由,不允许此类的技术输出美国本土。但就在Mozilla释出不到15个小时,有个名为Mozilla Crypto Group的团体在Netscape的模组中,以SSLeay为基础,提供了美国政府所不允许的全功能加密编码系统。这个团体有12个成员,其中9个在澳洲,3个在英国。藉由网路团体的支援和其他的Open Source,在短短的15个小时中解掉一个重大的安全问题。但你可以想像相同的情况在Window NT4.0 + IIS4.0的状况了。以下列举一些提供加密技术的网站︰
●SSLeay︰http://www2.psy.uq.edu.au/~ftp/Crypto
●OpenSSL︰http://www.openssl.org
●Apatch-SSL︰http://www.apache-ssl.com/
相同的,Open Source的缺点也为业界所熟知,最有名的就是发生在1988年,被一位名叫Robert T. Morris的人利用的finger臭虫。原来的fingerd程式有下列几行:
char line[512];
line[0]='\0';
gets(line);
程式似乎很简单,但Morris利用get()函数不检查文字行长度的漏洞,写了一段程式让fingerd执行shell程式,再加上fingerd通常以root执行,等于让入侵者取得所有控制权。
Open Source的开发者来自全球各地是不争的事实,但即使如此,是否能提供较佳的技术支援,笔者认为这是见仁见智的问题。其实提供较佳的支援与Open Source是相辅相成的,由表一亦可以看出国外对Apache的评价,但国内使用者经常将Free Software的Free范围扩大到技术支援,也因此造成国内从事Linux Service厂商的困扰。其实以Open Source所省下的软硬体费用(Linux+Apache所需的硬体需求较小),可以买到物超所值的技术支援,更何况NT所需的技术支援费用更加昂贵且无效率。
建置安全的Linux-based Web Server
在争奇斗艳的网路环境中,如何制作一个又炫又酷的Home Page往往反而比起网路安全更令公司所重视。在电子交易还未普及之际,或许看不出问题,但当电子交易成为企业的必须时,安全其实是第一要务。有些建置安全Web Server的问题是经常被忽视的:
CGI的安全问题
Home Page因有Web Server的支援而功能更佳,但也因此而对Client Users和WWW Server产生安全漏洞,例如原本WWW Server只允许存取某些特定的资料夹,但没有安全概念的CGI Script或Program却可能无意破坏其他目录的档案。无经验的Web Programmer所写的CGI Script可能包含某些安全漏洞而被入侵者拿来执行Server上的任何程式。
单纯的环境
由于Linux有众多的网路资源,使其成为相当优秀的网路伺服器,您可以使用Linux来执行Ftp、Telnet、Printer Server、File Server与Mail Server等。但越多的Service在同一台机器上执行,代表可能的漏洞越多,也越容易让入侵者得逞。
不要以root执行Web Server
在Apache之conf档httpd.conf中有一段设定:
# User/Group: The name (or #number) of the user/group to run httpd as.
# On SCO (ODT 3) use User nouser and Group nogroup
# On HPUX you may not be able to use shared memory as nobody, and the
# suggested workaround is to create a user www and use that user.
# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
# when the value of (unsigned)Group is above 60000;
# don't use Group nobody on these systems!
User nobody
Group nobody
这代表无论Http Service要用什么使用者来启动它,千万不要将其设为root,虽然这会有些小小的不便,但您可以想像所有的CGI Script都以root权力执行的后果。
正确的设定存取权
许多使用者并没有注意到正确的设定存取权,以CGI执行的目录而言,如果我们将其存取权设定为:
drwx-x--x 5 root www 1024 Aug 8 00:01 cgi-bin/
则httpd可以执行其底下的CGI程式,但除非以root登入,否则无法对其进行修改或观看。同样的道理,Apache Server 以httpd.conf来控制伺服器的组态、档案的读取权及伺服器资源表(早期的Apache将其分为三个档案httpd.conf、access.conf与srm.conf )。如果入侵者知道这个档案的内容,将可以轻易地找出伺服器组态的漏洞。若我们将其存取权设定为:
-rw------ 1 root www 1024 Aug 8 00:01 httpd.conf
则可限制只有root能对其修改及观看。
正确的设定伺服器组态
在Apache Server的httpd.conf中,有些组态是必须小心设定的。如
Automatic directory listing, Symbolic-link following, Server-side including。你必须了解这些设定的意义并且小心地使用,例如将Automatic directory listing设定为ON,则当浏览器Browser到一个没有index.htm的目录时,使用者可以清楚的看到伺服器的档案组态,这是多么危险的一件事。
别假设上网的人都是无恶意的
别认为使用者都会遵守规则,恶意的入侵者会想尽一切办法破坏规则,因此网页设计者要确实检查如Selection List 传回值,使用者直接执行CGI程式或使用者故意传回不合法的Cookie 。
预防窃听
为了预防入侵者窃听网路资讯(在TCP/IP的环境中是轻而易举的),通常你必须对你的资料加密,一种方法是直接加密档案本身,一种是Client/Server使用相同的加密技术对IP Package进行加密。无论如何,别低估Internet的开放性。
适时的升级Linux Kernel
Linux核心至2.2.15以前的版本﹐都含有一个严重的臭虫,以让一般使用者取得root权限。 2.2.15系列的使用者只要升级到最新的Linux 2.2.16版核心,就可以解决。这个漏洞只要系统里有setuid root的程式,可能被利用。主要问题发生在一个少有说明的函式-setcap,etcap函式可以让使用者获得任意setuid程式的能力,进而入侵系统。因此适时的升级Linux Kernel是必要的。系统管理者应经常注意这方面的资讯,必要时也要自行编译Kernel以防止漏洞。
结语
由于版面的因素,许多问题都只能点到为止,以CGI为例,可以讨论的安全问题就可以写一本书,有兴趣的读者可以上百资网站(http://www.linpus.com. tw)。笔者会在上面发表一系列文章。倒是对于许多急于学习网页设计的新鲜人而言,笔者倒是建议多了解一些系统架构及安全问题。笔者其实可以大胆预测,由于开发工具的进步,未来制作网页将有如使用Word打文件一般,是必须的技能而非工作的专长,反而是网路安全专家奇货可居。