演講主題:PHP+MYSQL類社區的服務器通用安全防護措施
9 _" Q5 G& e: p1 g 各位站長大家下午好,先自我介紹一下,我是來自無錫太湖明珠網的毛偉,我們今天下午的話題是PHP+MYSQL類社區的服務器通用安全防護措施,雖然這個話題,有一個前提,就是面對對象是那些使用自己獨立服務器的站長,如果現在沒有使用獨立服務器的站長也希望可以先瞭解瞭解,相關知識,相信你們很快就會有獨立服務器的到時候就派的上用處了,安全 和 危險是相對的,這世界上沒有絕對的安全 和絕對的危險。如果有不太明白的同學可以參考下愛因斯坦的 狹義相對論。. T% y+ W" X$ W
首先聲明下,下面說所的這些防護措施,不是說照著做了就能保證服務器不被黑,因為我們所使用的大部分都是開源的社區程序,開源就等於不可避免的存在漏洞。那麼這些防護措施的出發點,就是在程序產生漏洞的時候,盡可能的避免遭受攻擊所影響的範圍。比如服務器淪陷,整個服務器給黑客控制。我們今天所講的防護措施分成 服務器環境安全,php安全設置,mysql安全設置幾個方面。首先講一下服務器環境方面的安全措施,一般現在跑PHP+MYSQL類社區的服務器無非就是小流量的windows比較多,大流量的linux比較多。
! a$ E) k. b9 z. n. K B1 c' L 不管是windows還是linux或者說其他的系統,任安全防護第一步,關掉不用的端口,第二步限制重要端口的訪問來源ip地址,比如我們跑web的,可以全開80端口,限制ftp、遠程管理端口的來源ip地址,其它端口全部關閉
# s9 i4 d& ~& v- L 像ssh的22,遠程終端的3389,mysql的3306這類重要端口我們可以通過軟件防火牆或者硬件防火牆,限制來源的ip地址,有些tx可能會說我是adsl動態的,我沒有辦法固定ip地址,好這裡給你2個方案。1.放開限制的範圍,每個地區的adsl撥號上網ip地址總有一定的範圍,比如a.b.x.x,那麼我們就把ip限制到a.b.*.*。2.中轉方法,有些站長可能不止1台服務器,可以通過另外一台中轉的有固定ip地址的機器,來中轉管理你的服務器。使用端口轉發這種方法,限制了端口的訪問,那麼如果還要將安全級別提高一點的話,那就是修改端口號來增加安全性,這裡也提個醒,實際上除非你有防止端口掃瞄的這種防火牆 ,不然改端口作用並不大,hack掃瞄下端口很方便,說到防止端口掃瞄,這個原來實際上就是跟蹤用戶在一定時間內訪問服務器端口數量來實現的,比如在5秒內訪問超過3個端口,就判斷為端口掃瞄行為,然後就把用戶的ip封掉。這裡推薦個windows下面的軟件防火牆- R; {& L' c5 d' c
這類防火牆 windows主機我推薦VisNeticFirewall (也叫8sign),VisNeticFirewall 是款強大的windows下軟件防火牆可以限制進出規則包括http應許訪問的文件類型,比如限制mdb下載等等也可以做端口掃瞄自動阻斷。8 n( Z/ x, u( D+ A' J5 P6 G9 r
linux用自帶的iptables,功能很強大,只有想不到,沒有做不到,網絡這一層安全做得好,你的系統就加固了很多。就算hack有你服務器的管理員,他也無從入手。除了80 webshell ,他什麼也做不了。下面講講webserver的安全配置
( V+ s) k# J/ g! I" `8 S4 h windows主機用iis的站長還可以給每一個iis站點單獨設定一個運行帳號而且嚴格設置站點目錄只有管理員和這個站點運行賬戶有權限這樣即使某個站點有漏洞,hack webshell進來了,危機到其他站點 和 系統因為他除了能控制這個站點的目錄下面的內容外,他根本無法訪問其他目錄。當然這個方法還有個前提,就是得把系統的目錄權限梳理一邊,檢查下有everyone權限的目錄,一般c盤 windows目錄下面這類的目錄蠻多,要記住everyone的目錄 就算做了上面的獨立iis賬戶的方法 hack還是能訪問的,關於這類網上文章也蠻多,搜一下仔細看看。linux的可就沒這麼方便咯,因為apache nginx是以統一的用戶身份來運行的沒法每個站點獨立設置一個運行用戶。比較要命的是linux下面系統的目錄一般其它用戶都是可讀的。所以比較安全的做法是把apache或者nginx php的用戶 和web目錄的所有者用戶獨立開來。所以比較安全的做法是把apache或者nginx php的用戶 和web目錄的所有者用戶獨立開來。
! C6 m& j, H) _4 a/ K 這裡把nginx和目錄所有權用戶都用www是方便一些靜態文件的訪問,省得權限卡得很死,非得完全嚴格的去設置目錄權限。當然要求嚴格的站長完全可以把nginx和web目錄的用戶也分開。apache和php結合有個非常方面的好處,就是可以給每個vhost設定一些php的設置。所以我們用apache的tx可以用這一特性 給每個vhost 設定下open_basedir 這個php設置open_basedir就是這個vhost的php運行的時候能夠訪問的目錄,這樣也就能在apache下面實現iis那樣獨立帳號運行的類似效果9 N' w" J2 |+ D
把php的訪問範圍框住,防止1個有漏洞危及系統和其他站點. Y8 X# h. o# k% U- P/ H1 {% Q% |
這裡舉個例子,就貼部分了
8 b" t B9 F1 N9 k- b9 @6 C
4 }' S8 f$ @1 W9 P DocumentRoot /website/www/bbs.site.com |" C* F) D, a: j1 a
ServerName bbs.site.com
* S( P+ y5 K' h4 O0 W3 o- s; n php_admin_value open_basedir /website/www/bbs.site.com/:/website/tmp/4 o. [+ c6 k, W& |# [. V8 q; C
php_admin_value open_basedir /website/www/bbs.site.com/:/website/tmp/$ K. }) D" T( H
這個意思就是bbs.site.com下面運行的php
& x" B$ l! t$ D" u u 只能訪問 /website/www/bbs.site.com/ 和 /website/tmp/下面的文件,想訪問其他目錄的文件,沒門
2 P" `+ A! |/ |) k3 q! \* D; K 這個設置 如果有多個目錄,比如php上傳臨時目錄,session臨時目錄,可以用 : 冒號分割(windows下面用 ; 號)6 Y6 Z9 M9 e A# C8 H
這個方法在windows 和 linux的apache上都能用
% x8 f% h7 q0 t% Q1 D4 f2 m 但是必須要以LoadModule 方式跑php的才行
+ F6 O# @/ I) Y* _ 這個方法像nginx那樣 用fastcgi php方式的就沒法# V; f! T4 o. k7 x5 L, E, O
如果實在想用可以用nginx proxy的方式,php用apache來跑這樣就能在 nginx下面也用上這個open_basedir功能了。
8 D8 y! \2 S, x# Y5 M5 J- s 如果實在要用nginx+fastcgi php的方式的話 可以在php.ini裡面設置個總的open_basedir
" L0 x8 l% Q6 n- c; ^ 比如你的站點都是放在/website/www/ 下面的那就把 open_basedir 設定到 /website/www/. ~/ |& e$ n8 O( L( V
這樣雖然一個站點淪陷了 也會跟著淪陷其他站點,但是至少能保證系統文件不會淪陷- _+ N0 j6 S, M/ e
比較適合喜歡偷懶的
+ |+ E8 h8 i+ v8 ^& p) \7 I/ R. C 剛剛說到的apache裡面vhost 還有個有用的設置php_flag engine off
3 I2 s3 m' V* b2 l8 {& \% B 先來看個例子
1 M% q( E5 B- s5 a 6 j4 @; ^& q- V) S/ Q' p6 k0 q
php_flag engine off3 T6 ~6 {* X5 r
& ?0 u9 N0 k$ R, U) z3 r 這個意思就是. O6 P! Z2 Q/ F: |
/website/www/bbs.thmz.com/attachments 這個目錄下面的文件,不進行php執行,哪怕是個php也會把源代碼爆出來就是不執行php3 e I& x3 D; c' _2 F0 L1 S
一些永遠也不會有php執行需要的目錄,特別是用戶上傳的文件啊,頭像啊這些目錄 可以用這個設置下
8 @; C# Q) E F0 m 設的時候注意別搞錯了,這個開了 ,要是有php可是直接暴源代碼的,iis用戶不要急,其實iis裡面也是有這個功能的。在iis站點管理裡面找到不需要執行的目錄右鍵 屬性。
1 |6 p) t0 r& z u4 R3 D7 t: | 把這個執行權限設成無就行了. L' i! G( K: i% C! P& _" A
反正記得關之前先看看目錄下面的文件
" X- \7 {$ G1 k l1 f 別關錯了暴了源代碼0 m& @ }2 z _; p, ^
這個功能同樣用fastcgi方式跑的php 沒戲,這個環境目前也就想起來這麼多,就先到這裡把9 b$ [% u1 [9 k8 Y0 Q# a
這裡順便提一下,如果有多台服務器的站長,提倡把前台和數據庫分開。就是運行程序1台服務器,數據庫1台服務器。這樣其實也有點和安全有關係。一些程序可能 注入漏洞這漏洞爆的比較多; V; ~' ^) V* E0 O
假如你把數據庫分離開來了,那麼hack在注入的時候實際上是在數據庫那台服務器上面' {; A$ K' I6 q! X% G3 V+ A
萬一你mysql連接的用戶是個root權限的話 那他用mysql的load file這種函數 也只能去讀取數據庫那台服務器上面的系統文件
) [) K% G" c. N5 m# s2 b" M 這樣樂觀的將至少你web程序這台服務器保障了,下面就簡單說說php和mysql把9 ]9 D6 I. V/ C% t3 s7 X: y8 s
php的安全設置剛剛那個open_basedir 也講過了( @; l2 ^: S, s3 C+ J
其它無非就是一些php.ini裡面的設置了,首先肯定是 display_errors=Off
0 q7 V: o+ {3 ~: Y% M 關閉出錯日誌
P7 @! B3 A1 ^3 @1 R' f 然後log_errors = On
]$ @. a8 _+ Q0 F 再設置下error_log= N6 ^7 U. {. R, j) N" C
把出錯信息記錄到服務器文本上
- T8 f: I" M9 f 這裡注意不要放在web目錄下 或者說open_basedir的目錄下
% H/ q7 s V8 q$ w h 不然hack用webshell一讀 你這設置就=白做了
3 [' J, H4 }$ r, a9 R magic_quotes_gpc = On
v6 ~3 x$ c/ C% W: I8 l( `1 G register_globals = Off, c$ k% F) ^$ W0 _( v' `
這2個參數可以限制下非法參數或者變量的提交,防止某些程序寫的不是很嚴謹的時候,帶來安全隱患
5 m0 l" r: Y' a% l) f3 @ disable_functions = phpinfo,get_cfg_var,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,show_source,popen,escapeshellcmd,escapeshellarg
( x; P/ V3 N. C F" i; U' A# l disable_functions 就是php禁止使用的函數。: a) ?7 s7 I* f
php是很強大的,所以有很多危險的php函數,這些函數給hack利用能直接危及到系統的安全。所以我們需要在web程序不需要這些函數的前提下,把這部分危險的函數禁止。7 \) W" ?! C: c) I5 u, ?3 P+ @9 H
上面的disable_functions是我安裝dz的程序列出的一個參考,如果和你服務器上的某些程序使用的函數衝突,那自己衡量下可以去掉,把程序需要的函數 在disable_functions 裡面去掉就行,php結束 就這麼簡單,這裡實際上最關鍵的就是open_basedir和disable_functions,這2個一做,那安全性的提升是相當顯著的。
# S9 b2 P! X& E7 d 下面說mysql,說mysql前 補充下* R. S Q5 C5 U
不要用系統管理員用戶,或者 root 來運行 mysql
. H( h% b* X4 D( [: _& C: ~+ V0 w windows的服務默認執行用戶權限可都是很高的哦,SYSTEM
0 n8 }/ I C5 o( }% F7 h% E linux就是root用戶
& n, _+ E3 ?! N5 U0 o a 用管理員身份運行php mysql,一但 mysql 權限設置不當淪陷了,那他的webshell可就是你系統的root身份: `4 T. |. a( ~* t
所以mysql 第一件事,把運行用戶檢查下
# W2 q3 A, W& Y/ j 一定要以普通用戶身份運行,然後清理下mysql的用戶,在默認安裝的mysql裡面有一些用於本地登錄的不需要密碼的root用戶,這類用戶應該全部刪掉,如果你需要遠程用工具管理mysql的留個root@% ,本機用phpmyadmin的就留個root@localhost當然其他你自己建的用戶別刪。mysql的用戶 權限可以定的很細root@localhost 就是root用戶 只能在本機登陸這個root用戶請注意,不要給任何web應用程序用,自己管理用用就行,看緊了。然後對於每個web應用程序 注意了是每個+ \) D r3 w, r( H; U& K* h$ A4 e' P
單獨建立一個對應的mysql帳號
- a! u! n+ e4 L* V; x7 K% q& J 還有每個web程序的 datebase也單獨建個+ ], A+ e+ H" [
比如uc database 用 xx_uc, mysql用戶用xx_uc: _ V. M2 s9 K8 l: @$ T" [5 U: m
dz database 用 xx_bbs, mysql用戶用xx_bbs
3 O& J, q5 s8 ~$ A uch database 用 xx_uch, mysql用戶用xx_uch' S4 \3 r3 M+ |0 G5 |3 J Z, x
然後這幾個mysql的xx_uc bbs uch用戶 記得了不要給全局權限global privileges
3 Y3 ^0 ?) x/ k1 J* [; P; ` 一個都不要給# @; F, v9 u; r
給了就和root差不多了
. R* O9 |. D( R+ E 應該有個地方設置用戶權限的,manage privileges8 e! }" A- D2 u. C/ K! _$ h
xx_uc bbs uch 每個用戶選擇對於的數據庫' A5 N8 C2 z$ I, c8 a/ L
xx_uc 就選擇 xx_uc bbs就選 bbs uch就選uch$ H4 f" r: |4 d+ k5 ^* u+ K2 C
記住了只給 select insert update delete create drop index alter 權限
; O, R5 j& o, ]! ? l 其實一般的程序就只需要 select insert update delete,論壇的程序可能在某些後台操作下需要用到create drop index alter,喜歡嚴格的站長可以 需要的時候再開 create drop index alter這樣就算有注入漏洞,那他也就只能取取 改改當前數據庫的內容。這裡也有個提議不要用dz默認的cdb_ uc_ uch_前綴 ,使用這些默認都是公開的前綴,hack進來一猜就知道你用戶表是什麼名字,然後update下密碼,就拿到你的管理員了,mysql的基本也就這樣了,關鍵每個程序獨立用戶 權限最小化的設置,想如果自己做過一些調用程序,那完全可以只給個有select權限的mysql用戶就行了。最後程序方面 小改改。比如使用dz的站長把admincp.php文件改改名字。
" g5 N: _+ ]1 n& n* ^ 只需要跟著改幾個模板就行 不影響後台使用。但是確安全很多。想如果改了這個文件,那上次dz被黑,後颱風格那個漏洞 根本就沒法使用,直接免疫,人家拿了管理員也沒法進後台,多安全。最後總結一句話,安全做得好,就算程序 有漏洞,hack也沒辦法利用,就算hack利用了漏洞,那他也上傳不了webshell,就算hack上傳了webshell,那他也拿不到系統權限,就算hack拿到了系統權限,那他也上不來服務器。
. z; `7 n( |, [# s* e4 ]7 M 好了今天就到這裡了,謝謝大家。& V0 s1 U: b) v7 ~6 r% E
互動環節( v/ J5 P8 d8 c6 i5 z+ t
問:用軟件搭建的環境有什麼需要注意的嗎?% a, A' E3 b! {. D9 m: W% Q# q& G
答:這裡不知道這個軟件搭建是不是指的那種一體化試的裝完直接由apache+mysql+php這種軟件,其實這種軟件的安全配置和單獨安裝的並沒有什麼區別,都是一樣的方法。5 C9 j7 [8 T4 B: C5 r
問:網站,分很多個系統,有PHP開發又有asp開發,又共享些信息(如成整合一次登錄之類)會不會在安全性上出現很大問題呢?該怎麼防?謝謝。
- F9 _; F( ]: j0 E6 _ 答:這種混合系統一般是使用iis來跑的,不知道你問的是否是指的這個asp和php混合運行在iis下面的問題。php剛剛已經講過了,asp的話主要是結合asp的一些特色來注意防範,比如講座裡面說的針對iis站點的獨立用戶設置這個實際上是asp php通用的,而且asp的站點更加需要做獨立用戶權限設置,因為他沒有php的open_basedir這種設置。/ J- J; j* H! g \/ M3 C
問;VisNeticFirewall 我剛才搜了一下發現都是註冊版,能否給一個安全可靠的免費軟件網址,現在我們用的是antiarp,感覺功能不夠強大。
% \' T# _3 e) T5 G; ?- l ^# R3 N 答:這個軟件確實是需要購買的,這裡不方便公開,但是大家可以去一些0day的站點搜索下。$ ^0 I- D1 l+ G
問:"另外一台中轉的有固定ip地址的機器,來中轉管理你的服務器。使用端口轉發這種方法!" 這樣的話,會不會一台淪陷,另外一台也淪陷呀!
( L, c; E8 e0 {& C: _* O& [ 答:恩這裡有個口誤,端口轉發的方法,要建立在第一步小範圍開放ip地址的基礎上來做。8 ?& @3 i% v$ v9 `
特別提示:2009.11.7首屆江蘇站長年會500人規模目前火熱報名、參與互助推廣中 http://2009.jiangsu.com 誠邀諸位站長同仁參與。
6 G% g, _7 g) t. i+ C | 最後總結:本期嘉賓龍飛是國內知名的社區安全專家,特別是在地方社區聯盟中享有盛譽,經常熱心為大家解答技術難題,深受大家的歡迎。本次有幸請到龍大俠來給諸位站長講解社區安全性的相關問題,由於參與站長技術參差不齊還是有不少站長不是很明白的,所以需要多多學習消化。網站的盈利始終是大家最關心的話題,所以下期講座我們特別邀請了在業內知名的網賺專家丘仕達來和諸位站長說說個人網站如何創造最大效益,絕對經典不容錯過有興趣的站長可以參與互動,但是如果是發AD的就免了,感謝諸位的支持下期見。講座主群、直播群已滿,新到站長可加500人講座五號群:39463377,我們將永久免費提供公益服務,但是長期不發言的會員一律被T。
/ L/ S7 k4 J' _' a, ~ 特別鳴謝:本講座得到中國站長站、admin5站長網、落伍者、草根網、中國站長、中國建站、站長中國、web開發網、愛聚集、我拉網、《站長》雜誌、站長Z週刊、挖軟件、門戶通等多家知名站長相關媒體的鼎力支持及國內知名IDC服務商炎黃網絡的技術支持。本次講座將會在上述站長媒體同期發佈,在此表示特別感謝。 |
評分
-
查看全部評分
|