本文詳細總結了 PHP 網站在 Linux 站群伺服器上面的安全配置,包含 PHP 安全、 mysql 資料庫安全、 web 站群伺服器安全、木馬查殺和防範等,很好很強大很安全。

PHP 安全配置
1. 確保執行 php 的使用者為一般使用者,如 www
2. php.ini 引數設定

1
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 #禁用的函式

2
expose_php = off            #避免暴露 PHP 資訊

3
display_errors = off        #關閉錯誤資訊提示

4
register_globals = off      #關閉全域性變數

5
enable_dl = off             #不允許呼叫 dl

6
allow_url_include = off     #避免遠端呼叫檔案

7
session.cookie_httponly = 1 #http only 開啟

8
upload_tmp_dir = /tmp       #明確定義 upload 目錄

9
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

1
vi /etc/my.cnf

2
user = mysql

4. 開啟 mysql 二進位制日誌,在誤刪除資料的情況下,可以透過二進位制日誌恢復到某個時間點

1
vi /etc/my.cnf

2
log_bin = mysql-bin

3
expire_logs_days = 7

5. 認證和授權
(1) 禁止 root 賬號從網際網路訪問資料庫,root 賬號只允許來自本地 WordPress 主機的登陸。

1
mysql>grant all privileges on *.* to root @localhost identified by ‘password’ with grant option;

2
mysql>flush priveleges;

(2) 刪除匿名賬號和空口令賬號

1
mysql>USE mysql;

2
mysql>delete from user where User=;

3
mysql>delete from user where Password=;

4
mysql>delete from db where User=;

web 站群伺服器安全
確保執行 Nginx 或者 Apache 的使用者為一般使用者,如 www,注意存放資料目錄許可權為 www
防止 sql 注入

1
if ( $query_string ~* “.*[;’<>].*” ){

2
        return 404;

3
}

關閉存放資料上傳等目錄的 PHP 解析

1
location ~* ^/(attachments|data)/.*.(php|php5)${

2
    deny all;

3
}

針對 Apache:關閉圖片目錄/上傳等目錄的 PHP 解析

1

2
    order allow,deny

3
    Deny from all

4

木馬查殺和防範
php 木馬快速查詢命令

1
grep -r –include=*.php ‘[^a-z]eval($_POST’ /home/wwwroot/

2

3
grep -r –include=*.php ‘file_put_contents(.*$_POST[.*]);’ /home/wwwroot/

利用 find mtime 查詢最近兩天或者發現木馬的這幾天,有哪些 PHP 檔案被修改

1
find -mtime -2 -type f -name *.php

防範:
1. 做好之前的安全措施,比如禁用相關 PHP 函式等
2. 改變目錄和檔案屬性

1
find -type f -name *.php -exec chomd 644 {} ;

2
find -type d -exec chmod 755 {} ;

3
chown -R www.www /home/wwwroot/www.waitalone.cn

3. 為防止跨站感染,需要做虛擬 WordPress 主機目錄隔離
(1) nginx 的簡單實現方法
利用 nginx 跑多個虛擬 WordPress 主機,習慣的 php.ini 的 open_basedir 配置:
open_basedir = ./:tmp:/home/wwwroot/
注:/home/wwwroot/是放置所有虛擬 WordPress 主機的 web 路徑
駭客可以利用任何一個站點的 webshell 進入到/home/wwwroot/目錄下的任何地方,這樣對各個虛擬 WordPress 主機的危害就很大
例如: /data/www/wwwroot 目錄下有 2 個虛擬 WordPress 主機
修改 php.ini
open_basedir = ./:/tmp:/home/wwwroot/www.waitalone.cn:/home/wwwroot/back.waitalone.cn
這樣使用者上傳 webshell 就無法跨目錄訪問了。
(2) Apache 的實現方法,控制跨目錄訪問
在虛擬機器 WordPress 主機配置檔案中加入
php_admin_value open_basedir “/tmp:/home/wwwroot/www.waitalone.cn”