核心總結(jié):php-fpm/apache 過程所利用的用戶,不克不及是網(wǎng)站文件所有者。 凡是背反這個原則,則不合適最小權(quán)限原則。
按照出產(chǎn)環(huán)境不竭反饋,發(fā)現(xiàn)不竭有 php網(wǎng)站被掛木馬,盡大年夜部門啟事是因?yàn)闄?quán)限設(shè)置不合理造成。因?yàn)檗k事器軟件,或是 php 法度中存在縫隙都是不免的,在這類環(huán)境下,假定能準(zhǔn)確設(shè)置 Linux 網(wǎng)站目次權(quán)限, php 過程權(quán)限,那么網(wǎng)站的安然性實(shí)際上是可以獲得保障的。
那么,造成網(wǎng)站被掛木馬的啟事是甚么?
1. ftp 連接信息被破解,對這個啟事,可行的編制就是利用很是復(fù)雜的FTP 用戶名(不要利用常常利用的用戶名),假定是固定功課,可考慮利用 iptables 防火墻限制來歷 IP ??墒且恍┚跋笙?,可能需要利用 VPN 以便長途保護(hù)?!〖淳W(wǎng)站保護(hù)者需要利用 FTP 點(diǎn)竄網(wǎng)站文件時,必需先登錄到IDC機(jī)房的VPN 辦事器上,再進(jìn)行后續(xù)的把持。
2. 網(wǎng)站辦事器軟件/ 建設(shè) /php 法度存在縫隙,被操縱。
在會商這個題今朝,先申明文件及過程權(quán)限的幾個概念:
A. FTP用戶對網(wǎng)站目次具有最大年夜點(diǎn)竄權(quán)限,那么網(wǎng)站的文件所有者必然屬于 FTP, 這是無庸置疑的 , 不然若何點(diǎn)竄文件呢?
B. php-fpm/apache/nginx 過程對網(wǎng)站文件起碼需要有讀取權(quán)限,例如,以下號令便可查看這兩個過程所利用的賬號:
經(jīng)由過程上圖,我們可以發(fā)現(xiàn),nginx 和 php-fpm 子過程賬號是 nobody 。
我們再查看網(wǎng)站文件目次的權(quán)限:

