要幫 nginx 增加安全性的話,大概首推 modsecurity 這個模組了,不過目前他只有支援 nginx 1.2 穩定版,尚未支援 1.3 開發版,基本上具有下列功能
- 超過 16000 規則防範下列攻擊
- SQL injection
- Cross-site Scripting (XSS)
- Local File Include
- Remote File Include
- 可客製化規則,保護下列的應用
- WordPress
- cPanel
- osCommerce
- Joomla
- 包含了 OWASP Core Rule Set
- IP 聲望偵測
- Malware Detection
不過有一些在更簡單的功能,像是有時候會自己想擋一些 bot,或者要判斷合法的 referrer 才給過之類的就不在這個之內了,這時候我們可以利用 map 來幫我們做簡單的過濾。
首先 map
只能夠放在 http
的 scope 內,所以我們可以在 http
內擺下列規則
1 | map $request_method $bad_method { |
map
的用法很簡單,第一個參數給的是要做比較的對象通常就是 http core 可以使用的那些變數可以參考 這裡,然後第二個參數就是覆寫過後的變數名稱,再來大刮號內首先給這個變數一個預設值也就是 default xxx;
,後面就開始接比較的方法跟如果 match 到要給第二個變數什麼值,通常有三種表示法以 ~
~*
跟不是這兩個開頭的,以 ~
跟 ~*
開頭的表示要用正規表示式來比對,沒有的就表示是常規的方式比對(直接比對),所以剛剛的範例來說可以用下面的來解釋
1 | # 比對 $request_method 然後比對後的值放 $bad_method |
然後我們要在 server
的 context 擺下面的設定才會生效(建議擺在最上面就可以了
1 | if ($bad_method = 1) { |
這樣就會把我們不想要的 request 都過濾掉了。