大量虚拟主机用户如何限制PHP权限

发表于:2007-06-08来源:作者:点击数: 标签:
大量虚拟主机用户如何限制 PHP 权限 目前我们正在搭建免费空间系统,详情请见http://www.xianfeng.net 服务器采用FreeBSD+Apache+PHP 目前存在一个关键问题,问题详细如下: 我们拟开放PHP权限,但是考察目前国内提供PHP的站点,发现基本上存在这样子的问题

大量虚拟主机用户如何限制PHP权限 
目前我们正在搭建免费空间系统,详情请见http://www.xianfeng.net 
服务器采用FreeBSD+Apache+PHP 
目前存在一个关键问题,问题详细如下: 
我们拟开放PHP权限,但是考察目前国内提供PHP的站点,发现基本上存在这样子的问题: 
usera 
userb 
在同一个服务器上面相同的权限(具有php权限) 
如果不对usera和userb进行特别设置,那么usera就可以使用php相关函数来读取userb的空间内容,反过来,userb也可以做同样的事情。 
如果用户数目只有几十个,那还可以一个个特别设置 
open_basedir为用户自己的目录, 
但是如果目前有几百个用户,请问该如何限制用户的php程序之能打开用户自己目录的文件???

 白狐狸 回复于:2003-03-05 10:11:47
啊,这个问题真没想到过,不过一般也没谁会这么无聊啊,但总是个令人当心的问题啊,我也想知道

 HonestQiao 回复于:2003-03-05 22:01:15
但是万一客户的保密性的东西被别人读取了,那可怎么是好啊。

这个问题目前积求求接啊

 红袖添香 回复于:2003-03-06 01:01:34
[quote:f90823da96="HonestQiao"]但是万一客户的保密性的东西被别人读取了,那可怎么是好啊。

这个问题目前积求求接啊[/quote:f90823da96]

用户空间对外开放,外界能够读取的条件是,权限至少是

目录:0755
文件:0644

跟你的要求正好是矛盾的~

 aKen 回复于:2003-03-06 16:13:56
你可以通过在<virtualhost>内设置用户和组以及设置每个用户的主目录权限来试一个,方法是在每一个的virtualhost内添加user username group groupname,主目录如open_basedir/username设置为0700

 iloveyoufreebsd 回复于:2003-03-07 11:40:59
[quote:c27f60424d="aKen"]你可以通过在<virtualhost>内设置用户和组以及设置每个用户的主目录权限来试一个,方法是在每一个的virtualhost内添加user username group groupname,主目录如open_basedir/username设置为0700[/quote:c27f60424d]

是的我用过的。

不过得使 apache 支持 suexec 。

每个用户就可以设置权限为 700 运行了。

 HonestQiao 回复于:2003-04-03 19:39:07
但是这样子又出现了一个问题:
    因为是提供免费空间服务,所以可能100各用户都在通一台服务器上面。
    这不会要我建立一百个实际用户把,我的用户都是虚拟用户阿

 jasf 回复于:2003-04-04 13:25:57
[quote:7babce789d="aKen"]你可以通过在<virtualhost>内设置用户和组以及设置每个用户的主目录权限来试一个,方法是在每一个的virtualhost内添加user username group groupname,主目录如open_basedir/username设置为0700[/quote:7babce789d]
这方法我也用过,相对安全性高点。但是,当里面用户多的时候容易出现资源不足。对于一些用户自行修改目录权项的仍会引起一些问题。

 wesnet 回复于:2003-04-14 17:47:37
UP

这就是我这个月烦的事情罗 :(

随便补充一个,怎么能控制PHP写文件或上传文件不能超出虚拟主机的磁盘限制?(没办法用系统的QUOTA,因为都是虚拟用户)

 proftpd 回复于:2003-04-15 13:00:01
upup 楼上的更难哦。

 wesnet 回复于:2003-04-15 17:13:32
呵呵。。。是呀。。。好麻烦D


希望能快点有人出来为我们解决难题 :)

 haohaoo 回复于:2003-04-15 18:57:38
[quote:881736f591="iloveyoufreebsd"]

是的我用过的。

不过得使 apache 支持 suexec 。

每个用户就可以设置权限为 700 运行了。[/quote:881736f591]
suexec要怎么安装?
能介绍一下?

 wesnet 回复于:2003-04-25 10:32:06
顶....... :twisted:

 ique 回复于:2003-04-29 09:25:53
在hostqiao的问题中说道:
[quote][/如果用户数目只有几十个,那还可以一个个特别设置 quote]

linux的一个好处就配置的修改仅仅需要对文件进行修改,也就是说这些都可以通过程序来实现。
 
