通常情況下,我們運行web應用的服務器有centos、ubuntu、debian等等的linux發行版本。這時候,構成服務架構所必須的nginx、php和mysql等應用的權限控制就顯得非常重要,各個服務對代碼目錄的權限要求各不相同,缺少某些權限會造成服務無法讀寫或運行的錯誤,降低了權限要求又會存在被入侵修改的隱患。
一、web服務器Nginx權限
PHP的運行框架通常都是結合Nginx組成LNMP或者結合apache組成LAMP的架構,這里用Nginx作為例子講述一下Nginx服務運行所需要的權限。
我們知道,Nginx本身不能解析PHP的語法,所以Nginx對于靜態文件(如html等)會直接解析返回結果,但是對于PHP的文件,Nginx會轉交給PHP的解釋器php-fpm進行處理,處理完后再返回響應給客戶端瀏覽器。
因此,我們代碼目錄下需要統一Nginx和php的服務所需權限。
①如果統一使用root用戶,則一般游客賬戶無法訪問應用,而nginx配置成以root運行的話會存在很大的安全隱患,一旦被攻擊就會被獲取root身份進行系統的一切操作。
立即學習“PHP免費學習筆記(深入)”;
如果將代碼目錄的權限統一設置為rwxrwxrwx,則會存在用戶能夠通過瀏覽器直接修改代碼目錄的隱患。
所以最好的辦法就是統一歸類到一個新的用戶組里面,通過給該用戶組分配Nginx和php運行必要的權限,來實現對web應用的權限目錄管理。在許多情況下,團隊會使用www用戶組來管理代碼目錄權限,統一管理用戶www。
我們可以看到Nginx的配置文件nginix.conf里面劃分的運行權限就是配置到了www用戶下,因此Nginx的子進程也是由www用戶執行,可以通過ps aux | grep nginx來查看:
可以看到nginx的主進程是root,其余子進程均是www的用戶
nginx.conf的配置:
二、php的權限配置
同樣的,php的運行方式也是由主進程root運行,在子進程池(pool)里面配置由www用戶執行,具體配置在php根目錄下的etcphp-fpm.conf下,添加兩行:
user?=?www ?group?=?www
即可,同樣用ps aux | grep php可以查看進程使用的用戶身份:
三、MySQL服務的權限配置
通過ps aux | grep mysql可以看到MySQL服務是運行在mysql用戶下的,該服務只需要我們在php代碼連接mysql時帶上mysql的用戶名密碼即可,不需要統一為www,因為數據層需要與業務邏輯層隔離開,保證底層數據的安全。mysql的授權主要是在mysql服務內新增用戶和劃分權限,用來控制php不同業務以不同權限范圍的身份去連接,確保數據安全。
四、總結
nginx配置:
user?www?www;
php-fpm:
user?=?www group?=?www
目錄:
drwxr-xr-x?就是755