CentOS + Apache + PHP 是我常用來建置web系統的環境
php也是最常見的、用來寫web應用程式的程式,所以它的安全性也是需要注意一下
我參考了 http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html 的文章,也整理了一下
一般php的環境設定是靠 ↓
/etc/php.ini : php 主要設定檔
/etc/php.d : php 用來放額外的模組的地方,都是 XX.ini
我們查看 php 版本可以下 php -v
而查現在php 支援那些模組可下 php -m
以上也可以透過 web 瀏覽 phpinfo.php (內容是 <?php phpinfo()?> ,就可以看到更詳細資訊
當然如果不用的模組也最好關閉,一方面增加效能、一方面也為了安全性 (1。移除 XX.ini 、2。重編php,只enable需要的)
將 expose_php 設成 off 關閉 HTTP 表頭會顯示 X-Powered-By: PHP/4.3.9d (curl -I http://ssorc.tw)
當然 apache 也最好關閉版本顯示
關閉錯誤訊息的顯示,display_errors=off
如果要允許檔案上傳 (file_uploads=on),最好限制大小(upload_max_filesize=1M)
allow_url_fopen=off 也最好關閉,因為如果程式沒過濾好,很容易被用來作惡意的連結
至於safe_mode我暫時不管它了,一方面php5.3以後的版本不再支援了
magic_quotes_gpc=Off ,可以參考 http://ssorc.tw/?p=1026
控制POST的大小,post_max_size=1k,可以防止被POST大檔造成主機資源被吃光而掛掉
資源的控還有
max_execution_time = 30
max_input_time = 30
memory_limit = 40M
用外掛(Suhosin)來保護php底層 : 它用來保護 php 應用程式已知或未知的缺陷
取消function,它的建議是
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
大部份是讓php無法作系統指令
我用了以下測試很多站台,基本上沒有什麼大問題
disable_functions = "exec,passthru,proc_open,shell_exec,system,popen,dl"
使用fastcgi : 比 mod_php 有效率,且使用者權限可以是 User,改善一定要用 apache user 的缺點
用open_basedir限制php固定存取某個目錄
open_basedir = "/var/www/html/DOMAIN.com:/tmp/DOMAIN.com"
session.save_path
session.save_path = "/tmp/DOMAIN.COM"
要常更新 php , OS
作好檔案、目錄的權限控管,比方說只讓apache這個user可以讀
使用mod_security搭配
使用 chroot
固定時間查看 log記錄,觀查是否有異狀
分散service,web一台 server、db一台 server
工具 — https://phpids.org/ (未研究) — 網站型式的入侵偵測系統
工具 — http://phpsec.org/projects/phpsecinfo/index.html (未研究) — 提供安全性的建議
查有沒有c99等這類的惡意程式是否在網站裡面
# grep -iR ‘c99’ /var/www/html/
# grep -iR ‘r57’ /var/www/html/
# find /var/www/html/ -name *.php -type f -print0 | xargs -0 grep c99
# grep -RPn “(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)” /var/www/html/
留言