設置安全的nginx+PHP網站目錄權限
基于linux系統的web服務器架構聽說過很多年了,也用了好幾年,不過都是用現成的運行環境,比如虛擬主機、共用VPS。親手配置、把玩,我還是***回,初學過程的曲折在意料之中,反復折磨了兩三天,終于搞清楚一些linux基礎概念和nginx+php配置。今天主要記錄nginx+php環境下,原先理解的很混亂的網站目錄權限設置。
由于對linux文件權限的概念不清楚,遷移網站到VPS上時,擔心設置錯了影響網站安全,剛好之前一個網站被掛了馬,配置服務器時就特別在意這事了。
配置權限的原則是,在保證網站正常運行下,盡量給***權限。
我的配置:
1、nginx進程用戶是默認用戶wwwboy;(暫時還不知道nginx進程用戶會對服務器什么地方的權限有影響,配置nginx好像都沒碰到權限設置問題)
2、php-fpm進程用戶配置為wwwboy;
3、網站目錄所有者設置為ftpuser,由于需要在FTP中對網站文件進行下載(讀取)、上傳(寫入),ftpuser肯定對網站目錄有讀寫權限。
關鍵點:php-fpm 子進程所使用的用戶,不能是網站文件所有者。這里推薦一篇關于權限設置的文章《正確設置網站文件所有者 提高網站安全性 防止被掛木馬》,我就是讀完這篇文章才理解nginx、php-fpm、網站文件權限之間的關系以及如何設置才安全。
上面推薦的文章里也寫了,網站文件所有者和php-fpm進程用戶設為不同的好處是在PHP程序中無法對網站文件進行修改,這樣即使網站被掛馬了,也能降低很多損失,例如,對方無法在你的正常代碼里混入后門。
以前總習慣性地把緩存目錄權限設置為777,這回既然注意到安全問題,就想順便弄清楚一下緩存目錄怎么設置才正確合理并安全。其實,了解清楚linux文件權限分配方式,這個疑惑也就明朗了:
假設網站緩存目錄名為cache,其所有者為ftpuser。緩存文件是由php-fpm進程執行寫入,相當于用戶wwwboy要在用戶ftpuser的目錄cache里寫文件,不被允許的!因此,要分配給wwwboy對cache目錄的寫權限,chmod o+w -R cache即可,如果ftpuser與wwwboy同一個用戶組,就chmod g+w -R cache。緩存目錄不需要執行權限,所以以往設置777權限的做法相當粗糙,不過在使用虛擬主機的時候,自己無法把握服務器上各種設置,777也是最便捷做法了。
[2013-3-25更新]:緩存目錄需要o+wx,添加x的原因是讀取目錄的時候需要執行權限,否則文件是寫不成功的。除非要生成的文件和寫文件的腳本在同一個目錄內,不需要讀取目錄的權限,也就不需要執行權限。原理:(此處感謝 @lanisle)
On a directory, the execute permission (also called the "search bit") allows
you to access files in the directory and enter it, with the cd command, for
example. However, note that although the execute bit lets you enter the
directory, you're not allowed to list its contents, unless you also have the
read permissions to that directory.
以上便是對nginx+php網站目錄權限安全設置的表述和理解,看起來像菜鳥基礎班的筆記。此外,以往我對開源的偉大魅力不以為然,學習使用linux幾天,開始有所體會。