ワンタイムURLで動画への不正アクセスを防ぐ方法
Webサーバーの Apache にワンタイムURLを設定して、動画へのアクセスを制限してみようと思います。
ワンタイムURLには、イベントベースのものと時間ベースのものがあるようです。イベントベースは、アクセス回数で制限を加え、時間ベースは、アドレスの生成から何秒間 そのURLが有効というもので、有効時間を過ぎると、そのURLでアクセスすることはできなくなります。
今回のものは、時間ベースのもので、mod_auth_token を利用します。通常、Apache にはインストールされていないため、ソースコードからコンパイルします。今回も、OSは、Debian Linux で話を進めます。
mod-auth-token のサイト
https://code.google.com/p/mod-auth-token/
下準備
Mod-Auth-Tokenは、automake、apxs を必要とするため動作するよう準備します、あとコンパイルに make を使うのでそれも入れておきます。
automakeのインストール
/usr/bin/ に automake-1.11 がインストールされます。
apxsが、入っているパッケージ apache2-prefork-dev をインストールします。今回、動作させている Apache のマルチプロセッシングモジュール(MPM)は、Prefork のため、apache2-dev では動きませんので注意してください。Prefork や Worker といったものは、apache2 -V で調べることができます。
Server version: Apache/2.2.22 (Debian)
Server built: Feb 1 2014 21:26:04
Server’s Module Magic Number: 20051115:30
Server loaded: APR 1.4.6, APR-Util 1.4.1
Compiled using: APR 1.4.6, APR-Util 1.4.1
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with….
-D APACHE_MPM_DIR=”server/mpm/prefork”
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT=”/etc/apache2″
-D SUEXEC_BIN=”/usr/lib/apache2/suexec”
-D DEFAULT_PIDLOG=”/var/run/apache2.pid”
-D DEFAULT_SCOREBOARD=”logs/apache_runtime_status”
-D DEFAULT_LOCKFILE=”/var/run/apache2/accept.lock”
-D DEFAULT_ERRORLOG=”logs/error_log”
-D AP_TYPES_CONFIG_FILE=”mime.types”
-D SERVER_CONFIG_FILE=”apache2.conf”
apache2-prefork-dev 、make のインストール
sudo apt-get install make
Mod-Auth-Token をインストールする
wget でファイルをダウンロードして解凍します。
wget “http://mod-auth-token.googlecode.com/files/mod_auth_token-1.0.5.tar.gz”
tar xvzf mod_auth_token-1.0.5.tar.gz
cd mod_auth_token-1.0.5/
mod_auth_token-1.0.5 フォルダの中身
AUTHORS
COPYING -> /usr/share/automake-1.10/COPYING
ChangeLog
INSTALL
LICENSE
Makefile.am
Makefile.in
NEWS
README
aclocal.m4
buildconf
config.guess -> /usr/share/automake-1.10/config.guess
config.sub -> /usr/share/automake-1.10/config.sub
configure
configure.in
install-sh -> /usr/share/automake-1.10/install-sh
ltmain.sh
missing -> /usr/share/automake-1.10/missing
リンクされている automake のバージョンが1.10と違うため、削除して張り直します。
sudo rm config.guess
sudo rm config.sub
sudo rm COPYING
sudo rm install-sh
sudo ln -s /usr/share/automake-1.11/missing missing
sudo ln -s /usr/share/automake-1.11/config.guess config.guess
sudo ln -s /usr/share/automake-1.11/config.sub config.sub
sudo ln -s /usr/share/automake-1.11/COPYING COPYING
sudo ln -s /usr/share/automake-1.11/install-sh install-sh
コンパイルしてインストールします。そしてApacheを再起動。
sudo make
sudo make install
sudo service apache2 restart
つぎに、/etc/apache2/sites-available/default ファイルの、<VirtualHost *:80> の中に、下記コードを追加します。これはURLに、video の文字が含まれ AuthTokenSecret は、要求元からの合言葉となり、AuthTokenTimeout は、試しに10秒として、URLの生成後10秒でURLが無効になります。
AuthTokenSecret “SecretString”
AuthTokenPrefix /video/
AuthTokenTimeout 10
</Location>
サーバー側の設定は、これで完了です。次にWebページ側は、今回はPHPを使い下記コードにして、bunny.mp4 にアクセスした場合の設定です。実際は、動的にファイルが指定される実装になるでしょう。IPアドレス部分 ***.***.***.*** は、適宜設定してください。
<html>
<head>
<meta charset=”utf-8″>
<title>ワンタイムURL</title>
</head>
<body>
<?php
// Settings to generate the URI
$secret = “SecretString”; // Same as AuthTokenSecret
$protectedPath = “/video/”; // Same as AuthTokenPrefix
$hexTime = dechex(time()); // Time in Hexadecimal
$fileName = “/bunny.mp4”; // The file to access
$token = md5($secret . $fileName. $hexTime);
// We build the url
$url = $protectedPath . $token. “/” . $hexTime . $fileName;
echo “<a href=’http://***.***.***.***$url’>http://***.***.***.***$url</a>”
?>
</body>
</html>
ファイル名はonetime.php としてFTP上 videoフォルダの上に配置します。videoフォルダの中には、bunny.mp4を入れておきます。
では、すべて準備が整ったのでブラウザでアクセスしてみましょう。そうすると、自動生成されたリアドレスが表示されます。
このアドレスは、リロードするたびにコロコロと変わり、サーバー側で設定した時間、10秒間有効です。
リンクをクリックするとbunny.mp4ファイルに接続され動画が再生されます。
10秒経過後、リロードを掛けるとこのように410エラーとなり接続できなくなります。
試しに、直接 bunny.mp4にアクセスしてみると、認証エラーとなり接続することはできません。
動画で確認してみましょう。
このようにして、動画にアクセス有効時間を設定することで第三者からのアクセスをしずらくすることができます。ウィークポイントを言えば、動画再生の権限を持ち再生したとき、そのユーザーに対して有効時間内はその動画へのアドレスはノーガードとなるため、URLを突き止められるとダウンロードされる可能性は捨て切れません。そのあたりは工夫や、妥協が必要になるかもしれません。
(参考)
動画配信 CDNでワンタイムURLを設定してみよう
http://bizvalley.co.jp/blog/4470.html