明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

CGI的安全(一)

[摘要]目錄: 1. 基本的安全問題 1-1. 操作系統(tǒng) 1-2. 增強(qiáng)服務(wù)器的安全  1-2-1.你應(yīng)該在什么地方放置你的CGI程序?  1-2-2.SSI(Server-Side Includes)  1-2-3.增強(qiáng)你的Unix服務(wù)器的安全  1-2-4.例子:...
目錄: 
1. 基本的安全問題 
  1-1. 操作系統(tǒng) 
  1-2. 增強(qiáng)服務(wù)器的安全 
  1-2-1.你應(yīng)該在什么地方放置你的CGI程序? 
  1-2-2.SSI(Server-Side Includes) 
  1-2-3.增強(qiáng)你的Unix服務(wù)器的安全 
  1-2-4.例子:安全的配置NCSA服務(wù)器 
2.寫出安全的CGI程序 
  2-1.語言的風(fēng)險(xiǎn)性 
  2-2.shell危險(xiǎn)性 
3.安全處理 
  3-1.SSL 
  3-2.SHTTP 
4.概要 

  如果你以前從未編寫過應(yīng)用于網(wǎng)絡(luò)的軟件,那么安全問題可能是你在編程時(shí)最不注重的了。畢竟,在單機(jī)上,你沒有必要擔(dān)心寫了不安全的程序,因?yàn)?大概也只能有一個(gè)人可以接近那臺(tái)計(jì)算機(jī)。 

  但是,在編寫應(yīng)用于Internet的軟件中需要非常強(qiáng)調(diào)安全問題。有一個(gè)挺老的計(jì)算機(jī)格言說:"使一臺(tái)計(jì)算機(jī)真正安全的唯一方法是將它與世界斷開連接并把計(jì)算機(jī)放到緊鎖的房間里。"可見,將計(jì)算機(jī)和一個(gè)網(wǎng)絡(luò)簡(jiǎn)單相連就會(huì)降低你的計(jì)算機(jī)的安全性。 

  對(duì)于越大的相連的網(wǎng)絡(luò)這句話越適用,比如Internet,這里有成千上萬的人可能會(huì)訪問你的計(jì)算機(jī)。很多基于Internet的服務(wù),特別是WWW,別設(shè)計(jì)成能使其他人很容易的從你的計(jì)算機(jī)中獲取信息。這些你允許接受訪問的服務(wù)(或者是有意的,或者是無意的)都有可能成為老謀深算、心懷惡意的人的攻擊途徑。一個(gè)很糟糕的網(wǎng)絡(luò)服務(wù)器很容易被攻破,甚至潛在給出了可以訪問你的整個(gè)計(jì)算機(jī)和重要數(shù)據(jù)的權(quán)限。 

  我說你提供的每一項(xiàng)網(wǎng)絡(luò)就象進(jìn)入你系統(tǒng)中另一個(gè)門,是指什么呢?什么才是安全破壞呢?不管是什么目的,安全破壞是指一個(gè)人從你的計(jì)算機(jī)中獲得了未經(jīng)授權(quán)的訪問權(quán)。"Unauthorized access"(未經(jīng)授權(quán)的訪問權(quán))也可以理解為很多事情,試圖從服務(wù)器上運(yùn)行一個(gè)非公共的程序,甚至是獲得在Unix中獲得root權(quán)限。 

  你過多的依賴于為網(wǎng)絡(luò)服務(wù)器編寫安全程序的程序員的知識(shí)和細(xì)心。畢竟,沒有人指望你詳細(xì)審查幾千行的源碼只為了弄清楚軟件是否有安全漏洞;大多數(shù)情況,你依賴編程者的可靠性和其他審閱源碼和仔細(xì)的幫助測(cè)試軟件的專家。假如網(wǎng)蟲們證明了你不能完全相信這些程序員可以寫出完美的安全的代碼,那么你可以采取措施最大限度的減少風(fēng)險(xiǎn)。 

  在后面的"保護(hù)你的Web服務(wù)器",你將學(xué)習(xí)Web服務(wù)器的安全。目前,假定你的應(yīng)用于Web服務(wù)器的軟件是安全的,并且正確的配置了;也就是說,沒有人可以僅僅通過你的Web服務(wù)器從你的機(jī)器中獲得未經(jīng)授權(quán)的權(quán)限。為什么寫安全的CGI腳本很重要呢?CGI是一個(gè)允許你拓展Web服務(wù)器的一般協(xié)議。通過編寫CGI程序,你能夠增加Web服務(wù)器的功能。這些功能很可能無意中引入新的安全漏洞。一個(gè)糟糕的CGI應(yīng)用程序很可能允許任何人擁有你的機(jī)器的完全的權(quán)限。 

  用戶提交一個(gè)表單或者是以另一種方式訪問CGI腳本的時(shí)候,本質(zhì)上來說,是你允許他們遠(yuǎn)程運(yùn)行你的服務(wù)器中的應(yīng)用程序。因?yàn)楹芏嗟腃GI應(yīng)用程序接受用戶的表單輸入(或通過填寫表,或是通過命令行),從另一個(gè)角度來說,你允許用戶控制CGI程序的運(yùn)行。作為CGI程序的作者,你需要確定你的CGI腳本只能用來實(shí)現(xiàn)它指定的功能。這一章提到了相關(guān)的Web安全問題,提供了編寫安全的CGI程序的深入的資料。在本章的最后,你也會(huì)學(xué)會(huì)怎樣安全的編寫CGI。 