用户的开通通过一个某一个具有特许权限的cgi或者php程序来实现(特许权限--是指这个程序可以完成开通,具体设计就要靠自己了,我是新手),这样子就和定制是一样的效果。。
 
不知道是不是这样子?

 wesnet 回复于:2003-04-29 09:29:26
[quote:1cf763cfb5="ique"]??恐挥屑甘?觯?腔箍梢砸桓龈鎏乇鹕柚?quote]

linux的一个好处就配置的修改仅仅需要对文件进行修改,也就是说这些都可以通过程序来实现。
 
用户的开通通过一个某一个具有特许权限的cgi或者php程序来实现(..........[/quote:1cf763cfb5]

别想得太简单。。。我试过啦。。。对PHP进行大量用户的控制。。必须修改PHP的源码。。。好复杂的哦。。。但我已经 :D  :)  :o 搞好啦。。咿嘻嘻

 leaper 回复于:2003-04-29 10:17:33
Apache 用戶目錄存取支援 - suEXEC
  
  甚麼是suEXEC?
  suEXEC自Apache 1.2版本開始引入,負責處理CGI和SSI程式的請求,確保網頁使用者能以該目錄或程式的用戶ID來執行遠端程式。在正常情況下,所有CGI或SSI程式都必需由程式擁有者,透過Apache執行。

  在suEXEC使用正確的情況下,使用CGI/SSI程式的用戶ID來執行程式,能強制阻止其他用戶胡亂執行,從而提高網絡的安全性。相反,假若網管人員未能正確設定suEXEC,suEXEC將會為你帶來多個無可預知的系統保安漏洞,若你不熟識控制及設定ID的程式及其安全問題,我們強烈建議你不使用suEXEC。


  用前準備
  在閱讀正式說明文件前,請細看及留意Apache Group的要求及假設。

  第一,Apache Group假定你的作業系統為任何一種UNIX系統,並擁有setuid及setgid功能,所有suEXEC設置例子都需在這大前提下才能正常運作。而在其他支援suEXEC的作業平台中,suEXEC的設置亦有可能和UNIX不同。

  第二,你必需有系統保安及管理的基本概念,這些概念包括setuid/setgid的運作原理及其對系統的衝擊,和清楚知道這些運作所產生的保安漏洞。

  第三,在你沒有更改suEXEC程式碼的情況下,Apache Group才能保證suEXEC的風險已減到最低,suEXEC的程式碼經開發者及測試者審慎測試,已加入預防錯誤的程式碼以保證suEXEC不會產生錯誤,更改原有程式碼會引起無法預知的系統漏洞。除非你已精通系統安全編程,及你願意和Apache Group分享你的開發成果,不則我們絕不建議更改suEXEC的程式碼。

  第四,在Apache Group考慮過後,suEXEC已豁出Apache的預設安裝之外。因此,網管人員在安裝suEXEC時需特別注意suEXEC的細節,幾經考慮了suEXEC的各項設置後,網管人員可從預設的安裝方法嵌入suEXEC至Apache中,suEXEC的設置參數必需謹慎決定。由於suEXEC需網管人員有周密的計劃,故Apache Group謹希望審慎及細心的網管人員使用。

  suEXEC安全模型

  在設定及安裝suEXEC之前,我們先討論suEXEC的安全模型,這樣你可詳細地了解suEXEC的運作狀況及其系統保安措施。

  suEXEC是Apache的「包裝程式」,這包裝程式有setuid權限,當有CGI或SSI執行請求時,suEXEC就會把執行用戶更改為程式的擁有者後才執行。

  包裝程式其後會根據以下步驟檢查「包裝過程」是否正常,若以下有其中一個檢查失敗,suEXEC會把錯誤寫入記錄,並拒絕執行請求:

  傳入包裝程式的參數不足 。包裝程式只會在傳入足夠參數時才會執行,而這些參數必需乎合Apache的內部格式,如果包裝程式接收不到足夠的參數,那代表suEXEC被人破壞,或你suEXEC的Binary版本出現問題。
  
  執行包裝程式的是否合法用戶? 這檢查確保執行程式的用戶是系統中合法的用戶。

  執行用戶有沒有權使用包裝程式?只有唯一一個用戶(Apache用戶)可執行這個程式。
 
  被執行的程式有不安全的相對目錄參照字元?所有程式檔名開頭含有「/」或「..」都不獲處理,程式需存在Apache分配的目錄中。
 
  執行用戶是否合法用戶? 執行用戶必需是系統中已存在用戶。 
  
  執行工作組是否合法工作組?執行工作組必需是系統中已存在工作組。 

  執行用戶是否超級用戶? 目前Apache仍不允許「root」執行CGI/SSI程式。 CGI/SSI programs. 

  執行用戶ID是否低於Apache的最低容許ID? 最低允許ID值在設定檔中找到,用來控制哪個值以上的ID才可執行包裝程式,這功能可過濾系統內設用戶。
  
  程式所屬的工作組是否超級用戶工作組? 目前suEXEC仍不允許「root」工作組執行CGI/SSI程式
 
  程式工作組是否低於Apache最低容許ID? 最低允許ID值在設定檔中找到,用來控制哪個值以上的GID才可執行包裝程式,這功能可過濾系統內設工作組。
 
  包裝程式可否更改執行用戶及其工作組? 成功與否在於將CGI/SSI程式SETUID及SETGID的過程,工作組使用列表
 
  載有該程式的目錄是否存在? 若果該目錄並不存在,要執行的程式也不會存在。 

  載有程式的目錄是否在Apache所設置的網頁空間內? 若執行請求發生於Apache常規部分,該目錄應在Apache的根目錄;若請求發生於一般UserDir,該目錄應在用戶的Document Root中。
 
  載有程式的目錄是否拒絕任何人寫入? 其他用戶不能存取這個目錄,只有目錄擁有者才能更改目錄裏的內容。 
  
  要執行的程式存在嗎? 不可能執行不存在的程式。
 
  程式是否不能被更改或更新? 除了程式擁有者外,任何人都沒有權限更改該程式。

  你的程式是否setuid或setgid程式? suEXEC不會處理會更改現時UID/GID的程式。

  程式擁有者是否就是suEXEC所包裝的用戶? 只有把請求包裝成程式擁有者權限才能執行該程式。
  
  可否清除程序環境以確保程式能順利行? suEXEC利用安全執行目錄來清除程序環境,所有頁面傳遞變數均會清除(在設置suEXEC時已設定)。 

  我們能否成為被執行的程式? execute? suEXEC已完了,是被執行的程式的開始。
 
  以上就是suEXEC包裝程式的標準運作安全模型,這嚴謹的模型引入了CGI/SSI程式的限制及程式設計指導,但設計時當然要在腦海中一步步實行。

  如欲獲取更多關於安全模型如何限制伺服器的設定,以及知道如何避免suEXEC所產生的系統漏洞,請參看Beware the Jabberwock。


