LoginSignup
0
0

More than 3 years have passed since last update.

CDNETWORKS CDN360設定忘備録:NGINXのsecure_link, secure_link_md5ディレクティブとeval_func

Last updated at Posted at 2020-10-05

はじめに

コンテンツへのTimer付のアクセス制限を行いたいので設定を行ったので忘備録。Authクエリ作成はPHPで作成実施。

2通りの方法があります:

-NGINXのsecure_linkディレクティブを利用する
-CDN360独自?のeval_funcディレクティブを利用する

この機能を使うと指定ディレクトリへの直接アクセスはアク禁になり、認証クエリの付与がないとアクセスできなくなります。また認証クエリは有効期限設定ができるのでタイマー的な制限が可能です。

NGINXのsecure_linkディレクティブを利用する場合

http://nginx.org/en/docs/http/ngx_http_secure_link_module.html 
に沿った設定になります。
ポイントとして認証クエリはBase64+MD5になります。

クエリ要素としては、キーフレーズ+URL+有効期限の三要素を一旦md5化して認証クエリとして付与します。
合わせて有効期限は個別に再度付与します。

実際のURIクエリ構造としては

ドメイン+URI+認証クエリ名md5+有効期限クエリ名expiresになります。
http://www.foo.com/promo/cdnetworks_intro.mp4?md5=fJO_5y3x2BIfcl2po8gJmg&expires=1601867656

クエリ無し、クエリ間違えの場合は403レスポンス
クエリ有効期限切れは410レスポンスの設定
サンプルではキーフレーズをcdnetworksにします。

CDN360サンプルコード

nginx
location /promo/ {
     origin_pass www_fooorigin_com;
     secure_link $arg_md5,$arg_expires;
     secure_link_md5 "cdnetworks$uri$secure_link_expires";
     if ($secure_link = "") {
         return 403;
     }
     if ($secure_link = "0") {
         return 410;
     }

上記設定に対するAUTHクエリ作成サンプルPHP。

有効期限は20秒にしています。

php
<?php
header ('Content-type: text/html; charset=utf-8') ; 
$uri = "/promo/cdnetworks_intro.mp4" ; 
$password = "cdnetworks" ; 
if( iconv( "UTF-8" , "UTF-8" , $uri ) != $uri ) { 
$uri = iconv( "EUC-JP" , "UTF-8" , $uri ); 
} 
$url = "http://cdn360.foo.com".$uri ; 
$arrPath = split( "/" , $uri ); 
for( $i = 0 ; $i < sizeof( $arrPath ) ; $i++ ){ 
if( $i != 0 ) 
$enc_uri = $enc_uri."/"; 
$enc_uri = $enc_uri.urlencode($arrPath[ $i ]); 
} 
$current_time = time(); 
$expiration = time() + 20 ; 
$md5 = base64_encode(md5($password.$enc_uri.$expiration, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = $url."?"."md5=".$md5."&expires=".$expiration ; 
echo $url ; 
?> 

CDN360独自?のeval_funcディレクティブを利用する

旧来CDNetworks CDNでも当該機能がありましたがMD5のみでの組込みでした。secure_linkだとアプリ側の組み込み更改が発生してしまうので同様にmd5化だけでも機能実現が出来るeval_funcというディレクティブがあります。
https://docs.cdnetworks.com/cdn/docs/edge-logic/supported-directives#eval_func

サンプルCDN360コード

CDN360_NGINX
  location /promo/ {
    origin_pass www_fooorigin_com;

    eval_func $result MD5 "cdnetworks$uri$arg_expires";
    eval_func $result HEX_ENCODE $result;
    if ($result != $arg_md5) {
      return 403;
    }
    eval_func $result COMPARE_INT $arg_expires $sec;

    if ($result != "1") {
      return 410;
    }
  }

この場合のAUTHクエリ作成PHPは

PHP
<?php
header ('Content-type: text/html; charset=utf-8') ; 
$uri = "/promo/cdnetworks_intro.mp4" ; 
$password = "cdnetworks" ; 
if( iconv( "UTF-8" , "UTF-8" , $uri ) != $uri ) { 
$uri = iconv( "EUC-JP" , "UTF-8" , $uri ); 
} 
$url = "http://cdn360.foo.com".$uri ; 
$arrPath = split( "/" , $uri ); 
for( $i = 0 ; $i < sizeof( $arrPath ) ; $i++ ){ 
if( $i != 0 ) 
$enc_uri = $enc_uri."/"; 
$enc_uri = $enc_uri.urlencode($arrPath[ $i ]); 
} 
$current_time = time(); 
$expiration = time() + 20 ; 
$input = $password.$enc_uri.$expiration ; 
$hmac = md5($input) ; 
$url = $url."?"."md5=".$hmac."&expires=".$expiration ; 
echo $url ; 
?> 
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0