ApsaraVideo Live では、Referer ブラックリスト/ホワイトリスト、User-Agent ブラックリスト/ホワイトリスト、IP ブラックリスト/ホワイトリストを設定することで、アクセスの制御を実装できます。このトピックでは、アクセスの制御機能、そのユースケース、および設定方法について説明します。
概要
アクセスの制御機能を使用すると、クラウド上でアクセスポリシーを設定して、ビデオ リソースの基本的な保護を提供できます。この機能は習得が容易で、すぐに有効になります。クラウド上での簡単な設定のみが必要で、追加の開発は不要です。一般的なアクセスの制御ポリシーには、次のものがあります。
Referer ブラックリストまたはホワイトリスト
User-Agent ブラックリストまたはホワイトリスト
IP ブラックリストまたはホワイトリスト
ApsaraVideo Live コンソールでは、設定が複雑でエラーが発生しやすいため、User-Agent ブラックリストまたはホワイトリストを設定することはできません。User-Agent ブラックリストまたはホワイトリストを設定するには、チケットを送信して Alibaba Cloud テクニカルサポートにお問い合わせください。詳細については、「お問い合わせ」をご参照ください。
シナリオ
アクセスの制御機能は設定が簡単で、特に Web ブラウザからのアクセスに対して基本的な保護を提供します。
Referer および User-Agent のブラックリストまたはホワイトリストは HTTP ヘッダーに基づいており、簡単に偽造できるため、セキュリティは低くなります。
IP ブラックリストまたはホワイトリストは、多くのユーザーにとって管理が難しく、大規模なコンテンツ配信には適していません。
Referer ブラックリストまたはホワイトリスト
概要
HTTP プロトコルの Referer ヘッダーは、リクエストのソースを追跡および識別するために使用されます。Referer ブラックリストまたはホワイトリストを設定して、これらのリクエストを識別およびフィルターできます。これにより、ビデオ リソースへのアクセスを制御できます。
リクエストが CDN の POP (Point of Presence) に送信されると、POP は設定されたブラックリストまたはホワイトリストに基づいてリクエストを認証します。リクエストが認証されると、ビデオデータが返されます。それ以外の場合は、HTTP 403 状態コードが返されます。
デフォルトでは、Referer ブラックリストまたはホワイトリストは有効になっていません。必要に応じて Referer ブラックリストまたはホワイトリストを設定できます。
Referer ブラックリストまたはホワイトリストを設定する場合、ワイルドカードドメイン名がサポートされます。たとえば、
example.comを指定すると、Referer ブラックリストまたはホワイトリストは、すべてのサブドメインを含むワイルドカードドメイン名*.example.comに対して有効になります。Referer フィールドが空のリクエストを許可するかどうかを指定できます。これらのリクエストを許可すると、ユーザーはブラウザのアドレスバーにリソース URL を入力することで、リソースに直接アクセスできます。
設定方法
コンソール: 詳細については、「ホットリンク保護」をご参照ください。
API: BatchSetLiveDomainConfigs 操作を呼び出して、一度に複数のドメイン名を設定できます。これには、Referer ブラックリストまたはホワイトリストの設定が含まれます。
SDK for Java を pom.xml ファイルにインポートします:
<dependency> <groupId>com.aliyun</groupId> <artifactId>alibabacloud-live20161101</artifactId> <version>2.0.3</version> </dependency>次のサンプルコードは、SDK for Java を使用してホットリンク保護を設定する方法を示しています:
// このファイルは自動生成されます。編集しないでください。ありがとうございます。 package demo; import com.aliyun.auth.credentials.Credential; import com.aliyun.auth.credentials.provider.StaticCredentialProvider; import com.aliyun.core.http.HttpClient; import com.aliyun.core.http.HttpMethod; import com.aliyun.core.http.ProxyOptions; import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder; import com.aliyun.sdk.service.live20161101.models.*; import com.aliyun.sdk.service.live20161101.*; import com.google.gson.Gson; import darabonba.core.RequestConfiguration; import darabonba.core.client.ClientOverrideConfiguration; import darabonba.core.utils.CommonUtil; import darabonba.core.TeaPair; //import javax.net.ssl.KeyManager; //import javax.net.ssl.X509TrustManager; import java.net.InetSocketAddress; import java.time.Duration; import java.util.*; import java.util.concurrent.CompletableFuture; import java.io.*; public class BatchSetLiveDomainConfigs { public static void main(String[] args) throws Exception { // HttpClient の設定 /*HttpClient httpClient = new ApacheAsyncHttpClientBuilder() .connectionTimeout(Duration.ofSeconds(10)) // 接続タイムアウト時間を設定します。デフォルトは 10 秒です .responseTimeout(Duration.ofSeconds(10)) // 応答タイムアウト時間を設定します。デフォルトは 20 秒です .maxConnections(128) // 接続プールサイズを設定します .maxIdleTimeOut(Duration.ofSeconds(50)) // 接続プールのタイムアウトを設定します。デフォルトは 30 秒です // プロキシを設定します .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<YOUR-PROXY-HOSTNAME>", 9001)) .setCredentials("<YOUR-PROXY-USERNAME>", "<YOUR-PROXY-PASSWORD>")) // https 接続の場合は、証明書を設定するか、証明書を無視する必要があります (.ignoreSSL(true)) .x509TrustManagers(new X509TrustManager[]{}) .keyManagers(new KeyManager[]{}) .ignoreSSL(false) .build();*/ // ak、secret、token などの認証情報を設定します StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() // 環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されていることを確認してください。 .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) //.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // STS トークンを使用 .build()); // クライアントを設定します AsyncClient client = AsyncClient.builder() .region("<Your RegionId>") // リージョン ID //.httpClient(httpClient) // 設定された HttpClient を使用します。それ以外の場合は、デフォルトの HttpClient (Apache HttpClient) を使用します .credentialsProvider(provider) //.serviceConfiguration(Configuration.create()) // サービスレベルの設定 // クライアントレベルの設定を書き換えます。エンドポイント、Http リクエストパラメーターなどを設定できます。 .overrideConfiguration( ClientOverrideConfiguration.create() // エンドポイントについては、https://api.aliyun.com/product/live をご参照ください .setEndpointOverride("live.aliyuncs.com") //.setConnectTimeout(Duration.ofSeconds(30)) ) .build(); // API リクエストのパラメーター設定 BatchSetLiveDomainConfigsRequest batchSetLiveDomainConfigsRequest = BatchSetLiveDomainConfigsRequest.builder() .domainNames("<Your DomainNames>") .functions("<Your Functions>") // リクエストレベルの設定を書き換えます。Http リクエストパラメーターなどを設定できます。 // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders())) .build(); // API リクエストの戻り値を非同期で取得します CompletableFuture<BatchSetLiveDomainConfigsResponse> response = client.batchSetLiveDomainConfigs(batchSetLiveDomainConfigsRequest); // API リクエストの戻り値を同期的に取得します BatchSetLiveDomainConfigsResponse resp = response.get(); System.out.println(new Gson().toJson(resp)); // 戻り値の非同期処理 /*response.thenAccept(resp -> { System.out.println(new Gson().toJson(resp)); }).exceptionally(throwable -> { // 例外の処理 System.out.println(throwable.getMessage()); return null; });*/ // 最後に、クライアントを閉じます client.close(); } }説明上記のサンプルコードでは、<DomainNames> に Referer ホットリンク保護ホワイトリストが設定されています。<referer_white_domain_list> パラメーターは、ホワイトリストに登録されたドメイン名を指定します。allow_empty パラメーターは <off> に設定され、空の Referer ヘッダーを持つリクエストを拒否します。
SDK for Java の使用方法の詳細については、「SDK for Java の使用」をご参照ください。
使用上の注意
重要ブラックリストとホワイトリストは相互排他的です。同時に使用することはできません。
デフォルトでは、モバイルクライアントは空の Referer ヘッダーを持つアクセスリクエストを許可します。これらのリクエストを拒否したい場合は、ApsaraVideo Player を使用してモバイルクライアントに信頼できる Referer ヘッダーを設定できます。
空の Referer ヘッダーを持つリクエストを拒否する場合は、HTTPS セキュアアクセラレーションと URL リダイレクトを設定して、HTTP から HTTPS への強制リダイレクトを行う必要があります。このリダイレクトにより、ブラウザが HTTP リソースに対する HTTPS リクエストから Referer ヘッダーを削除する際に発生する可能性のあるアクセス障害を防ぐことができます。
例
この例では、
example.comを含む Referer ホワイトリストがストリーミングドメインdemo.developer.aliyundoc.comに設定されています。空の Referer ヘッダーを持つリクエストは拒否されます。リクエストの例:
curl -i 'http://demo.developer.aliyundoc.com/apptest/stream0000'応答には次の情報が含まれます:
X-Tengine-Error:denied by Referer ACL信頼できる Referer ヘッダーを含むリクエストの例:
curl -i 'http://demo.developer.aliyundoc.com/apptest/stream0000' \ -H 'Referer: http://www.example.com'
User-Agent ブラックリストまたはホワイトリスト
概要
User-Agent ヘッダーは、サーバーがオペレーティングシステムやブラウザなど、クライアントに関する情報を識別できるようにする文字列です。User-Agent ブラックリストまたはホワイトリストを設定して、特定のブラウザやデバイスからのアクセスを制御できます。
設定方法
Alibaba Cloud テクニカルサポートにチケットを送信できます。詳細については、「お問い合わせ」をご参照ください。
例
以下は、PC 上の Internet Explorer 9 からのリクエストに対する User-Agent ヘッダーの例です:
User-Agent:Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;HTTP リクエストをシミュレートして認証できます:
curl -i 'http://demo.developer.aliyundoc.com/apptest/stream0000' \ -H 'User-Agent: iPhone OS;MI 5'
IP ブラックリストまたはホワイトリスト
概要
ApsaraVideo Live では、IP ブラックリストまたはホワイトリストを設定して、特定の IP アドレスからのアクセスを拒否したり、特定の IP アドレスからのみアクセスを許可したりできます。
IP ブラックリストを設定した場合、ブラックリスト内の IP アドレスは高速化ドメイン名にアクセスできません。
IP ホワイトリストを設定した場合、ホワイトリスト内の IP アドレスのみが高速化ドメイン名にアクセスできます。
IP アドレスのリストまたは CIDR ブロックを追加できます。
たとえば、IP ブラックリストまたはホワイトリストに 127.0.0.0/24 を追加できます。/24 はサブネットマスクで、32 ビットアドレスの最初の 24 ビットがネットワーク部分を表し、残りの 8 ビットがホスト部分を表すことを示します。この CIDR ブロックには、127.0.0.0 から 127.0.0.255 までの IP アドレスが含まれます。
IPv6 アドレスがサポートされています。
設定方法
コンソール: 詳細については、「IP ブラックリストまたはホワイトリスト」をご参照ください。
API: BatchSetLiveDomainConfigs 操作を呼び出して、一度に複数のドメイン名を設定できます。これには、IP ブラックリストまたはホワイトリストの設定が含まれます。
次のサンプルコードは、SDK for Java を使用して IP アドレスのブラックリストまたはホワイトリストを設定する方法を示しています:
// このファイルは自動生成されます。編集しないでください。ありがとうございます。 package demo; import com.aliyun.auth.credentials.Credential; import com.aliyun.auth.credentials.provider.StaticCredentialProvider; import com.aliyun.core.http.HttpClient; import com.aliyun.core.http.HttpMethod; import com.aliyun.core.http.ProxyOptions; import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder; import com.aliyun.sdk.service.live20161101.models.*; import com.aliyun.sdk.service.live20161101.*; import com.google.gson.Gson; import darabonba.core.RequestConfiguration; import darabonba.core.client.ClientOverrideConfiguration; import darabonba.core.utils.CommonUtil; import darabonba.core.TeaPair; //import javax.net.ssl.KeyManager; //import javax.net.ssl.X509TrustManager; import java.net.InetSocketAddress; import java.time.Duration; import java.util.*; import java.util.concurrent.CompletableFuture; import java.io.*; public class BatchSetLiveDomainConfigs { public static void main(String[] args) throws Exception { // HttpClient の設定 /*HttpClient httpClient = new ApacheAsyncHttpClientBuilder() .connectionTimeout(Duration.ofSeconds(10)) // 接続タイムアウト時間を設定します。デフォルトは 10 秒です .responseTimeout(Duration.ofSeconds(10)) // 応答タイムアウト時間を設定します。デフォルトは 20 秒です .maxConnections(128) // 接続プールサイズを設定します .maxIdleTimeOut(Duration.ofSeconds(50)) // 接続プールのタイムアウトを設定します。デフォルトは 30 秒です // プロキシを設定します .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<YOUR-PROXY-HOSTNAME>", 9001)) .setCredentials("<YOUR-PROXY-USERNAME>", "<YOUR-PROXY-PASSWORD>")) // https 接続の場合は、証明書を設定するか、証明書を無視する必要があります (.ignoreSSL(true)) .x509TrustManagers(new X509TrustManager[]{}) .keyManagers(new KeyManager[]{}) .ignoreSSL(false) .build();*/ // ak、secret、token などの認証情報を設定します StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() // 環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されていることを確認してください。 .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) //.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // STS トークンを使用 .build()); // クライアントを設定します AsyncClient client = AsyncClient.builder() .region("<Your RegionId>") // リージョン ID //.httpClient(httpClient) // 設定された HttpClient を使用します。それ以外の場合は、デフォルトの HttpClient (Apache HttpClient) を使用します .credentialsProvider(provider) //.serviceConfiguration(Configuration.create()) // サービスレベルの設定 // クライアントレベルの設定を書き換えます。エンドポイント、Http リクエストパラメーターなどを設定できます。 .overrideConfiguration( ClientOverrideConfiguration.create() // エンドポイントについては、https://api.aliyun.com/product/live をご参照ください .setEndpointOverride("live.aliyuncs.com") //.setConnectTimeout(Duration.ofSeconds(30)) ) .build(); // API リクエストのパラメーター設定 BatchSetLiveDomainConfigsRequest batchSetLiveDomainConfigsRequest = BatchSetLiveDomainConfigsRequest.builder() .domainNames("<Your DomainNames>") .functions("<Your Functions>") // リクエストレベルの設定を書き換えます。Http リクエストパラメーターなどを設定できます。 // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders())) .build(); // API リクエストの戻り値を非同期で取得します CompletableFuture<BatchSetLiveDomainConfigsResponse> response = client.batchSetLiveDomainConfigs(batchSetLiveDomainConfigsRequest); // API リクエストの戻り値を同期的に取得します BatchSetLiveDomainConfigsResponse resp = response.get(); System.out.println(new Gson().toJson(resp)); // 戻り値の非同期処理 /*response.thenAccept(resp -> { System.out.println(new Gson().toJson(resp)); }).exceptionally(throwable -> { // 例外の処理 System.out.println(throwable.getMessage()); return null; });*/ // 最後に、クライアントを閉じます client.close(); } }説明上記のサンプルコードでは、<DomainNames> に IP アドレスのホワイトリストが設定されています。ホワイトリストに登録された IP アドレスは、<127.0.0.0/24> CIDR ブロックで指定されます。
SDK for Java の使用方法の詳細については、「SDK for Java の使用」をご参照ください。
使用上の注意
重要ブラックリストとホワイトリストは相互排他的です。同時に使用することはできません。
最大 1,000 個の IPv6 アドレスまたは 3,000 個の IPv4 アドレスを追加できます。IPv6 アドレスでは大文字と小文字は区別されません。IPv6 アドレスに短縮表記を使用することはできません。