悪意のあるダウンロードやサイトリソースの盗用を防ぐため、リファラーのブラックリストまたはホワイトリストを設定して訪問者を識別し、フィルタリングできます。また、署名付きインジェスト URL とストリーミング URL を使用して、オリジンサーバー上のリソースをより効果的に保護することもできます。このトピックでは、URL 署名機能の仕組み、設定方法、および使用上の注意について説明します。
署名付き URL の構成要素
署名付き URL は、PC、モバイルデバイス、およびサードパーティ製のインジェスト・再生ツールに適しています。これらは、インジェスト URL またはストリーミング URL + アクセストークンで構成されます。以下に例を示します。
rtmp://push.aliyundoc.com/app/stream?auth_key=1740562218-0-0-183e22e*********auth_key パラメーターは[アクセストークン]です。
アクセストークンの構造
timestamp-rand-uid-md5hashtimestamp:署名付き URL が期限切れになる時刻を示す UNIX タイムスタンプ (秒単位) です。
ApsaraVideo Live コンソールの URL ジェネレーターを使用して署名付き URL を生成する場合、
timestampは「現在の時刻 + 設定された有効期間」として計算されます。連結ルールを使用して署名付き URL を構築する場合、
timestampを直接指定できます。例えば、URL が生成されてから 1 時間後に期限切れにさせたい場合、timestampを「現在の UNIX タイムスタンプ + 3600」に設定します。rand:乱数です。通常は 0 です。
生成される各 URL が一意であることを保証するため、乱数には UUID 形式を使用します。UUID には、
477b3bbc253f467b8def6711128c7****のようにハイフン (-) を含めることはできません。uid:追加パラメーターです。現在は使用されておらず、通常は 0 です。
md5hash:MD5 アルゴリズムを使用して計算された検証文字列です。32 文字の数字 (0~9) と小文字の英字 (a~z) で構成されます。
暗号化されたコンテンツ
sstring = "URI-timestamp-rand-uid-PrivateKey" md5hash = md5sum(sstring)たとえば、インジェスト URL が
rtmp://push.aliyundoc.com/app/streamの場合、暗号化用の文字列は/app/stream-timestamp-rand-uid-PrivateKeyになります。
使用方法
署名付き URL を使用するには、ドメイン名に対して URL 署名機能を有効にする必要があります。初めてドメイン名を追加する場合、URL 署名はデフォルトで有効になっています。詳細については、「URL 署名の設定」をご参照ください。署名付き URL は、ApsaraVideo Live コンソールで生成するか、連結ルールを使用して生成できます。詳細については、「インジェスト URL とストリーミング URL の生成」をご参照ください。
仕組み
URL 署名が有効になると、サーバーは次の操作を実行してリクエストを検証します。
サーバーは、リクエスト内の
timestampが現在時刻より前かどうかをチェックします。timestampが現在時刻より前の場合、サーバーは署名付き URL が期限切れであると判断し、HTTP ステータスコード 403 を返します。timestampが現在時刻より後の場合、サーバーは次のsstring式を使用して文字列を構築し、署名を検証します。
サーバーは MD5 アルゴリズムを使用して文字列のハッシュ値を計算し、そのハッシュ値をリクエストに含まれるハッシュ値と比較します。
2 つの値が同じ場合、認証は成功します。サーバーはライブストリームを返します。
2 つの値が異なる場合、認証は失敗します。サーバーは HTTP ステータスコード 403 を返します。
HashValue は次の文字列から派生します。
sstring = "URI-timestamp-rand-uid-PrivateKey"
HashValue = md5sum(sstring)例
前提条件:
req_authを使用して、オブジェクトrtmp://demo.aliyundoc.com/video/standard****へのリクエストが行われます。暗号化キーを
aliyunliveexp1234に設定します。これは ApsaraVideo Live コンソールで設定されたプライマリキーまたはセカンダリキーです。署名付き URL が生成された時刻は、2021 年 5 月 28 日 16:49:57 (UTC+8) です。
コンソールで、署名付き URL の有効期間は 40 分に設定されています。
randフィールドとuidフィールドの両方を 0 に設定します。
結果:
計算された署名付き URL の UNIX タイムスタンプは 1622194197 であり、これは 2021 年 5 月 28 日 17:29:57 (UTC+8) です。
サーバーは、ハッシュ値の計算に使用される署名文字列を構築します。
/video/standard-1622194197-0-0-aliyunliveexp1234サーバーは署名文字列に基づいてハッシュ値を計算します。
HashValue = md5sum("/video/standard-1622194197-0-0-aliyunliveexp1234") = 5552ff52b5e4e20387c6dc18afce****リクエスト URL は
rtmp://demo.aliyundoc.com/video/standard****?auth_key=1622194197-0-0-5552ff52b5e4e20387c6dc18afce****です。説明auth_keyフィールドは、署名付き URL に含まれるアクセストークンを示します。計算された HashValue は、ユーザーのリクエスト内の
md5hash = 5552ff52b5e4e20387c6dc18afce****の値と一致します。認証は成功します。
注意事項
デフォルトでは、URL 署名は有効になっています。コンテンツの不正コピーを防ぐため、この機能を有効にしておくことを推奨します。URL 署名を無効にする場合は、リソースの不正使用のリスクを理解した上で、ApsaraVideo Live コンソールの URL 署名 ページにある「URL署名無効化に関する免責事項」に同意してください。
auth_keyフィールドは手動で設定する必要があります。ApsaraVideo Live は、auth_keyフィールドの値を計算するための API を提供していません。URL 署名を有効にした後、インジェスト URL とストリーミング URL に
auth_keyフィールドを追加する必要があります。そうしないと、ライブストリームを再生できません。インジェスト URL またはストリーミング URL のどちらか一方だけに署名することはできません。両方に署名する必要があります。署名付き URL は、有効期限のタイムスタンプまで有効です。期限切れになる前であれば、いつでも署名付き URL にアクセスできます。ApsaraVideo Live は、ワンタイムの署名付き URL をサポートしていません。
auth_keyフィールドの値は、queryStringフィールドを含まない URI の MD5 値です。詳細については、URL 署名パラメーターの設定に関する前のセクションをご参照ください。インジェスト URL とストリーミング URL の両方の URI はAppName/StreamNameです。インジェスト URL が機密情報でない場合は、有効期限のタイムスタンプをできるだけ短く設定することを推奨します。これにより、ストリーミング URL への悪意のあるアクセスを防ぐことができます。Real-Time Messaging Protocol (RTMP)、FLV、Real-Time Streaming (RTS) 形式のインジェスト URL およびストリーミング URL の場合、リクエストはストリームインジェストまたはストリーミングの開始時にのみ認証されます。処理中に署名付き URL の有効期限が切れても、進行中のストリームインジェストまたはストリーミングは中断されません。
M3U8 形式のストリーミング URL の場合、リクエストはストリーミングの開始時とストリーミング中に認証されます。処理中に署名付き URL の有効期限が切れると、進行中のストリーミングは中断されます。
署名付き URL の有効期間を動的に制御したい場合は、関連する SDK を使用して
AppNameおよびStreamNameパラメーターを動的に指定できます。詳細については、「URL 署名のサンプルコード」をご参照ください。セキュリティと再利用の要件に基づいて、
auth_key生成戦略を選択します。厳格なセキュリティ制御が不要で、有効期間中にストリーミング URL を再利用できる場合は、現在時刻に 7,200 秒を加えた値に設定されたtimestampのように、有効期間が長い事前生成されたauth_keyを使用します。個々のリクエストへのアクセスを制御したり、URL 漏洩のリスクを低減したりするには、現在時刻に 300 秒を加えた値に設定されたtimestampのように、リクエストごとに短い有効期間でauth_keyをリアルタイムで生成します。M3U8 ストリーミング URL はストリーミング中に継続的に認証されるため、auth_keyをリアルタイムで生成し、再生中に有効期限が切れないようにします。カメラなど、設定をリモートで更新できない固定 IP のインジェストデバイスの場合、署名の有効期間が切れるとストリームが切断される可能性があります。有効期間を設定する際にはセキュリティと可用性のバランスを取るか、URL 署名の代わりにインジェスト IP ホワイトリストを使用することを推奨します。
ApsaraVideo Real-Time Communication (ARTC) の場合、本番環境で ARTC を使用する際には、リソースの盗用や追加コストの発生を防ぐため、URL 署名を有効にすることを推奨します。テスト再生のためにのみ URL 署名を一時的に無効にすることで、URL がアクセス可能であることを確認できます。
インジェストドメインのプライマリキーとストリーミングドメインのプライマリキーを同じ値に設定できます。これは、インジェスト URL とストリーミング URL の URL 署名、または通常のストリームインジェストと再生には影響しません。ベストプラクティスとして、少なくとも 16 文字の長さのプライマリキーを使用してください。ApsaraVideo Live コンソールは 8 文字未満のプライマリキーを拒否し、セキュリティリスクメッセージを表示します。
よくある質問
アクティブなストリームがなく、サービスを停止した後でも、なぜ高額なトラフィック料金が発生するのですか?
原因
ドメイン名で URL 署名が無効になっている場合、インジェスト URL とストリーミング URL の悪意のあるホットリンクが発生する可能性があります。攻撃者はドメイン名、AppName、StreamName を組み合わせてストリームをプルすることができます。これにより、大量のトラフィックが消費されます。
ソリューション
インジェストドメインとストリーミングドメインの両方で URL 署名を有効にして、インジェスト URL とストリーミング URL の不正使用を防ぎます。
ApsaraVideo Live コンソールで、使用しなくなったドメイン名を無効化および削除します。アクティブなストリームを切断して、トラフィックの消費を停止します。
ピーク帯域幅モニタリングと Cloud Monitor のアラートを設定して、異常なトラフィックを検出します。
URL 署名が有効になっていない場合、push_auth_key およびpull_auth_key パラメーターはどのように設定しますか?
お使いのドメインで URL 署名が有効になっていない場合、インジェスト URL とストリーミング URL に認証パラメーターは必要ありません。 コードでは、push_auth_key および pull_auth_key パラメーターを空のままにするか、設定しないでください。 これらのパラメーターがなくても、サービスは正常に機能します。
PHP デモを使用してアクセストークンを生成する際に、$matches[4] が見つからないというエラーを解決するにはどうすればよいですか?
後のロジックでこの変数を使用して連結記号 (? または &) を判断するため、$args = $matches[4] のコード行を直接削除しないでください。正しい方法は、代入文はそのままにし、$matches[4] が存在しない場合に $args に空の文字列を代入することです。これにより、アクセストークンのフォーマットが正しくなり、構文エラーを回避できます。例:
$args = isset($matches[4]) ? $matches[4] : '';URL 署名の有効化または無効化はすぐに有効になりますか? ストリームインジェストを再起動する必要はありますか?
URL 署名の有効化または無効化はすぐに有効になります。待機期間は必要ありません。
URL 署名を有効にし、現在のインジェストセッションが中断されず、
AppNameとStreamNameが変更されない場合、ストリームインジェストを再起動する必要はありません。 新しく生成されたインジェスト URL とストリーミング URL にのみ、認証パラメーターを含める必要があります。URL 署名を有効にすることがビジネスに影響を与える場合は、ApsaraVideo Live コンソールの URL 署名 ページでいつでも無効にできます。URL 署名を無効にすると、ライブストリームへの正常なアクセスがすぐに再開されます。
URL 署名を有効にした後、403 エラーが返されても、なぜ少量のトラフィック料金が引き続き発生するのですか?
原因
不正なリクエストはブロックされ、HTTP 403 エラーが返されますが、CDN エッジノードは依然としてリクエストを処理し、対話する必要があります。これにより、リクエスト単位の課金、またはエッジノードでの通信に伴うトラフィック料金が少量発生します。
解決策と防止策
インジェストドメインとストリーミングドメインの両方で URL 署名を有効にすることを推奨します。これにより、ソースでの異常なリクエストによって発生する料金を最小限に抑えることができます。