設定及安裝suEXEC
  我們正式開始把suEXEC嵌入Apache中,如果你正使用Apache 1.2或是Apache 1.3的src/Configure的話,你需修改suEXEC的頭檔(Header File)及人手安裝Binary版本至正確位置,安裝過程可在suEXEC附加文件找到。以下幾節將會描述Apache 1.3,透過AutoConf-Style Interface(APACI)的設定及安裝過程。


suEXEC APACI設定選項


  --enable-suexec 
  代表安裝suEXEC至Apache中,加入這選項後,必需額外設置最少有一個 --suexec-xxxxx 選項,讓APACI知道suEXEC該如何設定。 

  --suexec-caller=UID 
  在Apache能呼叫suEXEC的用戶名稱,這是執行Apache子程序的用戶,只有這個用戶才可呼叫suEXEC。 

  --suexec-docroot=DIR 
  設定網頁文件存放位置,只有這目錄及其子目錄內的程式才可使用suEXEC,預設的目錄為 --datadir 加上「/htdocs」,例如你將datadir設為--datadir=/home/apache,那麼「/home/apache/htdocs」就是允許使用suEXEC包裝程式的目錄。 
  
  --suexec-logfile=FILE 
  設定記錄檔的檔案名稱,所有suEXEC的執行記錄及錯誤均會記入此檔(方便檢查及除錯),預設值為「suexec_log」,而預設目錄設在--logfiledir中。 
  
  --suexec-userdir=DIR 
  設定用戶存放網頁的目錄,所有suEXEC包裝都必需在這個目錄內進行,以確定這個程式是用戶親自允許執行的,若你只簡單地鍵入絕對路徑(i.e. 沒有萬用字元「*」),那麼UserDir和允許使用suEXEC的地方就應設定為同一個目錄,若suEXEC的UserDir並不包括用戶存放網頁的目錄,那麼這些網頁就因不乎合密碼檔的記錄而不能使用suEXEC。UserDir的預設值為「public_html」,若你設定Virtual Host時其UserDir在suEXEC目錄之外,那麼你就需要把suEXEC的UserDir設定為這堆目錄的父目錄。若你不正確設定UserDir,所有「~userdir」的CGI請求均會失敗。 

  --suexec-uidmin=UID 
  設定使用suEXEC的最大允許用戶ID,預設值為100,一般系統是500或者100。 

  --suexec-gidmin=GID 
  設定使用suEXEC的最大允許用戶組ID,預設值為100。 

  --suexec-safepath=PATH 
  設定suEXEC的安全目錄,這安全目錄允許執行CGI程式,預設值為「/usr/local/bin:/usr/bin:/bin」。 

 檢查suEXEC的設定
 在編譯及安裝suEXEC包裝程式之前,你可利用--layout選項檢查你目前各設定選項:
