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

2016-02-28 Nginx

此篇紀錄 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 變成簡單的應用程式防火牆

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