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

CGI的安全(一)

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

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

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

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

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

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

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

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


1. 基本的安全問題 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  不要將解釋器放到你的cgi-bin目錄中,或其他有關(guān)你的數(shù)據(jù)結(jié)構(gòu)的任何目錄中.給了用戶訪問解釋器的權(quán)限本質(zhì)上就是給了他們運行你的系統(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中,舉個例子,沒有類似在腳本中指定解釋器的方法.一個調(diào)用Perl腳本的方法是建立一個批處理文件來調(diào)用Perl和腳本: 

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

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

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

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

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

  unlink <*.*>; 

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

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

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

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

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

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

  

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

  你可以通過很多方法避免這個問題,而不需要完全關(guān)閉服務(wù)器嵌入。你可以在將提交的文本附加到你的留言本之前過濾所有的HTML附加代碼。或者你可以禁止你的服務(wù)器嵌入中的exec的功能(在這章后面的"增強你的Unix服務(wù)器的安全"中我將演示在NCSA服務(wù)器中如何做)。 

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

  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  現(xiàn)在,我將要配置服務(wù)器。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目錄的實際位置在我的服務(wù)器目錄而不是文件目錄。因為我想要使我的服務(wù)器目錄(包括包含CGI的目錄)盡量為私有,我將它放到文件目錄以外。如果你在該目錄中有一個名為mail.cgi的CGI,我可以通過如下的URL訪問它: 

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

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

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

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

  因為我需要禁止服務(wù)器嵌入指令,并不允許CGI在cgi-bin以為的目錄運行,在srm.conf中我通過在行首插入一個英鎊符號(#)注釋掉幾行: 

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

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

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



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

相關(guān)文章