發(fā)現(xiàn)網(wǎng)站文件所有者是www 賬號,那申明:
◆ nginx和 php 對網(wǎng)站只有讀取權(quán)限,無寫進(jìn)權(quán)限
◆ 假定php 法度需要對網(wǎng)站某些文件有寫進(jìn)權(quán)限,需要手工將文件或目次權(quán)限點(diǎn)竄成 777
◆ 因?yàn)閜hp-fpm 子過程是以 nobody 運(yùn)行,那么 php-fpm 生成的新文件所有者也是 nobody, 這時候 ftp 用戶將沒法點(diǎn)竄這些文件,解鈴還需系鈴人,當(dāng) php 生成文件后,需要調(diào)用 chmod("/somedir/somefile", 0777) 將文件權(quán)限點(diǎn)竄成 777 ,以便 FTP 用戶也能夠點(diǎn)竄這個文件。
◆ 常常有開辟人員找我要求重設(shè)php 生成的文件的權(quán)限。
◆ 假定php-fpm/apache/nginx過程以網(wǎng)站文件所有者用戶運(yùn)行,那意味著 php-fpm/apache/nginx 過程對全部網(wǎng)站目次具有可寫權(quán)限,惡夢也就由此開端。
可是我們發(fā)現(xiàn),有良多系統(tǒng)治理員為了省事,背反了Linux 最小化權(quán)限的原則,設(shè)置 php-fpm/apache/nginx 過程以網(wǎng)站文件所有者賬號運(yùn)行,當(dāng)然如許可能會便利 php 開辟人員( php-fpm 過程對全部網(wǎng)站目次具有可寫權(quán)限),可是如許一來, Linux 系統(tǒng)的文件系統(tǒng)權(quán)限原則將被打破,所有的安然辦法將形同虛設(shè)??梢韵胂蟮氖牵f一 php 法度中有縫隙,報(bào)復(fù)打擊者上傳木馬,便可以點(diǎn)竄網(wǎng)站的所有文件,網(wǎng)站首頁被黑,也就不足為怪了。
退一步,假定我們設(shè)置了較嚴(yán)格的權(quán)限,就算php 法度中存在縫隙,那么報(bào)復(fù)打擊者也只能竄改權(quán)限為 777 的目次,其它的文件是沒法被改寫的,網(wǎng)站不就就得更安然了嗎?
核心總結(jié):php-fpm/apache/nginx過程所利用的用戶,不克不及是網(wǎng)站文件所有者。 凡是背反這個原則,則不合適最小權(quán)限原則。
顛末我參閱網(wǎng)上關(guān)于nginx, php-fpm 建設(shè)的文章教程和市道上的一些冊本,發(fā)現(xiàn)有良多人受這些文章的誤導(dǎo),直接讓 php-fpm/apache/nginx過程以網(wǎng)站所有者賬號運(yùn)行,例如張宴的《實(shí)戰(zhàn) nginx 代替 apache 的高機(jī)能 Web 辦事器》一書的 52 頁中,存在以下設(shè)置:
而在第50 頁,設(shè)置網(wǎng)站文件所有者也為 www 用戶:
chown -R www:www /data0/htdocs/blog
明顯,此書的這部門內(nèi)部,對初學(xué)者有誤導(dǎo),針對這個標(biāo)題問題,我已向本書作者發(fā)郵件,??雌淠茉诘诙嬷羞M(jìn)行夸大年夜聲明,以避免因?yàn)檫^度寬松的權(quán)限建設(shè),造成一些安然隱患。
官方供給的建設(shè)文件中,php-fpm 子過程利用 nobody 用戶,這美滿是合理的,不必點(diǎn)竄。
那么nginx 的子過程用戶,若何設(shè)置合理? 我的建議是也利用 nobody (對弊端日記寫進(jìn)等無影響),設(shè)置編制以下:
nginx.conf文件第一行設(shè)置為 user nobody; , 再履行 nginx -s reload 便可。
php-fpm子過程用戶設(shè)置編制:
編纂文件php-fpm.conf (一般位于 /usr/local/php/etc/php-fpm.conf, 視安裝參數(shù)為準(zhǔn)),找到 user 、 group 兩個參數(shù)的定義,將其設(shè)置為nobody( 默許已經(jīng)是 nobody) ,再重啟 php-fpm 過程便可。
網(wǎng)站可寫目次的特別寄望
這里的可寫,是相對php-fpm 子過程而言。一個網(wǎng)站最等閑出安然標(biāo)題問題標(biāo)便是可寫目次,假定可寫目次權(quán)限能節(jié)制嚴(yán)格,安然系數(shù)也將大年夜大年夜進(jìn)步。
我們覺得,一個網(wǎng)站可寫目次首要分為以下幾種:
1. php 數(shù)據(jù)緩存目次,如 discuz 的 forumdata 目次,就存放了大年夜量數(shù)據(jù)緩存文件。此類目次一般會避免用戶直接拜候,可是 discuz 在這個目次下又存放了良多 js, css 文件,我們其實(shí)不克不及簡單地拒盡用戶拜候這個目次。明顯,這個目次下的所有文件,不克不及直接交給 php 解析,我們后面會給出解決方案。
2. 附件上傳目次。明顯此類目次需要開啟拜候,但不克不及交由php 引擎解析(即這個目次下的所有文件均視為通俗靜態(tài)文件)。
3. 靜態(tài)文件生成目次,這類目次下的文件全數(shù)應(yīng)視為靜態(tài)文件。
4. 日記目次, 一般城市拒盡用戶直接拜候之。
也就是說對網(wǎng)站開辟人員而言,需要對可寫目次實(shí)現(xiàn)動靜分手,不合機(jī)能的文件,應(yīng)當(dāng)辨別對待之,如許也就便利系統(tǒng)治理員,設(shè)置合理的nginx 法則,以進(jìn)步安然性。
簡單地往掉落php 文件的履行權(quán)限,其實(shí)不克不及禁止 php-fpm 過程解析之。
接下來,按照以上總結(jié),系統(tǒng)治理員若何建設(shè)nginx 的目次法則,才更安然呢?
1、數(shù)據(jù)緩存目次 /cache/
這個目次的特點(diǎn)是需要777 權(quán)限,不必供給給用戶拜候,那么可以按以下參考建設(shè) nginx
location ~ "^/cache" {
return 403;
}
location ~ "\.php$" {
fastcgi_pass 127.0.0.0:9000;
....................
}
這時候,任何用戶將沒法拜候/cache/ 目次內(nèi)容,即便
2、附件上傳目次 attachments
此目次的特點(diǎn)是需要開放拜候權(quán)限,但所有文件不克不及由php 引擎解析(包含后綴名改成 gif 的木馬文件)
location ~ "^/attachments" {
}
location ~ "\.php$" {
fastcgi_pass 127.0.0.0:9000;
....................
}
寄望,上面對attachments 目次的 location 定義中是沒有任何語句的。 nginx 對正則表達(dá)式的 location 匹配優(yōu)先級最高,任何一個用正則表達(dá)式定義的 location, 只要匹配一次,將不會再匹配其它正則表達(dá)式定義的 location 。
此刻,請?jiān)赼ttachments 目次下成立一個 php 腳本文件,再經(jīng)由過程瀏覽器拜候安,我們發(fā)現(xiàn)瀏覽器提示下載,這申明 nginx 把 attachments 目次下的文件當(dāng)作靜態(tài)文件措置,并沒有交給 php fastcgi 措置。如許即便可寫目次被植進(jìn)木馬,但因?yàn)槠錄]法被履行,網(wǎng)站也就更安然了。
明顯,首要的php 建設(shè)文件,請勿放在此類目次下。
3、靜態(tài)文件生成目次 public
這些目次一般都是php 生成的靜態(tài)頁的保留目次,明顯與附件目次有近似的地方,按附件目次的權(quán)限設(shè)置便可。
可以預(yù)感的是,假定我們設(shè)置了較嚴(yán)格的權(quán)限,即便網(wǎng)站php 法度存在縫隙,木馬腳本也只能被寫進(jìn)到權(quán)限為 777 的目次中往,假定共同上述嚴(yán)格的目次權(quán)限節(jié)制,木馬也沒法被觸發(fā)運(yùn)行,全部系統(tǒng)的安然性明顯會有較著的進(jìn)步。
可是網(wǎng)站可寫目次的感化及權(quán)限,只有開辟人員最為清晰。這方面需要php 開辟人員和系統(tǒng)治理員積極溝通。我們利用的編制是:項(xiàng)目上線前,開辟人員按照以文檔情勢供給網(wǎng)站可寫目次的感化及權(quán)限,由系統(tǒng)治理員針對不合目次進(jìn)行權(quán)限設(shè)置。任何一方點(diǎn)竄了網(wǎng)站目次權(quán)限,但未表現(xiàn)到文檔中,我們覺得是背反工作流程的。