1. 基本的安全問題 

  你的Web服務(wù)器的全面的安全性取決于很多因素。如果你的Web服務(wù)器沒有正確配置或者系統(tǒng)有其它漏洞的話,那么一個(gè)安全的CGI程序也是毫無用處的。這里,我論述一些相關(guān)的Web安全問題,并說明如何為CGI程序正確的配置你的Web服務(wù)器。 

1-1. 操作系統(tǒng) 

  一個(gè)通常的問題是什么樣的平臺(tái)對(duì)Web服務(wù)器來說更安全?運(yùn)行System 7的Macintosh,Unix的工作站,運(yùn)行OS/2或Linux的PC等等。在這個(gè)問題上有過很多爭(zhēng)論,這些反映了人們對(duì)不同的操作系統(tǒng)的不同的偏愛。 
  沒有一個(gè)操作系統(tǒng)比另外一個(gè)明顯安全。Unix被認(rèn)為比單用戶的平臺(tái)(比如acintosh或者是運(yùn)行著Windows的PC)更安全,因?yàn)樵?jīng)有人攻破過一些運(yùn)行著后者(注:括號(hào)中)的機(jī)器,并擁有了所有文件的權(quán)限。然而對(duì)于Unix,有一個(gè)關(guān)于文件屬主和權(quán)限的基本的理解。如果你的服務(wù)器正確的配置了,并被一個(gè)安全的用戶(比如:非root用戶)擁有,這時(shí)候,如果未經(jīng)授權(quán)的用戶闖進(jìn)來,他(她)只能造成有限的破壞。然而,有限的破壞已經(jīng)夠糟糕了,在以后的章節(jié)的例子中你會(huì)明白。 

  另一方面,因?yàn)閁nix經(jīng)常要配置很多不同類型的網(wǎng)絡(luò)服務(wù),比如mail,FTP,Gopher,WWW等等,因此,有更多的潛在的“后門”。加強(qiáng)這些服務(wù)的安全性是一個(gè)耗時(shí)的過程,甚至對(duì)有經(jīng)驗(yàn)的系統(tǒng)管理員亦如此。即使你每項(xiàng)配置正確無誤,然而在每個(gè)單獨(dú)的軟件包里仍有可能出現(xiàn)惱人的bug。安全漏洞在各種軟件包中并不是罕見的,從一些組織(比如CERT(the Computer Emergency ResponseTeam))的有關(guān)各種的Unix網(wǎng)絡(luò)服務(wù)周期性的通知中我們可以清楚的了解到。 

  每一個(gè)不同的平臺(tái)都有其不同的安全含意,但是不能彼此比較安全性。盡管你應(yīng)該注意每個(gè)操作系統(tǒng)的安全性,但是這不應(yīng)該成為你選擇平臺(tái)的主要標(biāo)準(zhǔn)。選擇你的平臺(tái),糾正有關(guān)該平臺(tái)相關(guān)的安全漏洞,然后安全正確的配置你的Web服務(wù)器。在你完完全全的完成這些步驟之后,你才應(yīng)該將你的精力投入到編寫安全的CGI腳本中去。 

