Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->CGI ->正文

CGI的安全(一)

来源:Linuxdby.com 作者:Webmaster 时间:2007-04-28 点击: [收藏] [投稿]

  禁止所有你不需要的服务器特性。如果你开始禁止了一个特性,而后来又决定使用它时,你总是可以将其改回来的。像SSI和SSL都是你可能需要禁止的。 

  如果你的用户不需要通过你的服务器将他们个人的Web文件用于服务,就需要使Web目录无效。这样一来,你就可以完全地控制你的机器中用于服务的所有文件,这对于通常的维护和安全是很重要的。 

  如果你的用户需要将他们个人文件用于服务(例如,如果你是一个IAP(InternetAccess Provider),确信他们不能超越你的主范围。认真考虑一下用户是否需要在他们的个人目录里运行CGI程序的权力。前面我们已经提到,最好将所有的CGI放到一个集中的位置。 

-------------------------------------------------------------------- 
CGIWRAP: 

  在Web上一个流行的软件包是cgiwrap,由Nathan Neulinger(nneul@umr.edu)编写。这个软件包允许用户作为程序的拥有者运行他们自己的CGI程序,而不是作为服务器的所有者。 

  不清楚仅仅允许所有人运行他们自己的未包装的CGI程序是更否更有益。一方面,一个糟糕的CGI脚本由nobody拥有比起由一个实际存在的用户拥有来说,前者可能造成的危害更小。另一方面,如果CGI程序以nobody运行对系统造成了破坏,那么责任在于系统管理员,相反,如果只是一个特定的用户文件被破坏了,那么责任终将是用户的。 

  我的建议是不要赋予用户运行个人CGI的权力,如果这样不可能,那么你最终使用cgiwrap还是一个简单的程序取决于你想责任出在哪里。 
--------------------------------------------------------------------- 


  最后,你可能需要考虑你的Web文件建立一个chroot环境。在Unix系统中,你可以通过使用chroot来保护目录。当server运行在一个chroot的目录中时,它看不到这个目录之外的任何东西。在一个chroot环境中,如果有人想侵入你的Web服务器,他们只会破坏这个目录里的文件。 

  注意,一个chroot环境仅适用于当Web服务器提供单独的文件资源。如果你的Web服务器将用于服务的用户文件存放在多个目录中时,想建立一个有效的chroot环境几乎是不可能的。另外,解释器(例如Perl或者一个shell)的存在也会降低chroot环境的性能。在一个没有任何shell和解释器的chroot环境中,侵入系统的人最坏情况下能改变和破坏你的文件,如果存在解释器,潜在的危害会上升。 

1-2-4.例子:安全的配置NCSA服务器 

  我将通过讨论NCSA服务器(v1.4.2)来论证怎样着手正确地配置Unix环境下的通用的Web服务器。有很多Web服务器可以运行在Unix系统下,NCSA是最早的服务器之一,被广泛使用并且属于自由软件,而且相当容易配置。我仅说明我认为对Web服务器安全方面有关的配置;想获得有关配置NCSA httpd更多详细的说明,请参照它的站点: 

  http://hoohoo.ncsa.uiuc.edu/ 

你可以将这里说明的原则应用到几乎所有的Unix Web服务器中。 

  首先,我需要表明我的目标。在这个方案中,我想将NCSA服务器架设在一个很小的名为MyCompany的ISP的安全的Unix机器上。这台机器的域名为www.mycompany.net。我需要我的机器中的每一个拥有帐号的人能够将他或她的Web文件用于服务并可以使用CGI或其他的特性。 

  我绝对应该需要什么特性呢?这里,因为我是一个很小的ISP,我不能让用户自行将其CGI用于服务。如果他们想写出并使用他们自己的CGI程序,他们必须将其提交给我来检查;如果CGI程序没问题,我就安装它。另外,我要提供一些通常需要的一般的程序,比如留言本和各类表单处理的应用程序。现在,这个方案里我不需要其他任何的特性了,包括服务器嵌入指令。 

  我们来看一下我将如何配置我的Web服务器。我将建立用户和www组;这些将拥有所有恰当的目录。我将建立一个目录来存放我的服务器文件 
(/usr/local/etc/httpd/)和存放Web文件的目录(/usr/local/etc/httpd/htdocs/)。所有这些目录对全球是可读的对所建立的用户和组是可写的。 

  现在,我将要配置服务器。NCSA HTTPD有三个配置文件:access.conf,httpd.conf 


和srm.conf。首先,你需要告诉httpd你的Server和HTML的目录所在。在httpd.conf 
中,以如下一行来指定Server的目录: 

  ServerRoot /usr/local/etc/httpd 

  在srm.conf中,这样指定文件目录: 

  DocumentRoot /usr/local/etc/httpd/htdocs 

  因为我想指定在/usr/local/etc/httpd/cgi-bin目录中的所有文件为CGI程序,在srm.conf中包含如下一行: 

  ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin 

  注意我的cgi-bin目录的实际位置在我的服务器目录而不是文件目录。因为我想要使我的服务器目录(包括包含CGI的目录)尽量为私有,我将它放到文件目录以外。如果你在该目录中有一个名为mail.cgi的CGI,我可以通过如下的URL访问它: 

  http://www.mycompany.net/cgi-bin/mail.cgi 

  在srm.conf中需要编辑另一行;它对我们追求特定的服务器安全不是特别有关系,但是为了彻底的安全,我还是要提到它: 

  Alias /icons/ /usr/local/etc/httpd/icons 

  这个Alias指令允许我们为你的文件目录树内部或以外的目录指定一个别名。与ScriptAlias指令不同,Alias并不改变目录的含义。 

  因为我需要禁止服务器嵌入指令,并不允许CGI在cgi-bin以为的目录运行,在srm.conf中我通过在行首插入一个英镑符号(#)注释掉几行: 

  #AddType text/x-server-parsed-html.shtml 
  #AddType application/x-httpd-cgi.cgi 


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:获取随机的密码   下一篇:CGI的安全(二)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号