Secure ダウンロード

説明

ngx_http_secure_download_module - ある時間が来るまでのみ有効なリンクを作成することができるモジュール。方法はlighttpdのmod_secdownloadに似ていますが、完全に同じではありません。

ディレクティブ

secure_download

構文:secure_download [ on | off ]
デフォルト:off
コンテキスト:場所

モジュールを on/off することができます。

secure_download_secret

構文:secure_download_secret <secret string>
デフォルト:none
コンテキスト:場所

md5ハッシュに含む文字列を定義します。変数を含むこともできます。

secure_download_path_mode

構文:secure_download_path_mode [ file | folder ]
デフォルト:folder
コンテキスト:場所

md5ハッシュがファイル名を含むフルパスで行われなければならないか、あるいはファイル名無しでファイルを含むフォルダで行われなければならないかを定義します。これは、リンクがディレクトリ全体に関して有効か、あるいは一つのファイルに関してのみ有効かに依存します。

注意

これが動作する方法は、単純にもし folderを指定した場合は、アクセスされたパスの最後の部分を落とし、残りをハッシュにします。このことは、もしindex.htmlあるいはrewritingのようなものを期待してファイル名を指定しないパスを使う場合、 フルパスに一致するさせるためにfileを使ったほうが良いことを意味します。

変数

$secure_download

この変数はリクエストURLの検証プロセスの結果を含みます。それは常に数字を含み、以下のいずれかの値を持つことができます。

  • “>0”: リンクが有効で、その値は期限切れになるまでの秒数
  • “-1”: タイムスタンプが期限切れ
  • “-2”: md5ハッシュが間違っている
  • “-3”: f.eなどの他の問題パースの問題あるいはモジュールの設定の問題

説明

仮定

生成されたURIは以下の書式を持つ必要があります:

<real_path>/<md5_hash>/<expiration_timestamp>

md5 ハッシュは以下の文字列から生成されている:

<real_path>/<secret (user supplied)>/<expiration_timestamp>
  • real_path はアクセスしたいファイルのパスか、そのファイルを含むフォルダのパスのどちらかで、これら2つのどちらかはNGINX configの中で定義されなければなりません。
  • secret はNGINX設定とリンク生成スクリプトのどちらかによって知られている必要があるランダムな文字列です。
  • expiration_timestamp は16進のunix_timestamp(1970から始まる秒)です。

By example

/somefolder/protected.htmlのパスの下のドキュメントルートの中にファイルがあるとします。ここで、20分で期限切れになるリンクを生成したい場合、以下のことをします:

  • 現在のtimestampを例えば http://www.unixtimestamp.com/index.phpから取得します。この例では、timestampは1240928342だったとします。
  • timestampを、例えばhttps://www.easycalculation.com/decimal-converter.phpがするように16進に変換します。timestampは 49F71056です。
  • ここでsecret文字列を決める必要があります。NGINX設定の中でパラメータ secure_download_secretを使って設定する必要があります。例えば、"privatestring"
  • Then you put the following string together /somefolder/protected.html/privatestring/49F71056 which consists of <real path/secret string/timestamp in hex
  • ここで一緒に配置した文字列のmd5ハッシュを生成する必要があります。md5の結果は f901b5272c17b456fabf49c3e9bcc120に違いありません。
  • ok。必要なものは揃いました。これで <real_path>/<md5>/<timestamp> の形式に配置するだけでよいです。例においては/somefolder/protected.html/f901b5272c17b456fabf49c3e9bcc120/49F71056のようになります。
  • 以上です。これで含まれたtimestampになるまでのみ有効なリンクを得ることができました。

ここで、設定は以下のようになります:

location /somefolder {
    secure_download on;
    secure_download_secret IAmSalt$remote_addr;
    secure_download_path_mode file;

    if ($secure_download = "-1") {
        rewrite /expired.html break;
    }
    if ($secure_download = "-2") {
        rewrite /bad_hash.html break;
    }
    if ($secure_download = "-3") {
        return 500;
    }

    rewrite ^(.*)/[0-9a-zA-Z]*/[0-9a-zA-Z]*$ $1 break; // crop all the /hash/time stuff off the url
}

OR:

location /secured {
    secure_download on;
    secure_download_path_mode file;
    secure_download_secret DontCopyMyPics$remote_addr;

    if ($secure_download !~ "^-.") {
        rewrite ^/secured(.*)/[0-9a-zA-Z]*/[0-9a-zA-Z]*$ $1 last;
    }
    if ($secure_download = "-1") {
        rewrite . /static/expired.html last;
    }
    if ($secure_download = "-2") {
        rewrite . /static/bad_hash.html last;
    }
    return 500;
}

location / {
    internal;
    root html;
}

location /static {
   root static;
}

必要条件

このモジュールを含むNGINXをコンパイルするには、以下に従う必要があります:

  • NGINX内のmod_rewriteは有効にされなければなりません
  • md5ハッシュを生成するためのsecure-downloadモジュールによって使われるmhashライブラリが必要です。
  • NGINX 0.7.61と0.8.33でのみモジュールをテストしました。他のバージョンについては保証しません。

Bugs/Feedback

何かバグを見つけた場合は、私にメールをしてください。手助けをするつもりでいます。

このモジュールを使っている場合、どのような種類のフィードバックあるいは問題の報告も歓迎します。

エラーログのログレベルをdebugにした場合は何らかの意味がある出力を出すようにしました。

Mail: mauro.stettler(A.T)gmail.com

ダウンロード

from GitHub

TOP
inserted by FC2 system