URL Signing とは
URLパラメータとしてシグネチャを付与しておき、Service Engine において、この値が正しいかどうか検証を行い、正しいシグネチャである場合のみ、アクセスが許可されるようにする仕組みです。
URL Signing が使用可能なプロトコル
以下のプロトコルでサポートされています。
- WebEngine (HTTP)
- WMT (RTSP)
- FMS (RTMP)
- Movie-Streamer (RTSP)
設定方法
WebEngine での設定例について説明します。
Key の登録
シグネチャの作成と検証には、共通鍵を使用する方法と、公開鍵/秘密鍵を使用する方法の2パターンがあります。ここでは設定が用意な共通鍵を使用します。鍵は各デバイスの設定画面で登録します(以下の画面)。
この例では、以下のパラメータ値を使用します。
Key Id Owner | 1 |
Key Id Number | 2 |
Key | testkey |
CLI で設定する場合は以下のコマンドを使用します。
se0(config)#url-signature key-id-owner 1 key-id-number 2 key testkey
確認方法は以下の通りです。
se0#show url-signature
key-id-owner key-id-number key public-key private-key symmetric-key
-------------------------------------------------------------------
1 2 ****
シグネチャを含む URL の生成
シグネチャの生成には、configuration guide にて公開されている Python Script を使用します。
実行には Python が必要です。
- Example of a Python URL Signing Script
http://www.cisco.com/en/US/docs/video/cds/cda/is/2_6/configuration_guide/URLsigning.html#wp1100056
configuration guide に記載されているスクリプトをテキストエディタにコピーし、ファイル名「cds-ims-urlsign.py」で保存しておきます。
このスクリプトをパラメータ無しで実行すると、必要なパラメータが確認できます。
$ python cds-ims-urlsign.py
Usage:
python cds-ims-urlsign.py
Example:
python cds-ims-urlsign.py rtsp://abc.com/content/Apocalypto.mov 171.71.50.123 120 1 2 BubbaGump 1 ""or1or2
各パラメータの説明は以下の通りです。
url | シグネチャ計算対象の URL |
client-ip | アクセスを許可するクライアントのIPアドレス。アクセスを許可するクライアントを限定しない場合は、適当な IPアドレスを入れておく |
expiry-delay-seconds | 現在の時刻から Expire するまでの秒数 |
key id owner | 鍵の設定で入力した値 |
key id number | 鍵の設定で入力した値 |
key | |
exclude-domain | |
1 又は 0 を指定。1 の場合、シグネチャ計算にドメイン情報を入れない(この場合、シグネチャ検証の設定でもドメイン情報を除外する必要がある) |
|
version | ハッシュ計算方法の指定。0又は指定無しの場合、MD5 を適用する。1 の場合 SHA-1 を適用する。2 の場合、プロトコル情報を除去してから SHA-1 を適用する |
以下に生成例を示します。一番下の「US=xxxx」が含まれる行が、シグネチャ付きのURLになります。
$ python cds-ims-urlsign.py "http://web.cdn.japan-tac.local/sign/test.html" 192.168.20.201 3600 1 2 testkey 0 1
http://web.cdn.japan-tac.local/sign/test.html?SIGV=1&IS=0&ET=1323667407&CIP=192.168.20.201&KO=1&KN=2&US=
SHA1 is used
http://web.cdn.japan-tac.local/sign/test.html?SIGV=1&IS=0&ET=1323667407&CIP=192.168.20.201&KO=1&KN=2&US=7f81a05c5247a640315f9c8f135bfdffd985aca2
Servuce Rule の設定
URL SIgning は Service Rule 機能の中の1つです。そのため、URL Signing を使用するには、Service Rule を有効にする必要があります。Service Rule の設定は XML 形式の設定ファイルを作成し、CDSM からアップロードします。
<CDSRules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema\CDSRules.xsd">
<Revision>1.0</Revision>
<CustomerName>cisco</CustomerName>
<Rule_Patterns>
<PatternListGrp id = "grp1">
<UrlRegex>sign</UrlRegex>
<Domain>web.cdn.japan-tac.local</Domain>
</PatternListGrp>
</Rule_Patterns>
<Rule_Actions>
<Rule_Validate matchGroup = "grp1" error-redirect-url = "http://www.cdn.japan-tac.local/error.html" exclude-validation = "client-ip" protocol = "http" />
</Rule_Actions>
</CDSRules>
上記 XML ファイルでは、以下のような動作を定義しています。
- URL Signing が適用される条件
- URL のドメインが web.cdn.japan-tac.local
- URL の中に "sign" という文字列が含まれる
- クライアント IP はシグネチャ検証時の計算に含めない
実行例
python script の出力例で示したシグネチャ付きURLに対して、シグネチャ生成後120秒以内に、クライアント 192.168.20.201 からアクセスした場合、アクセスに成功します。
# curl -v "http://web.cdn.japan-tac.local/sign/test.html?SIGV=1&IS=0&ET=1327498431&CIP=192.168.20.201&KO=1&KN=2&US=d9bc8069539783b4e7cf226c3a31c057dfdcef63"
* About to connect() to web.cdn.japan-tac.local port 80
* Trying 192.168.20.7... connected
* Connected to web.cdn.japan-tac.local (192.168.20.7) port 80
> GET /sign/test.html?SIGV=1&IS=0&ET=1327498431&CIP=192.168.20.201&KO=1&KN=2&US=d9bc806953
9783b4e7cf226c3a31c057dfdcef63 HTTP/1.1
> User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3
libidn/0.6.5
> Host: web.cdn.japan-tac.local
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: Keep-Alive
< Keep-Alive: timeout=15
< Accept-Ranges: bytes
< ETag: "826776-1d-cc34cf80"
< Last-Modified: Mon, 12 Dec 2011 04:45:02 GMT
< Content-Type: text/html; charset=UTF-8
< Content-Length: 29
< Date: Wed, 25 Jan 2012 12:46:10 GMT
< Server: Cisco-CDS
Mon Dec 12 13:45:02 JST 2011
* Connection #0 to host web.cdn.japan-tac.local left intact
* Closing connection #0
シグネチャを適当に書き換えてアクセスした場合、設定したエラーページにリダイレクトされます。
# curl -v "http://web.cdn.japan-tac.local/sign/test.html?SIGV=1&IS=0&ET=1327498431&CIP=192.168.20.201&KO=1&KN=2&US=12345"
* About to connect() to web.cdn.japan-tac.local port 80
* Trying 192.168.20.7... connected
* Connected to web.cdn.japan-tac.local (192.168.20.7) port 80
> GET /sign/test.html?SIGV=1&IS=0&ET=1327498431&CIP=192.168.20.201&KO=1&KN=2&US=d9bc806953
9783b4e7cf226c3a31c057dfdcef6 HTTP/1.1
> User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3
libidn/0.6.5
> Host: web.cdn.japan-tac.local
> Accept: */*
>
< HTTP/1.1 302 Found
< Connection: Keep-Alive
< Keep-Alive: timeout=15
< Accept-Ranges: bytes
< Location: http://www.cdn.japan-tac.local/error.html
< Content-Length: 0
< Date: Wed, 25 Jan 2012 12:44:48 GMT
< Server: Cisco-CDS
* Connection #0 to host web.cdn.japan-tac.local left intact
* Closing connection #0