大量虚拟主机用户如何限制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 admin@xxxx.com
ServerName www.vhost-u1.xxxx.com
CustomLog /home/logs/vhost-u1-access_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>