1-2. 保護(hù)你的服務(wù)器 

  編寫安全的CGI腳本的第一步要確定你安全并正確的配置了你的Web服務(wù)器。如果你的Web服務(wù)器并不可靠,那即使你再仔細(xì)編寫你的CGI腳本也是沒有用的,人們?nèi)匀豢梢躁J入你的計(jì)算機(jī)。而且,正確的配置你的Web服務(wù)器能夠減小糟糕的CGI程序所帶來的可能的危害。 

More:選擇一個(gè)安全的Web服務(wù)器 

  在不同的平臺(tái)有數(shù)不清的Web服務(wù)器可供使用。如果可能的話,自我確定一個(gè)產(chǎn)品是否安全是很困難的,你將不得不依靠公司的信譽(yù)和口頭承諾。 
  檢查你的選擇。在你擁有了一個(gè)Web服務(wù)器的列表之后,看一下每個(gè)產(chǎn)品的有效期以及目前有多少人使用它。越老的并且經(jīng)常使用的Web服務(wù)器,有關(guān)的安全方面的bug越有可能被發(fā)現(xiàn)并修補(bǔ)。如果源碼是開放的,并且你有時(shí)間和專門技術(shù),自己從頭至尾看一下源文件,看看能否找到潛在的漏洞。閱讀網(wǎng)絡(luò)中不同的新聞組對(duì)該產(chǎn)品以及作者和發(fā)行人的評(píng)論。著名的公司或作者會(huì)很快的通知用戶其產(chǎn)品的任何問題。閱讀各個(gè)組織(如CIAC(Computer Incident AdvisoryCapability)和CERT)有關(guān)安全方面的警告信息。 

  檢查所有的服務(wù)器組件并確定你是否真的需要所有組件的特性。越復(fù)雜、功能越強(qiáng)大的服務(wù)器,越有可能存在未被發(fā)現(xiàn)的安全問題。確定你的服務(wù)器支持日志功能,這樣你可以跟蹤安全問題或其它故障的原因。 

  有一個(gè)對(duì)付意外事件的計(jì)劃。如果發(fā)現(xiàn)安全漏洞,要隨時(shí)準(zhǔn)備升級(jí)或者替換你的Web服務(wù)器。關(guān)注新版本的發(fā)行和新聞組中有關(guān)你的Web服務(wù)器的信息。盡量使用Web服務(wù)器最新的非測(cè)試的版本。 

  不必?fù)?dān)心免費(fèi)的服務(wù)器。關(guān)于開發(fā)源碼使服務(wù)器更安全或者相反有爭(zhēng)論。如果服務(wù)器的源碼不公開,安全漏洞將更難發(fā)現(xiàn)。如果源碼公開,那么,理論上,漏洞將很快被發(fā)現(xiàn),公開并得到修補(bǔ)。 

在增強(qiáng)服務(wù)器的安全性時(shí),應(yīng)該有三個(gè)目的: 

A.配置你的程序使它只能提供你指定的服務(wù)。 
B.不到必要的時(shí)候不暴露任何信息。 
C.如果系統(tǒng)遭到入侵,最大限度地減少損壞。 

  我知道的有關(guān)你的計(jì)算機(jī)的信息越多,我就越有機(jī)會(huì)闖入你的計(jì)算機(jī)。例如,如果我知道哪個(gè)目錄或者文件夾存儲(chǔ)了你的所有的敏感的、私有的信息,這樣,我將進(jìn)入你的系統(tǒng)獲取全部訪問權(quán)縮小至只是獲得某個(gè)目錄的權(quán)限(通常是更容易了);蛘撸绻铱梢栽L問你的服務(wù)器配置文件或源碼或者是你的CGI腳本,那我可以很容易的瀏覽它們來尋找安全漏洞。如果你的系統(tǒng)有漏洞,你不想讓別人輕易知道,你必須在別人之前發(fā)現(xiàn)它們。 