輸出例子:

    suEXEC setup:
            suexec binary: /usr/local/apache/sbin/suexec
            document root: /usr/local/apache/share/htdocs
           userdir suffix: public_html
                  logfile: /usr/local/apache/var/log/suexec_log
                safe path: /usr/local/bin:/usr/bin:/bin
                caller ID: www
          minimum user ID: 100
         minimum group ID: 100


編譯及安裝suEXEC包裝程式

  若你透過--enable-suexec選項,在Binary版本中決定使用suEXEC的話,按「make」後就會自動把suEXEC嵌入Apache中。
執行「make install」安裝所有Apache元件後,suEXEC會放置在由--sbindir選項決定的目錄中,預設目錄為「/usr/local/apache/sbin/suexec」。請留意,你需要成為超級用戶方可完成安裝過程,為了讓suEXEC有setuid的權力,你必需把suEXEC擁有者轉為「root」及加入setuid權限至suEXEC程式。



啟動及關閉suEXEC
  在啟動Apache之前,Apache主程式會尋找「sbin」裡的「suexec」程式檔(預設值為「/usr/local/apache/sbin/suexec」,若Apache能找到正確的suexec檔,Apache將會把suEXEC啟動記錄寫入錯誤日誌中:

    [notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)

  若在Apache啟動後在錯誤日誌中找不到以上訊息,即代表Apache伺服器找不到包裝程式,又或者該包裝程式檔沒有setuid權限。
你不可以中途加入suEXEC至運行中的Apache,你必先關閉並重新啟動Apache伺服器,純粹使用「HUP」或「USR1」是沒效的;若你想關掉suEXEC,你亦需同樣把Apache伺服器關閉並重開,但在重開之前你需移除suexec程式檔


使用suEXEC

  虛擬主機:
  透過User和Group可讓虛擬主機自設suEXEC的用戶及用戶組,設定後所有CGI請求都會依照User和Group的設定值來執行,若在宣告虛擬主機時沒有設定User和Group,Apache會使用主服器的用戶及用戶組

  使用者目錄:
  suEXEC包裝程式亦會接受以個別設定的用戶權限來執行CGI程式,只要把「~」加在用戶ID之前把主伺服器目錄導向至用戶之網頁目錄即可,所有乎合suEXEC安全模型的CGI程式及請求都可用這個方法以特定用戶執行CGI程式。


suEXEC除錯
  
  所有suEXEC的執行過程都會寫入日誌檔案,日誌檔案名稱可於--suexec-logfile選項中設定,若你已確定自己設置無誤,但仍有不明的suEXEC錯誤的話,可參看suEXEC的error_log。


suEXEC注意事項 
  
  目錄階層限制 
  在系統安全及效率的大前提下,所有在虛擬主機的網頁及個別用戶的suEXEC請求都必需在根目錄裏執行,例如你設定了四個虛擬主機,你必需把這些虛擬主機的根目錄歸納在一個Apache主文件目錄中,以乎合suEXEC需要在特定安全目錄下執行這個條件。 

  執行環境中的suEXEC路徑 
  更改suEXEC執行目錄有可能產生系統保安漏洞,請確定suEXEC的執行目錄為可信任的目錄,讓不可靠的目錄設定為suEXEC的執行目錄有可能被任何人以木馬程式攻擊電腦系統。 
更改suEXEC的程式碼 

  若你不清楚suEXEC程式碼的意義就自行更改其內容,可引起龐大的程式錯誤,請盡量不要更改suEXEC的程式碼。

 ralind 回复于:2003-04-30 12:05:35
...

 hew 回复于:2003-04-30 16:27:09
大家一起找资料去,我也想知道

 hwin 回复于:2003-05-01 12:59:03
如果php_admin_value能支持apache的 这样的语句就好了
php_admin_value open_basedir /home2/%2+

<VirtualHost 111.111.111.111>
    ServerAdmin [email protected]
    ServerName www.vhost-u1.xxxx.com
    CustomLog /home/logs/vhost-u1-aclearcase/" target="_blank" >ccess_log combined
    ErrorLog /home/logs/vhost-u1-error_log
    VirtualDocumentRoot /home/vhosts/%2+/%1
    VirtualScriptAlias  /home/vhosts/%2+/cgi-bin
    [b:370e32ad2c]php_admin_value open_basedir /home2/%2+[/b:370e32ad2c]
</VirtualHost>

原文转自:http://www.ltesting.net