Ограничить доступ к контенту
Вы можете ограничить доступ к контенту, который раздается через CDN — например, настроить доступ по ключу, показывать контент только пользователям из некоторых стран или в определенных браузерах.
Доступ по ключу
Доступ по ключу (Tokenized URL) позволяет сделать ссылки на конент временными и ограничить доступ к контенту по IP-адресу.
К ссылкам на сайте добавляется специальный токен, в котором зашифрованы ключ доступа, время жизни ссылки и разрешенные IP-адреса. Когда пользователь переходит по ссылке, CDN-серверы проверяют токен в запросе: если ключ совпадает, IP-адрес разрешен и время жизни ссылки не истекло, то серверы отдают контент. При этом сами CDN-серверы получают контент с источника независимо от наличия токена.
Ссылки с токеном будут иметь вид:
- CDN Selectel:
https://cdn.example.com/123.jpg?md5=DMF1ucDxtHCxwYQ&expires=2147483647
- CDN Akamai:
https://cdn.example.com/123.jpg?sel-token=exp=1592563853~hmac=0851b56b74c47120565024a6c6532dc77dff809b0eeeb6fc1e01c86090a1bccd
Настроить доступ по ключу
CDN Selectel
CDN Akamai
-
В панели управления перейдите в раздел CDN → CDN-ресурсы.
-
Откройте страницу CDN-ресурса → вкладка Настройки.
-
Включите опцию Доступ по ключу.
-
Чтобы сгенерировать ключ автоматически, нажмите Сгенерировать ключ.
-
Чтобы использовать свой ключ, введите его вручную, учитывая требования:
- латинские буквы и цифры;
- длина от 6 до 32 символов;
-
Опционально: чтобы разрешить доступ к контенту только определенным IP-адресам, отметьте чекбокс Добавить IP-адрес клиента к токену.
-
Нажмите Сохранить.
-
Настройте генерацию токена на сервере-источнике. Для генерации токена используются четыре параметра:
- время жизни ссылки;
- исходная ссылка на файл;
- IP-адреса, для которых разрешен доступ к файлу — опциональный параметр;
- ключ, который вы задали на шаге 4 или 5.
PHP-скрипт
Python-скрипт
OpenSSL-скрипт
С параметром IP
Используйте, если на шаге 6 в настройках CDN-ресурса отметили чекбокс Добавить IP-адрес клиента к токену.
<?php
$secret = '<secret_key>';
$ip = '<ip_address>';
$path = '<path>';
$expires = time() + <lifetime>;
$link = "$expires$path$ip $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "<domain>{$path}?md5={$md5}&expires={$expires}";
echo $<url>;
echo "\n";
Укажите:
<secret_key>
— секретный ключ, который указали в настройках CDN-ресурса;<ip_address>
— IP-адрес, которому разрешено получить контент;<path>
— относительный путь к файлу на источнике;<lifetime>
— время жизни ссылки в секундах;<domain>
— домен CDN-ресурса с указанием протокола. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий.
Без параметра IP
Используйте, если на шаге 6 в настройках CDN-ресурса не отмечали чекбокс Добавить IP-адрес клиента к токену.
<?php
$secret = '<secret_key>';
$path = '<path>';
$expires = time() + <lifetime>;
$link = "$expires$path $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "<domain>{$path}?md5={$md5}&expires={$expires}";
echo $url;
echo "\n";
Укажите:
<secret_key>
— секретный ключ, который указали в настройках CDN-ресурса;<path>
— относительный путь к файлу на источнике;<lifetime>
— время жизни ссылки в секундах;<domain>
— домен CDN-ресурса с указанием протокола. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий.
С параметром IP
Используйте, если на шаге 6 в настройках CDN-ресурса отметили чекбокс Добавить IP-адрес клиента к токену.
import base64
from hashlib import md5
from time import time
secret = "<secret_key>"
ip = "<ip_address>"
path = "<path>"
lifetime = <lifetime>
domain = "<domain>"
expires = int(time()) + lifetime
token_byte = base64.encodebytes(
md5(f"\{expires}{path}\{ip} \{secret}".encode("utf-8")).digest()
)
token = (
token_byte
.decode("utf-8")
.replace("\n", "")
.replace("+", "-")
.replace("/", "_")
.replace("=", "")
)
secured_url = f"\{domain}{path}?md5=\{token}&expires=\{expires}"
print(secured_url)
Укажите:
<secret_key>
— секретный ключ, который указали в настройках CDN-ресурса;<ip_address>
— IP-адрес, которому разрешено получить контент;<path>
— относительный путь к файлу на источнике;<lifetime>
— время жизни ссылки в секундах;<domain>
— домен CDN-ресурса с указанием протокола. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий.
Без параметра IP
Используйте, если на шаге 6 в настройках CDN-ресурса не отмечали чекбокс Добавить IP-адрес клиента к токену.
import base64
from hashlib import md5
from time import time
secret = "<secret_key>"
path = "<path>"
lifetime = <lifetime>
domain = "<domain>"
expires = int(time()) + lifetime
token_byte = base64.encodebytes(
md5(f"\{expires}{path} \{secret}".encode("utf-8")).digest()
)
token = (
token_byte
.decode("utf-8")
.replace("\n", "")
.replace("+", "-")
.replace("/", "_")
.replace("=", "")
)
secured_url = f"\{domain}{path}?md5=\{token}&expires=\{expires}"
print(secured_url)
Укажите:
<secret_key>
— секретный ключ, который указали в настройках CDN-ресурса;<path>
— относительный путь к файлу на источнике;<lifetime>
— время жизни ссылки в секундах;<domain>
— домен CDN-ресурса с указанием протокола. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий.
С параметром IP
Используйте, если на шаге 6 в настройках CDN-ресурса отметили чекбокс Добавить IP-адрес клиента к токену.
-
Сгенерируйте токен:
echo -n '<lifetime><path><ip_address> <secret_key>' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
'<lifetime><path><ip_address> <secret_key>' = '{expires}{path}{ip} {secret_key}'Укажите:
<lifetime>
— время жизни ссылки в секундах;<path>
— относительный путь к файлу на источнике;<ip_address>
— IP-адрес, которому разрешено получить контент;<secret_key>
— секретный ключ, который указали в настройках CDN-ресурса;<domain>
— домен CDN-ресурса с указанием протокола. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий.
-
Приведите ссылки к виду:
<domain>/<path>?md5=<token>&expires=<lifetime>
Где:
<domain>
— домен CDN-ресурса с указанием протокола. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий;<path>
— относительный путь к файлу на источнике;<token>
— токен, который получили при выполнении скрипта;<lifetime>
— время жизни ссылки в секундах (Unix).
Без параметра IP
Используйте, если на шаге 6 в настройках CDN-ресурса не отмечали чекбокс Добавить IP-адрес клиента к т окену.
-
Сгенерируйте токен:
echo -n '<lifetime><path> <secret_key>' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
'<lifetime><path> <secret_key>' = '{expires}{path} {secret_key}'Укажите:
<lifetime>
— время жизни ссылки в секундах;<path>
— относительный путь к файлу на источнике;<secret_key>
— секретный ключ, который указали в настройках CDN-ресурса.
-
Любым подходящим способом приведите ссылки к виду:
<domain>/<path>?md5=<token>&expires=<lifetime>
Где:
<domain>
— домен CDN-ресурса с указанием протокола. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий;<path>
— относительный путь к файлу на источнике;<token>
— токен, который получили при выполнении скрипта;<lifetime>
— время жизни ссылки в секундах (Unix).
-
В панели управления перейдите в раздел CDN → CDN-ресурсы.
-
Откройте страницу CDN-ресурса → вкладка Настройки.
-
Включите опцию Доступ по ключу.
-
Чтобы сгенерировать ключ автоматически, нажмите Сгенерировать ключ.
-
Чтобы использовать свой ключ, введите его вручную, учитывая требования:
- шестнадцатеричное число;
- от 6 до 64 разрядов;
- четное число разрядов.
-
Опционально: чтобы дать доступ к контенту только для определенных IP-адресов, отметьте чекбокс Добавить IP-адрес клиента к токену.
-
Нажмите Сохранить.
-
Настройте генерацию токена на сервере-источнике. Для генерации токена используются четыре параметра:
- время истечения ссылки;
- исходная ссылка на файл;
- IP-адреса, для которых разрешен доступ к файлу — опциональный параметр;
- ключ, который вы задали на шаге 4 или 5.
Для генерации токенов используйте следующие библиотеки:
При использовании этих библиотек необходимо генерировать URL parameter Query String. Используйте обязательные значения:
token_name = "sel-token"
escape_early = trueНиже приведены примеры Python-скриптов. Примеры на других языках доступны в репозиториях библиотек из списка выше.
Python-скрипт без параметра IP
$ pip install akamai-edgeauthfrom akamai.edgeauth import EdgeAuth, EdgeAuthError
ET_HOSTNAME = '<*.akamaized.net>'
ET_ENCRYPTION_KEY = '<secret_key>'
DEFAULT_WINDOW_SECONDS = <lifetime>
et = EdgeAuth(**{'key': ET_ENCRYPTION_KEY,
'window_seconds': <lifetime>})
et.token_name = "sel-token"
et.escape_early = "true"
token = et.generate_url_token("<path>")
url = "http://{0}{1}?{2}={3}".format(ET_HOSTNAME, "<path>", et.token_name, token)Укажите:
<*.akamaized.net>
— домен CDN-ресурса. Посмотреть домен ресурса можно в панели управления в разделе CDN → CDN-ресурсы → страница ресурса → вкладка Общий.<secret_key>
— секретный ключ, который вы указали в настройках CDN-ресурса;<lifetime>
— время жизни ссылки в секундах;<path>
— относительный путь к файлу на источнике;
Python-скрипт с параметром IP и временем начала и конца жизни ссылки
$ pip install akamai-edgeauth
from akamai.edgeauth import EdgeAuth, EdgeAuthError
from time import time
ET_HOSTNAME = '<*.akamaized.net>'
ET_ENCRYPTION_KEY = '<secret_key>'
START_TIME = time() + <lifetime_start>
END_TIME = time() + <lifetime_end>
IP = "<ip_address>"
et = EdgeAuth(**{'key': ET_ENCRYPTION_KEY})
et.start_time = START_TIME
et.end_time = END_TIME
et.ip = IP
et.token_name = "sel-token"
et.escape_early = "true"
token = et.generate_url_token("<path>")
url = "http://{0}{1}?{2}={3}".format(ET_HOSTNAME, "<path>", et.token_name, token)
print(url)Укажите:
<*.akamaized.net>
— домен CDN-ресурса. Посмотреть домен ресурса можно в панели управления: раздел CDN → CDN-ресурсы → страница ресурса → вкладка Общий.<secret_key>
— секретный ключ, который вы указали в настройках CDN-ресурса;<lifetime_start>
— начало времени жизни ссылки в секундах;<lifetime_end>
— окончание времени жизни ссылки в секундах;<ip_address>
— IP-адрес, которому разрешено получить контент;<path>
— относительный путь к файлу на источнике.
Настроить политику доступа с доменов
Политика доступа с доменов (Referrer ACL) позволяет предоставить или ограничить доступ к контенту с других доменов. По умолчанию доступ по доменам не ограничен.
-
В панели управлен ия перейдите в раздел CDN → CDN-ресурсы.
-
Откройте страницу CDN-ресурса → вкладка Настройки.
-
Включите опцию Политика доступа с доменов.
-
Выберите политику:
- разрешительная — ссылки на ваш контент будут работать на всех доменах, кроме указанных;
- запретительная — ссылки на ваш контент будут работать только на указанных доменах.
-
Введите имена доменов, которым нужно разрешить или запретить доступ согласно выбранной политике. Вводите имена по одному в строке без указания протокола, например:
example.com
example1.com -
Нажмите Сохранить.
Настроить политику доступа с IP-адресов
Политика доступа с IP-адресов (IP ACL) позволяет предоставить или ограничить доступ к контенту с определенных IP-адресов. По умолчанию доступ по IP-адресам не ограничен.
-
В панели управления перейдите в раздел CDN → CDN-ресурсы.
-
Откройте страницу CDN-ресурса → вкладка Настройки.
-
Включите опцию Политика доступа с IP-адресов.
-
Выберите политику:
- разрешительная — доступ к контенту разрешен всем IP-адресам, кроме указанных;
- запретительная — доступ к контенту запрещен всем IP-адресам, кроме указанных.
-
Введите IP-адреса, которым нужно разрешить или запретить доступ согласно выбранной политике. Вводите адреса с указанием маски подсети, по одному в строке, н апример:
192.0.2.0/24
198.51.100.0/24 -
Нажмите Сохранить.
Настроить политику доступа по странам
Опция недоступна для ресурсов Akamai.
Политика доступа по странам (Geo ACL) позволяет предоставить или ограничить доступ к контенту из определенных стран. По умолчанию доступ по странам не ограничен.
-
В панели управления перейдите в раздел CDN → CDN-ресурсы.
-
Откройте страницу CDN-ресурса → вкладка Настройки.
-
Включите опцию Политика доступа по странам.
-
Выберите политику:
- разрешительная — доступ к контенту разрешен из всех стран, кроме указанных;
- запретительная — доступ к контенту запрещен из всех стран, кроме указанных.
-
Выберите страны, для которых нужно разрешить или запретить доступ согласно выбранной политике.
-
Нажмите Сохранить.
Настроить политику доступа с клиентских приложений
Политика доступа с клиентских приложений (User Agent ACL) позволяет предоставить или ограничить доступ к контенту из CDN по клиентским приложениям (User Agent), например, для определенного браузера, приставки, устройства. По умолчанию доступ к ресурсу разрешен всем клиентским приложениям.
-
В панели управления перейдите в раздел CDN → CDN-ресурсы.
-
Откройте страницу CDN-ресурса → вкладка Настройки.
-
Включите опцию Политика доступа с клиентских приложений.
-
Выберите политику:
- разрешительная — доступ к ресурсу разрешен всем клиентским приложениям, кроме указанных;
- запретительная — доступ к ресурсу запрещен всем клиентским приложениям, кроме указанных.
-
Введите названия приложений, для которых нужно разрешить или запретить доступ согласно выбранной политике. Вводите названия по одному в строке, например:
Mozilla/5.0 (Windows NT 10.0; Win 64; x64)
-
Нажмите Сохранить.
Настроить уникальные HTTP-заголовки
Опция уникальных HTTP-заголовков (Custom Origin headers) позволяет задавать собственные HTTP-заголовки, которые CDN-сервер добавит в запрос при обращении к источнику.
- В панели управления перейдите в раздел CDN → CDN-ресурсы.
- Откройте карточку CDN-ресурса.
- Откройте вкладку Настройки.
- Включите опцию Уникальные HTTP-заголовки.
- Введите название заголовка. Допускаются латинские буквы
A-Z
,a-z
, цифры0-9
, подчеркивание_
и дефис-
. - Введите значение заголовка. Допускаются латинские буквы
A-Z
,a-z
, цифры0-9
, подчеркивание_
, точка.
, слэш/
, двоеточие:
, дефис-
, равно=
и пробел.
Пробел можно добавлять только внутри значения и между словами. Не ставьте пробел в начале и конце значения. - Если вам нужно добавить еще один заголовок, нажмите Добавить заголовок и повторите шаги 5-6.
Заголовок Access-Control-Allow-Origin
Опция позволяет защитить контент от загрузки на сторонних сайтах и приложениях за счет добавления заголовка Access-Control-Allow-Origin
. Применяется ко всем файлам на CDN-ресурсе.
Например, пользователь, находящийся на сайте example1.com
, открывает изображение, которое расположено на вашем сайте по адресу cdn.example2.com/image.jpg
. Браузер пользователя отправляет на сервер домена cdn.example2.com/image.jpg
запрос с заголовком Origin
, который указывает на источник запроса, в примере — Origin: http://example1.com
.
Сервер домена cdn.example2.com
проверяет содержимое заголовка Origin
в запросе:
- если домен разрешен, сервер ответит браузеру с заголовком
Access-Control-Allow-Origin
, который позволит браузеру отобразить изображение для пользователя сайтаexample2.com
. - если домен не разрешен, сервер ответит браузеру без заголовка
Access-Control-Allow-Origin
, и браузер не отобразит изображение для пользователя.
Настроить заголовок Access-Control-Allow-Origin
-
В панели управления перейдите в раздел CDN → CDN-ресурсы.
-
Откройте страницу CDN-ресурса → вкладка Настройки.
-
Включите опцию Заголовок Access-Control-Allow-Origin.
-
Выберите политику:
*
, для всех доменов — отображение контента разрешено всем сайтам, CDN-сервер будет передавать ответ браузеру с заголовкомAccess-Control-Allow-Origin: *
;- только для указанных доменов — отображение контента разрешено только указанным сайтам. При получении запроса CDN-сервер будет сверять значение заголовка
Origin
с доменами, которые вы укажете в настройках на шаге 5. Если домен разрешен, сервер ответит браузеру с заголовкомAccess-Control-Allow-Origin
с именем этого домена; - для всех доменов — отображение контента разрешено всем сайтам, CDN-сервер будет передавать в ответ браузеру имя домена, с которого пришел запрос, например:
Access-Control-Allow-Origin: example.com
.
-
Если вы выбрали политику Только для указанных доменов, введите имена доменов, которым разрешено загружать контент, максимум 20 доменов. Вводите имена по одному в строке без указания протокола.
-
Нажмите Сохранить.