1-2-1.你應(yīng)該在什么地方放置你的CGI程序? 

  很多服務(wù)器允許你通過各種不同途徑來運(yùn)行CGI程序。例如,你可以指定一個(gè)特定的目錄作為你的cgi-bin。或者,你可以允許CGI存放在任何目錄下。 

  這兩種方法都有優(yōu)缺點(diǎn),但是從安全的角度來說,在一個(gè)指定的目錄中放置你的所有的CGI應(yīng)用程序更好。把所有的程序放到同一個(gè)目錄使你很容易跟蹤你服務(wù)器器所有的應(yīng)用程序并審查它們的安全漏洞,同時(shí),還可以防止被惡意修改。 

 如果你傾向于使用描述型的語言(例如Perl)來編寫你的大部分的應(yīng)用程序,那么源碼被包含在程序自身中。如果你不小心的話,這些代碼很容易被閱讀,甚至被利用。例如,很多文本編輯器存儲(chǔ)備份的文件,通常在文件名的后面加一個(gè)擴(kuò)展名(比如.bak)。 

 舉個(gè)例子,emacs使用擴(kuò)展文件名~存儲(chǔ)備份文件。假設(shè)你使用Perl編寫了一個(gè)CGI腳本——program.cgi——存儲(chǔ)在Web的數(shù)據(jù)目錄而非中心的指定的目錄中。現(xiàn)在,假設(shè)你使用emacs對(duì)程序做了一些瑣碎的修改而忘記了刪除備份文件,F(xiàn)在,在你的目錄里有了兩個(gè)文件:program.cgi和program.cgi~。Web服務(wù)器知道以.cgi結(jié)尾的文件是CGI程序,它會(huì)運(yùn)行這個(gè)程序而不是顯示它的內(nèi)容.然而,聰明的用戶可能嘗試訪問program.cgi~.因?yàn)樗皇且?cgi結(jié)尾,你的Web服務(wù)器將它以原始的文本文件發(fā)送出去,這樣就允許用戶查看你的源代碼來搜尋可能的漏洞.這違反了避免暴露不必要信息的原則. 

  當(dāng)然,如果你的服務(wù)器允許你指定位于某一特定的目錄下的文件均為CGI,那么這個(gè)文件的擴(kuò)展名是什么也就無關(guān)緊要了.這樣,在前面的例子中,如果備份文件放在這樣特定的目錄里,當(dāng)用戶試圖訪問它時(shí),服務(wù)器就會(huì)運(yùn)行這個(gè)程序而不是發(fā)送源代碼. 

  注意到在你的服務(wù)器中指定一個(gè)中心目錄作為CGI程序的存放位置是有限定的,特別是在多用戶系統(tǒng)中.例如,如果你是一個(gè)ISP(Internet Service Provider)并且你想讓你的的用戶可以編寫并運(yùn)行他自己的CGI程序,你可能有意允許CGI程序可以存放在任何的目錄中.做這個(gè)之前,認(rèn)真考慮一下可替換的選項(xiàng).你的客戶們打算寫很多的特定的個(gè)性化的腳本嗎?如果不是,最好是讓你的客戶將他的CGI腳本提交給你,然后由你將其添加到cgi-bin目錄中,而不要允許CGI可在任何目錄中有效. 

  關(guān)于CGI程序的位置另外一個(gè)問題是將解釋器放在哪里.解釋腳本時(shí),服務(wù)器運(yùn)行解釋器,由它順序裝載腳本并執(zhí)行. 

  不要將解釋器放到你的cgi-bin目錄中,或其他有關(guān)你的數(shù)據(jù)結(jié)構(gòu)的任何目錄中.給了用戶訪問解釋器的權(quán)限本質(zhì)上就是給了他們運(yùn)行你的系統(tǒng)中任何程序或命令的權(quán)力. 

  如果你使用Windows或其他的非Unix操作系統(tǒng),這尤其重要.在Unix系統(tǒng)中,你可以在腳本的第一行中指定解釋器.例如: 

  #!/usr/local/bin/perl 
  # this first line says use Perl to run the following script 

  在Windows中,舉個(gè)例子,沒有類似在腳本中指定解釋器的方法.一個(gè)調(diào)用Perl腳本的方法是建立一個(gè)批處理文件來調(diào)用Perl和腳本: 

  rem progname.bat 
  rem a wrapper for my perl script, progname.pl 
  c:\perl\perl.exe progname.pl 

  然而,你也許傾向于避免建立額外的程序,只是簡(jiǎn)單的將perl.exe放在你的cgi-bin 
