モジュール ngx_http_secure_link_module

ディレクティブ
     secure_link
     secure_link_md5
     secure_link_secret
組み込み変数

ngx_http_secure_link_module モジュール (0.7.18) は、リクエストされたリンクの正当性をチェックし、リソースを不正アクセスから保護し、リンクの有効期限を制限するために使用されます。

リクエストされたリンクの正当性は、リクエストで渡されたチェックサム値と、リクエストに対して計算された値を比較することによって検証されます。リンクに有効期限が設定されていて、その時間が経過している場合、リンクは期限切れと見なされます。これらのチェックの状態は、$secure_link 変数で確認できます。

このモジュールは、2つの代替動作モードを提供します。最初のモードは secure_link_secret ディレクティブによって有効になり、リクエストされたリンクの正当性をチェックし、リソースを不正アクセスから保護するために使用されます。2番目のモード (0.8.50) は secure_link および secure_link_md5 ディレクティブによって有効になり、リンクの有効期限を制限するためにも使用されます。

このモジュールはデフォルトではビルドされません。--with-http_secure_link_module 設定パラメータを使用して有効にする必要があります。

ディレクティブ

構文 secure_link ;
デフォルト
コンテキスト http, server, location

リンクのチェックサム値と有効期限が抽出される変数を含む文字列を定義します。

で使用される変数は、通常、リクエストに関連付けられています。以下の を参照してください。

文字列から抽出されたチェックサム値は、secure_link_md5 ディレクティブで定義された式のMD5ハッシュ値と比較されます。チェックサムが異なる場合、$secure_link 変数は空の文字列に設定されます。チェックサムが同じ場合、リンクの有効期限がチェックされます。リンクに有効期限が設定されていて、その時間が経過している場合、$secure_link 変数は "0" に設定されます。それ以外の場合、"1" に設定されます。リクエストで渡されるMD5ハッシュ値は、base64url でエンコードされます。

リンクに有効期限がある場合、有効期限はエポック (1970年1月1日午前0時0分0秒 GMT) からの経過秒数で設定されます。値は、MD5ハッシュの後の式に指定され、カンマで区切られます。secure_link_md5 ディレクティブで使用するために、リクエストで渡された有効期限は $secure_link_expires 変数を通じて利用できます。有効期限が指定されていない場合、リンクの有効期限は無制限です。

構文 secure_link_md5 ;
デフォルト
コンテキスト http, server, location

MD5ハッシュ値が計算され、リクエストで渡された値と比較される式を定義します。

式には、リンク (リソース) の保護された部分と秘密の要素が含まれている必要があります。リンクに有効期限がある場合、式には $secure_link_expires も含まれている必要があります。

不正アクセスを防ぐために、式にはクライアントのアドレスやブラウザのバージョンなど、クライアントに関する情報を含めることができます。

location /s/ {
    secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$secure_link_expires$uri$remote_addr secret";

    if ($secure_link = "") {
        return 403;
    }

    if ($secure_link = "0") {
        return 410;
    }

    ...
}

"/s/link?md5=_e4Nc3iduzkWRm01TBBNYw&expires=2147483647" リンクは、IPアドレスが127.0.0.1のクライアントに対して "/s/link" へのアクセスを制限します。また、このリンクは2038年1月19日 (GMT) まで有効期限があります。

UNIXでは、md5 リクエスト引数の値は次のように取得できます。

echo -n '2147483647/s/link127.0.0.1 secret' | \
    openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

構文 secure_link_secret ワード;
デフォルト
コンテキスト コンテキスト: location

リクエストされたリンクの正当性をチェックするために使用される秘密のワードを定義します。

リクエストされたリンクの完全なURIは次のようになります。

/prefix/hash/link

ここで、hash はリンクと秘密の単語の連結に対して計算されたMD5ハッシュの16進数表現であり、prefix はスラッシュを含まない任意の文字列です。

リクエストされたリンクが正当性チェックに合格した場合、$secure_link 変数はリクエストURIから抽出されたリンクに設定されます。それ以外の場合、$secure_link 変数は空の文字列に設定されます。

location /p/ {
    secure_link_secret secret;

    if ($secure_link = "") {
        return 403;
    }

    rewrite ^ /secure/$secure_link;
}

location /secure/ {
    internal;
}

"/p/5e814704a28d9bc1914ff19fa0c4a00a/link" のリクエストは、内部的に "/secure/link" にリダイレクトされます。

UNIXでは、この例のハッシュ値は次のように取得できます。

echo -n 'linksecret' | openssl md5 -hex

組み込み変数

リンクチェックの状態。具体的な値は、選択された動作モードによって異なります。
リクエストで渡されたリンクの有効期限。 secure_link_md5 ディレクティブでのみ使用することを目的としています。