FreeBSD連載(89):CGI和SSI的安全性

2000年1月30日 16:17 王波

CGI和SSI的安全性

  允許根據用戶的請求而在伺服器上運行程序,本身就是一種安全漏洞,因此只有在必要時,才允許用戶使用這些 功能。

  對於SSI,安全問題比較簡單,可以將其設置為只分析普通標志,不執行外部程序,這必須在配置檔案中使用 Options IncludesNOEXEC選項,而非Options Includes選項。就能滿足對安全性的一般 要求。

  CGI程序的情況更為複雜。由於CGI可以用兩種方式設置,一種為由ScriptAlias設置CGI程序的 路徑,另一種為通過設置CGI的後綴而設置的。通常只有在信任用戶有能力創建沒有(或很少)漏洞的CGI程序時,才使 用後綴確認CGI程序。否則將會產生一些很糟糕的CGI程序,使得系統很容易被攻擊。因此將CGI程序限制在一些固定 目錄下的做法更為常見,這至少讓一個CGI程序經過伺服器管理員的一些檢查,避免明顯的漏洞。

  CGI程序的另一個問題是,如果CGI程序要保存瀏覽器客戶發布的數據,那麼它就要訪問系統的檔案系統。通常 Apache伺服器使用User和Group配置伺服器運行的用戶和組屬性,Apache伺服器啟動的CGI程序預設 也使用這個用戶和組屬性運行,也就擁有了這個用戶和組的權限,可以存取檔案系統中的數據,這就對系統安全造成另一個影 響。然而又必須讓CGI程序存取數據檔案,因此就要適當調整User和Group的設置,使得它能夠存取合適的數據文 件。

  即使如此,由於所有的CGI程序都以同樣的用戶執行,那麼不同用戶的CGI就能相互操作別的用戶的數據檔案, 從而造成安全問題。為了使得不同的用戶以不同的用戶身份執行CGI,就需要使用程序的SetUID功能。因為SetUID 會帶來極大的系統漏洞問題。因此如非必要,不要使用SetUID程序,尤其是root身份的SetUID程序。設 置用戶身份的問題可以使用Apache的suEXEC能力來幫助完成,它首先將身份改變為合適的用戶,再執行相應的CGI程序。