目錄中,并訪問如下的URL: 

  http://hostname/cgi-bin/perl.exe?progname.pl 
[page_break]這也行,但是這樣也允許了網(wǎng)絡(luò)上的任何一個(gè)人運(yùn)行你機(jī)器中的Perl命令.例如,可以訪問如下的URL: 

  http://hostname/cgi-bin/perl.exe?-e+unlink+%3C*.*%3E%3 

  經(jīng)過解碼,其相當(dāng)于調(diào)用Perl并運(yùn)行下面的一行程序,這行程序?qū)h除當(dāng)前目錄的所有文件.顯然,這是我們不想的. 

  unlink <*.*>; 

  你永遠(yuǎn)沒有理由將解釋器放入你的cgi-bin目錄中(或者其他可以運(yùn)行CGI的目錄),所以千萬不要這么做.一些Windows服務(wù)器能夠根據(jù)其擴(kuò)展名辨別腳本的類型并運(yùn)行相應(yīng)的解釋器.例如,Win-HTTPD認(rèn)為每一個(gè)以.pl結(jié)尾的CGI腳本是Perl腳本,并自動(dòng)運(yùn)行Perl.如果你的Web服務(wù)器沒有這個(gè)特性,就像這章第一個(gè)Windows Perl例子那樣使用包裝的腳本.More:我應(yīng)該使用一個(gè)解釋器嗎? 

  如果你使用一個(gè)Unix或者是Macintosh的Web服務(wù)器的話,記住永遠(yuǎn)不要冒險(xiǎn)將一個(gè)解釋器放到你的cgi-bin中.前面我們提到過,Unix允許你指定特定的位置給包含腳本的解釋器.為了在Macintosh中使這些腳本有效,你可以使用一個(gè)應(yīng)用程序如ResEdit編輯代碼將腳本與挪用的解釋器結(jié)合. 

1-2-2.SSI(Server-Side Includes) 

  在第四章中,你已經(jīng)知道了應(yīng)該避免服務(wù)器嵌入指令的原因。一個(gè)經(jīng)常提出的一般原因是安全性。很顯然,一些服務(wù)器嵌入指令(特別是NCSA和Netsape)的執(zhí)行會(huì)允許用戶將程序輸入包含到HTML文件中。每次當(dāng)這些HTML文件被訪問時(shí),在服務(wù)器端程序會(huì)運(yùn)行并將輸出作為HTML文件的一部分顯示出來。 

  允許這種服務(wù)器的嵌入指令,你就很容易受到一些安全風(fēng)險(xiǎn)的影響。首先,在Unix的計(jì)算機(jī)中,程序由服務(wù)器的所有者運(yùn)行,而不是程序的所有者。如果你的服務(wù)器沒有正確配置,并且將重要的文件或程序交給服務(wù)器的所有者,這些文件和程序以及它們的輸出有可能被你的計(jì)算機(jī)的用戶所訪問。 

  當(dāng)你允許用戶通過瀏覽器修改你系統(tǒng)中的HTML文件時(shí),這種風(fēng)險(xiǎn)就增大了。一個(gè)通常的例子是留言本。在留言本中,用戶填寫表單并把信息提交到CGI程序中,程序一般是將未編輯的信息附加到一個(gè)HTML文件中。如果不編輯或過濾提交的信息,你就允許了用戶從他或她的瀏覽器中提交HTML代碼。如果你允許程序在服務(wù)器端嵌入執(zhí)行,不懷好意的用戶就可以通過提交如下的附加代碼給你的機(jī)器造成破壞: 

  

  這個(gè)服務(wù)器嵌入指令將試圖盡可能地刪除你的機(jī)器中的所有內(nèi)容。 

  你可以通過很多方法避免這個(gè)問題,而不需要完全關(guān)閉服務(wù)器嵌入。你可以在將提交的文本附加到你的留言本之前過濾所有的HTML附加代碼;蛘吣憧梢越鼓愕姆⻊(wù)器嵌入中的exec的功能(在這章后面的"增強(qiáng)你的Unix服務(wù)器的安全"中我將演示在NCSA服務(wù)器中如何做)。 

  如果你忘記了其中的任何一條,其他的一些防護(hù)措施同樣可以很大程度上減因這種附加代碼造成的危害.例如,只要你的服務(wù)器以不存在的用戶,非root的身份運(yùn)行,這個(gè)附加代碼不會(huì)刪除任何重要的東西,可能什么也不會(huì)丟掉.假設(shè)不還 好意者不是試圖刪除你的磁盤上的所有東西,而是使用如下的代碼獲取你的 etc/passwd作為破解之用: 

  

  當(dāng)然,如果你的系統(tǒng)使用的是shadow型的passwd檔,那么你的/etc/passwd對(duì)潛伏的hacker來說毫無用處. 

  這個(gè)例子論證了通常的服務(wù)器端嵌入指令和CGI中兩個(gè)很重要的問題.首先,安全漏洞可以被完全隱藏.誰會(huì)想到一個(gè)簡(jiǎn)單的使用SSI編寫的留言本程序可以體現(xiàn)如此之大的安全風(fēng)險(xiǎn)?其次,一個(gè)安全漏洞的潛在的危害可以通過正確配置你的服務(wù)器和加強(qiáng)你的系統(tǒng)安全來降低到最小. 

