使用SecureLink模組

nginx_web發表於2012-06-15

 

 

 

 

    這個模組用於為所需的安全性“令牌”計算和檢查請求URL。在0.7.18版本以上的Nginx中提供了該模組,這個模組在Nginx的預設安裝中沒有包含在內,因此,如果想使用該模組那麼需要在configure時指定--with-http_secure_link_module選項。對於0.8.50之後的版,有新增了secure_link_md5指令和secure_link_expires變數,因此,指令secure_link_secret已經不贊成使用了。

 

 

 

配置示例

 

示例1

 

location /prefix/ {

  secure_link_secret secret_word;

 

# If the hash is incorrect then $secure_link has the value of the null string.

  if ($secure_link = "") {

     return 403;

  }

 

  # This needs to be here otherwise you'll get a 404.

   rewrite ^ /prefix/$secure_link break;

}

   

示例2

 

location /p/ {

    ## This must match the URI part related to the MD5 hash and expiration time.

    secure_link $arg_st,$arg_e; # this must match the URI part related

 

    ## This is how the MD5 hash is built from a secret token, an URI and an

    ## expiration time.

    secure_link_md5 segredo$uri$arg_e; # 'segredo' is the secret token

 

    ## If the hash is incorrect then $secure_link is a null string.

    if ($secure_link = "") {

        return 403;

    }

 

    ## The current local time is greater than the specified expiration time.

    if ($secure_link = "0") {

        return 403;

    }

 

    ## If everything is ok $secure_link is 1.

    ## This needs to be here otherwise you'll get a 404.

    rewrite ^/p/(.*)$ /p/$1 break;

}

   

    在這個配置中,我們最終會通過以下URL訪問:

 

http://example.com/p/files/top_secret.pdf?st=PIrEk4JX5gJPTGmvqJG41g&e=1324527723

   

    在這個URL中有兩處看的比較不順眼:

 

    一處是st=PIrEk4JX5gJPTGmvqJG41g,另一處是e=1324527723,這兩個引數會被傳遞到伺服器端,然後會通過相應的引數獲取這些值,至於這些值的使用後面會講到,我們現在主要說這些值是怎麼來的,下面的值都是通過在命令列中計算出的,但是在具體的應用中都是通過具體的語言自動計算得出。

 

    要構建上面的雜湊值,可以使用PHP語言(當然其它語言也是可以的),例如我在命令列中使用PHP生成雜湊值:

 

[root@mail gz]# php -r 'print  str_replace("=", "",strtr(base64_encode(md5("segredo/p/files/top_secret.pdf1324527723", TRUE)), "+/", "-_")) . "\n";'

PIrEk4JX5gJPTGmvqJG41g

   

    如上所示,用黑體字打出的這一行便是MD5雜湊值。當然如果你執行著web 應用,那麼這個值必須是自動生成的,而不能像這樣手動命令列操作,需要注意的是MD5雜湊格式為二進位制格式,因此要進行base64編碼。

 

    對於生存期,我們可以是PHPtime()函式來實現,當然也可使用其它語言來實現,為了獲取Unix epoch時間格式。在這裡我們可以通過linux命令計算出:

 

[root@mail gz]# date +%s -d "December 22, 2011  12:22:03"

1324527723

   

    也許你會問這個 "December 22, 2011  12:22:03" 時間是怎麼推出來的,同樣是使用date

   

[root@mail gz]# date -d @1324527723

Thu Dec 22 12:22:03 CST 2011

 

   

 

    該模組提供了以下3條指令。

 

指令名稱:secure_link_secret

    : secure_link_secret secret_word

默 認 值: none

使用環境: location

    能:該指令用於指定一個密碼,該密碼被用於MD5雜湊生成校驗請求。一個完整的被保護的連線格式如下:

/prefix/MD5 hash/reference

 

這裡的MD5雜湊值就是由該指令指定的secret_word密碼生成,然後利用它來保護安全連線URI

 

          例如,我們想保護位於目錄p下的檔案top_secret_file.pdf,那麼我們需要在Nginx的配置檔案中新增以下配置:

 

location /p/ {

    secure_link_secret segredo;

 

    # If the hash is incorrect then $secure_link has the value of the null string.

    if ($secure_link = "") {

        return 403;

    }

 

    # This needs to be here otherwise you'll get a 404.

    rewrite ^ /p/$secure_link break;

}

   

    我們可以通過使用openssl目錄行工具來計算MD5雜湊值,具體的做法是這樣的:

 

[root@mail gz]# echo -n 'top_secret_file.pdfsegredo' | openssl dgst -md5

0849e9c72988f118896724a0502b92a8

    

    我們看到,被MD5計算的字元不僅僅是指令secure_link_secret指定的segredo密碼,還有被訪問檔案的檔名稱。

 

    在計算出這個值後,我們現在才可以使用以下的URL進行訪問(這已經是一個被保護的URL)

http://example.com/p/0849e9c72988f118896724a0502b92a8/top_secret_file.pdf

 

而採用通常的方法:

 

http://example.com/p/top_secret_file.pdf

 

是無法訪問到檔案。

 

需要注意的問題有一點,那就是不要出現以下的使用方法:

 

location / {

   # This is wrong, wrong, wrong. It's a root path!

   secure_link_secret segredo;

   [...]

}

 

這配置之所以錯,就是因為它對根路徑實施了保護,這是不可以的,因此,僅能對非根的的路徑進行安全連線保護。

 

指令名稱:secure_link

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27043155/viewspace-732983/,如需轉載,請註明出處,否則將追究法律責任。

相關文章