本文詳細總結了PHP網站在Linux伺服器上面的安全配置,包含PHP安全、mysql資料庫安全、web伺服器安全、木馬清除和防範等,很好很強大很安全。(如果需要深入的安全部署建議找專業做安全的國内公司如:Sinesafe,綠盟,啟明星辰等等都是比較不錯的專業做網站安全的公司)

PHP安全配置
1. 確定運作php的使用者為一般使用者,如www
2. php.ini參數設定
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,phpinfo #禁用的函數
expose_php = off #避免暴露PHP資訊
display_errors = off #關閉錯誤資訊提示
register_globals = off #關閉全局變量
enable_dl = off #不允許調用dl
allow_url_include = off #避免遠端調用檔案
session.cookie_httponly = 1 #http only開啟
upload_tmp_dir = /tmp#明确定義upload目錄
open_basedir = ./:/tmp:/home/wwwroot/#限制使用者通路的目錄
open_basedir參數詳解
open_basedir可将使用者通路檔案的活動範圍限制在指定的區域,通常是其家目錄的路徑,也可用符号"."來代表目前目錄。注意用open_basedir指定的限制實際上是字首,而不是目錄名。
舉例來說: 若"open_basedir = /home/wwwroot", 那麼目錄"/home/wwwroot"和"/home/wwwroot1"都是可以通路的。是以如果要将通路限制在僅為指定的目錄,請用斜線結束路徑名。
注意:
從網上擷取的資料來看,open_basedir會對php操作io的性能産生很大的影響。研究資料表明,配置了php_basedir的腳本io執行速度會比沒有配置的慢10倍甚至更多,請大家自己衡量
open_basedir也可以同時設定多個目錄, 在Windows中用分号分隔目錄,在任何其它系統中用冒号分隔目錄。當其作用于Apache子產品時,父目錄中的open_basedir路徑自動被繼承。
MySQL安全設定
1. MySQL版本的選擇
在正式生産環境中,禁止使用4.1系列的MySQL資料庫。至少需要使用5.1.39或以上版本。
2. 網絡和端口的配置
在資料庫隻需供本機使用的情況下,使用–skip-networking參數禁止監聽網絡 。
3. 確定運作MySQL的使用者為一般使用者,如mysql,注意存放資料目錄權限為mysql
vi/etc/my.cnf
user = mysql
4. 開啟mysql二進制日志,在誤删除資料的情況下,可以通過二進制日志恢複到某個時間點
log_bin = mysql-bin
expire_logs_days = 7
5. 認證和授權
(1) 禁止root賬号從網絡通路資料庫,root賬号隻允許來自本地主機的登陸。
mysql>grantallprivilegeson*.* toroot @localhost identified by'password'withgrantoption;
mysql>flush priveleges;
(2) 删除匿名賬号和空密碼賬号
mysql>USE mysql;
mysql>deletefromuserwhereUser=;
mysql>deletefromuserwherePassword=;
mysql>deletefromdb whereUser=;
web伺服器安全
確定運作Nginx或者Apache的使用者為一般使用者,如www,注意存放資料目錄權限為www
防止sql注入
if( $query_string ~* ".*[\;'\<\>].*"){
return404;
}
關閉存放資料上傳等目錄的PHP解析
location ~* ^/(attachments|data)/.*\.(php|php5)${
deny all;
針對Apache:關閉圖檔目錄/上傳等目錄的PHP解析
order allow,deny
Deny from all
木馬清除和防範
php木馬快速查找指令
grep-r --include=*.php '[^a-z]eval($_POST'/home/wwwroot/
grep-r --include=*.php 'file_put_contents(.*$_POST\[.*\]);'/home/wwwroot/
利用find mtime查找最近兩天或者發現木馬的這幾天,有哪些PHP檔案被修改
find-mtime -2 -typef -name \*.php
防範:
1. 做好之前的安全措施,比如禁用相關PHP函數等
2. 改變目錄和檔案屬性
find-typef -name \*.php -execchomd 644 {} \;
find-typed -execchmod755 {} \;
chown-R www.www /home/wwwroot/www.waitalone.cn
3. 為防止跨站感染,需要做虛拟主機目錄隔離
(1) nginx的簡單實作方法
利用nginx跑多個虛拟主機,習慣的php.ini的open_basedir配置:
open_basedir = ./:tmp:/home/wwwroot/
注:/home/wwwroot/是放置所有虛拟主機的web路徑
黑客可以利用任何一個站點的webshell進入到/home/wwwroot/目錄下的任何地方,這樣對各個虛拟主機的危害就很大
例如: /data/www/wwwroot目錄下有2個虛拟主機
修改php.ini
open_basedir = ./:/tmp:/home/wwwroot/www.sinesafe.com:/home/wwwroot/back.sinesafe.com
這樣使用者上傳webshell就無法跨目錄通路了。
(2) Apache的實作方法,控制跨目錄通路
在虛拟機主機配置檔案中加入
php_admin_value open_basedir "/tmp:/home/wwwroot/www.sinesafe.com"