1-2-3.增強(qiáng)你的Unix服務(wù)器的安全 

  一個(gè)安全的Unix系統(tǒng)對(duì)于Web文件服務(wù)來說是個(gè)非常優(yōu)秀的平臺(tái)。然而,在加強(qiáng)服務(wù)器安全和正確配置Unix的Web服務(wù)器的過程中伴隨著很多復(fù)雜的問題。你應(yīng)該做的第一件事就是確定你的機(jī)器已經(jīng)盡可能的安全了。 

  將你不需要的網(wǎng)絡(luò)服務(wù)關(guān)掉,不管對(duì)你而言他們是多么沒有害處。任何人未必能使用finger協(xié)議侵入你的系統(tǒng),舉個(gè)例子,它提供了一些用戶的信息,然而,finger可以提供給hacker關(guān)于你的系統(tǒng)的有用的信息。 

  加強(qiáng)你的系統(tǒng)的內(nèi)部安全。如果hacker設(shè)法破解了一個(gè)用戶帳號(hào),要確定這個(gè)hacker不會(huì)獲得額外的權(quán)限。安全shadow型的password文件和去除設(shè)定用戶權(quán)限的腳本(腳本以所有者的身份運(yùn)行,即使是由其他用戶調(diào)用時(shí))是很有用的。 

  加強(qiáng)Unix機(jī)器的安全是一個(gè)復(fù)雜的課題,超出了本書的范圍。我強(qiáng)烈建議你購買一本這方面的書,閱讀Internet上這方面的資源,如果有必要的話,甚至可以雇傭一個(gè)咨詢顧問。不要低估加強(qiáng)你的機(jī)器安全的重要性。 

  另外,分配隔離的空間給你的Web服務(wù)器和文件。你的文件目錄的用途是將這些文件提供給其他人使用,可能是整個(gè)Internet,因此你不要將你別人知道的任何東西放到這些目錄里。你的服務(wù)器目錄包含重要的日志和配置信息,并且你要盡可能的不要讓你的內(nèi)部用戶看到或修改它。 

  要明智的設(shè)置你的目錄和服務(wù)器的所有權(quán)和使用權(quán)。為Web相關(guān)的目錄建立一 新的用戶和組是通常的一個(gè)方法。確定非特權(quán)用戶不能更改服務(wù)器或文件目錄。 

  你的服務(wù)器千萬不要以root身份運(yùn)行(running as root)。在Unix系統(tǒng)中,只有root能夠訪問小于1234的端口。因?yàn)槿笔〉腤eb服務(wù)器運(yùn)行于端口80,你需要是root來啟動(dòng)一個(gè)Web服務(wù)器。然而,在一個(gè)Web服務(wù)器以root身份運(yùn)行以后,它可以修改自身進(jìn)程的所有權(quán),或者改變它用以連接的子進(jìn)程的所有權(quán)。其中任何一種方法都需要服務(wù)器以非root身份運(yùn)行。確定配置你的Web服務(wù)器使其以非root身份運(yùn)行,最好是以一個(gè)完全不存在的用戶如nobody。這樣,如果在你的Web服務(wù)器或CGI程序中有漏洞時(shí),它可以降低潛在的危害。 

  禁止所有你不需要的服務(wù)器特性。如果你開始禁止了一個(gè)特性,而后來又決定使用它時(shí),你總是可以將其改回來的。像SSI和SSL都是你可能需要禁止的。 

  如果你的用戶不需要通過你的服務(wù)器將他們個(gè)人的Web文件用于服務(wù),就需要使Web目錄無效。這樣一來,你就可以完全地控制你的機(jī)器中用于服務(wù)的所有文件,這對(duì)于通常的維護(hù)和安全是很重要的。 

  如果你的用戶需要將他們個(gè)人文件用于服務(wù)(例如,如果你是一個(gè)IAP(InternetAccess Provider),確信他們不能超越你的主范圍。認(rèn)真考慮一下用戶是否需要在他們的個(gè)人目錄里運(yùn)行CGI程序的權(quán)力。前面我們已經(jīng)提到,最好將所有的CGI放到一個(gè)集中的位置。 

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

  在Web上一個(gè)流行的軟件包是cgiwrap,由Nathan Neulinger(nneul@umr.edu)編寫。這個(gè)軟件包允許用戶作為程序的擁有者運(yùn)行他們自己的CGI程序,而不是作為服務(wù)器的所有者。 

  不清楚僅僅允許所有人運(yùn)行他們自己的未包裝的CGI程序是更否更有益。一方面,一個(gè)糟糕的CGI腳本由nobody擁有比起由一個(gè)實(shí)際存在的用戶擁有來說,前者可能造成的危害更小。另一方面,如果CGI程序以nobody運(yùn)行對(duì)系統(tǒng)造成了破壞,那么責(zé)任在于系統(tǒng)管理員,相反,如果只是一個(gè)特定的用戶文件被破壞了,那么責(zé)任終將是用戶的。 

  我的建議是不要賦予用戶運(yùn)行個(gè)人CGI的權(quán)力,如果這樣不可能,那么你最終使用cgiwrap還是一個(gè)簡(jiǎn)單的程序取決于你想責(zé)任出在哪里。 
--------------------------------------------------------------------- 

  最后,你可能需要考慮你的Web文件建立一個(gè)chroot環(huán)境。在Unix系統(tǒng)中,你可以通過使用chroot來保護(hù)目錄。當(dāng)server運(yùn)行在一個(gè)chroot的目錄中時(shí),它看不到這個(gè)目錄之外的任何東西。在一個(gè)chroot環(huán)境中,如果有人想侵入你的Web服務(wù)器,他們只會(huì)破壞這個(gè)目錄里的文件。 

  注意,一個(gè)chroot環(huán)境僅適用于當(dāng)Web服務(wù)器提供單獨(dú)的文件資源。如果你的Web服務(wù)器將用于服務(wù)的用戶文件存放在多個(gè)目錄中時(shí),想建立一個(gè)有效的chroot環(huán)境幾乎是不可能的。另外,解釋器(例如Perl或者一個(gè)shell)的存在也會(huì)降低chroot環(huán)境的性能。在一個(gè)沒有任何shell和解釋器的chroot環(huán)境中,侵入系統(tǒng)的人最壞情況下能改變和破壞你的文件,如果存在解釋器,潛在的危害會(huì)上升。 

1-2-4.例子:安全的配置NCSA服務(wù)器 

  我將通過討論NCSA服務(wù)器(v1.4.2)來論證怎樣著手正確地配置Unix環(huán)境下的通用的Web服務(wù)器。有很多Web服務(wù)器可以運(yùn)行在Unix系統(tǒng)下,NCSA是最早的服務(wù)器之一,被廣泛使用并且屬于自由軟件,而且相當(dāng)容易配置。我僅說明我認(rèn)為對(duì)Web服務(wù)器安全方面有關(guān)的配置;想獲得有關(guān)配置NCSA httpd更多詳細(xì)的說明,請(qǐng)參照它的站點(diǎn): 

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

你可以將這里說明的原則應(yīng)用到幾乎所有的Unix Web服務(wù)器中。 

  首先,我需要表明我的目標(biāo)。在這個(gè)方案中,我想將NCSA服務(wù)器架設(shè)在一個(gè)很小的名為MyCompany的ISP的安全的Unix機(jī)器上。這臺(tái)機(jī)器的域名為www.mycompany.net。我需要我的機(jī)器中的每一個(gè)擁有帳號(hào)的人能夠?qū)⑺蛩腤eb文件用于服務(wù)并可以使用CGI或其他的特性。 

  我絕對(duì)應(yīng)該需要什么特性呢?這里,因?yàn)槲沂且粋(gè)很小的ISP,我不能讓用戶自行將其CGI用于服務(wù)。如果他們想寫出并使用他們自己的CGI程序,他們必須將其提交給我來檢查;如果CGI程序沒問題,我就安裝它。另外,我要提供一些通常需要的一般的程序,比如留言本和各類表單處理的應(yīng)用程序,F(xiàn)在,這個(gè)方案里我不需要其他任何的特性了,包括服務(wù)器嵌入指令。 

  我們來看一下我將如何配置我的Web服務(wù)器。我將建立用戶和www組;這些將擁有所有恰當(dāng)?shù)哪夸洝N覍⒔⒁粋(gè)目錄來存放我的服務(wù)器文件 
