2016年2月28日 星期日

Nginx 用 map module 設定替換變數 - 資安攻防戰

此篇紀錄 Nginx 的 map module 的使用方式,參考官網 map module 是用來替換變數,本篇使用的範例為 user-agent、query_string

 

map 只能放在 http 的 scope 裡面
Syntax:	map string $variable { ... } 
Default: —
Context: http



 

 

  • 過濾 user-agent 過濾指定的項目


http { 

map $http_user_agent $bad_user_agent {
default 0;
~*crawler 1;
~*wget 1;
~*curl 1;

server {
...
if ( $bad_user_agent = 1 ){
return 403;
}
...
}
}

 

反之如果 default 1,可以針對需要的項目設定為 0 允許 get , head , post
http { 

map $http_user_agent $bad_user_agent {
default 1;
~*(get|head|post) 0;


server {
...
if ( $bad_user_agent = 1 ){
return 403;
}
...
}
}

 

遇到要 access /etc/passwd 這種攻擊模式的可以替換 query_string
http { 
map $query_string $bad_query {
default 0;

# 若是 access "..%2Fetc%2Fpasswd" 設為 1
~[a-zA-Z0-9_]=(\.\.%2F(%2F)?)+ 1;
# 若是 access "%2Fetc%2F" 設為 1
~[a-zA-Z0-9_]=%2F([a-z0-9_.]+%2F(%2F)?)+ 1;

server {
...
if ($bad_query = 1) {
return 404;
}
...
}

 

這是從 Web Server 的一種防禦模式,通常用來抵擋 bot,或者基本的攻擊模式。

 

參考資料:

Module ngx_http_map_module

用 map 的功能把 nginx 變成簡單的應用程式防火牆

Orignal From: Nginx 用 map module 設定替換變數 - 資安攻防戰

沒有留言:

張貼留言