(/usr/local/etc/httpd/)和存放Web文件的目錄(/usr/local/etc/httpd/htdocs/)。所有這些目錄對(duì)全球是可讀的對(duì)所建立的用戶和組是可寫的。 

  現(xiàn)在,我將要配置服務(wù)器。NCSA HTTPD有三個(gè)配置文件: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 

  因?yàn)槲蚁胫付ㄔ?usr/local/etc/httpd/cgi-bin目錄中的所有文件為CGI程序,在srm.conf中包含如下一行: 

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

  注意我的cgi-bin目錄的實(shí)際位置在我的服務(wù)器目錄而不是文件目錄。因?yàn)槲蚁胍刮业姆⻊?wù)器目錄(包括包含CGI的目錄)盡量為私有,我將它放到文件目錄以外。如果你在該目錄中有一個(gè)名為mail.cgi的CGI,我可以通過如下的URL訪問它: 

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

  在srm.conf中需要編輯另一行;它對(duì)我們追求特定的服務(wù)器安全不是特別有關(guān)系,但是為了徹底的安全,我還是要提到它: 

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

  這個(gè)Alias指令允許我們?yōu)槟愕奈募夸洏鋬?nèi)部或以外的目錄指定一個(gè)別名。與ScriptAlias指令不同,Alias并不改變目錄的含義。 

  因?yàn)槲倚枰狗⻊?wù)器嵌入指令,并不允許CGI在cgi-bin以為的目錄運(yùn)行,在srm.conf中我通過在行首插入一個(gè)英鎊符號(hào)(#)注釋掉幾行: 

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

  AddType可以幫助你在MIME類型和文件擴(kuò)展名間建立關(guān)聯(lián)。text/x-server-parsed-html對(duì)parsed HTML來說是MIME類型,application/x-httpd-cgi則是CGI應(yīng)用程序類型。這里,我不需要為這種MIME類型指定擴(kuò)展名,因?yàn)樵谂渲梅⻊?wù)器的時(shí)候,我們忽略cgi-bin中的所有文件擴(kuò)展名,一律被視為CGI。 

  最后,我需要通過編輯全局的access.conf文件來設(shè)置某些目錄的屬性和訪問權(quán)限。為了為所有的目錄定義全局的參數(shù),僅僅將沒有任何環(huán)境標(biāo)記的指令放到文件中。為了為特定的目錄指定參數(shù),在directoryname是目錄的全路徑時(shí),通過來包含指令。 



標(biāo)簽:CGI的安全(一)