Настройки безопасности
Все настройки безопасности находятся в карточке CDN-ресурса на вкладке Настройки.
Доступ по ключу
При использовании опции Доступ по ключу контент может быть загружен только по запросам, содержащим хеш-ключ. Опция защищает контент от нежелательных загрузок. Временные ссылки на защищаемый контент будут иметь вид:
- CDN Selectel:
<cdn_selectel-domain>/123.jpg?md5=DMF1ucDxtHCxwYQ&expires=2147483647
- CDN Akamai:
<akamai-domain>/123.jpg?sel-token=exp=1592563853~hmac=0851b56b74c47120565024a6c6532dc77dff809b0eeeb6fc1e01c86090a1bccd
Чтобы включить Доступ по ключу:
- Перейдите в раздел Настройки карточки CDN-ресурса и активируйте данную функцию.
- Нажмите кнопку Сгенерировать ключ либо введите желаемый ключ подписи вручную.
Требования к ключу:
CDN Selectel
- латинские буквы и цифры;
- длина от 6 до 32 символов;
CDN Akamai
- шестнадцатеричное число;
- от 6 до 64 разрядов;
- четное число разрядов.
По умолчанию при генерации токена учитываются 4 параметра:
- время истечения ссылки;
- исходная ссылка на файл;
- IP-адреса, для которых разрешен доступ к файлу;
- ключ.
Можно настроить токен так, чтобы доступ к файлу был открыт для любых IP-адресов. Для этого уберите галочку в поле Добавить IP-адрес клиента к токену и настройте токен на сервере-источнике так, чтобы параметр IP не учитывался.
Настройка на сервере-источнике для CDN Selectel
Организуйте сайт таким образом, чтобы обращения пользователей к защищаемым файлам в CDN производились по временным ссылкам. При обращении серверов CDN, контент должен отдаваться вне зависимости от наличия ключа.
Хеш-ключ — результат вычисления односторонней хеш-функции MD5 (String), где String — параметр, полученный слиянием следующих элементов (в указанной последовательности):
<expires><path><ip> <key>
Элемент | Описание |
---|---|
expires | Время истечения ссылки. Указывается в формате UNIX Timestamp. |
path | Исходная ссылка на файл |
key | Ключ |
IP | IP-адреса, для которых разрешен доступ к файлу (параметр может не учитываться). |
Чтобы сгенерировать Unix Timestamp в linux: date +%s -d "10min"
(текущее время + 10 минут).
CDN-серверы проверяют каждый запрос на своей стороне. Они имеют те же вводные данные (<expires><path><ip> <key>
) и используют их для генерации хеш-ключа.
Если вычисленная подпись не совпала и/или срок действия истек, сервер доставки контента CDN отправляет пользователю ошибку 403 Forbidden.
Если вычисленная подпись совпала и срок действия ссылки не истек, сервер доставки контента G-core CDN передает пользователю запрашиваемый файл.
Способы генерации токена на источнике
PHP-скрипт с параметром IP
<?php
$secret = 'secret_key';
$ip = '1.2.3.4';
$path = '/live/133529_2/chunklist.m3u8';
$expires = time() + 10000;
$link = "$expires$path$ip $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "http://cdn.site.com{$path}?md5={$md5}&expires={$expires}";
echo $url;
echo "\n";
PHP-скрипт без параметра IP
<?php
$secret = 'secret_key';
$path = '/live/133529_2/chunklist.m3u8';
$expires = time() + 10000;
$link = "$expires$path $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "http://cdn.site.com{$path}?md5={$md5}&expires={$expires}";
echo $url;
echo "\n";
Где:
- secret — секретный ключ;
- path — путь к файлу;
- ip — IP-адрес, которому разрешено получить контент;
- expires — время жизни ссылки (в секундах);
- link — строка для генерации токена с учетом необходимых параметров хеш-ключа;
- url — ссылка на файл.
Python-скрипт с параметром IP
import base64
from hashlib import md5
from time import time
secret = 'secret_key'
path = "/images/1.jpg"
ip = '1.2.3.4'
expires = int(time()) + 1800
token = base64.encodestring(
md5(
"%s%s%s %s" % (expires, path, ip, secret)
).digest()
).replace("\n", "").replace("+", "-").replace("/", "_").replace("=", "")
secured_url = "http://cdn.site.com%s?md5=%s&expires=%s" % (path, token, expires)
print secured_url
Python-скрипт без параметра IP
import base64
from hashlib import md5
from time import time
secret = 'secret_key'
path = "/images/1.jpg"
expires = int(time()) + 100000
token = base64.encodestring(
md5(
"%s%s %s" % (expires, path, secret)
).digest()
).replace("\n", "").replace("+", "-").replace("/", "_").replace("=", "")
secured_url = "http://cdn.site.com%s?md5=%s&expires=%s" % (path, token, expires)
print secured_url
Где:
- secret — секретный ключ;
- path — путь к файлу;
- ip — IP-адрес, которому разрешено получить контент;
- expires — время жизни ссылки (в секундах);
- token — генерация токена;
- secured_url — ссылка на файл.
Использование openssl
В результате вы получите только токен. Его необходимо использовать в ссылках и дополнительно указать время истечения ссылка в UNIX-время.
С параметром IP:
echo -n '2147483647/images/1.jpg1.2.3.4 secret_key' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
'2147483647/images/1.jpg1.2.3.4 secret_key' = '{expires}{path}{ip} {secret_key}'
Без параметра IP:
echo -n '2147483647/images/1.jpg secret_key' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
'2147483647/images/1.jpg secret_key' = '{expires}{path} {secret_key}'
Настройка на сервере-источнике для CDN Akamai
Для генерации токенов Akamai используйте следующие библиотеки:
При использовании этих библиотек необходимо генерировать url parameter query string. Используйте следующие обязательные значения:
token_name = "sel-token"
escape_early = true
Python-скрипт без параметра IP
from akamai.edgeauth import EdgeAuth, EdgeAuthError
ET_HOSTNAME = '<resourceID>.akamaized.net'
ET_ENCRYPTION_KEY = 'deadbeef'
DEFAULT_WINDOW_SECONDS = 500 # seconds
et = EdgeAuth(**{'key': ET_ENCRYPTION_KEY,
'window_seconds': DEFAULT_WINDOW_SECONDS})
et.token_name = "sel-token"
et.escape_early = "true"
token = et.generate_url_token("/123.jpg")
url = "http://{0}{1}?{2}={3}".format(ET_HOSTNAME, "/123.jpg", et.token_name, token)
Python-скрипт с параметром IP и временем
from akamai.edgeauth import EdgeAuth, EdgeAuthError
from time import time
ET_HOSTNAME = '<resourceID>.akamaized.net'
ET_ENCRYPTION_KEY = 'deadbeef'
START_TIME = time() + 60000 # seconds
END_TIME = time() + 660000 # seconds
IP = "1.1.1.1"
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("/123.jpg")
url = "http://{0}{1}?{2}={3}".format(ET_HOSTNAME, "/123.jpg", et.token_name, token)
print(url)
Где:
- ET_HOSTNAME — имя хоста;
- ET_ENCRYPTION_KEY — секретный ключ;
- DEFAULT_WINDOW_SECONDS — время жизни токена в секундах начиная с момента генерации;
- START_TIME — время начала действия токена;
- END_TIME — время окончания действия токена;
- IP — IP адрес для запроса с которого будет действовать данных токен.
Для установки времени жизни токена используется на выбор либо DEFAULT_WINDOW_SECONDS и тогда время начала жизни токена будет равно time(), либо пара значений START_TIME и END_TIME.
Примеры на других языках доступны в репозиториях с самими библиотеками.
Использование/неиспользование IP адреса клиента в токене в CDN Akamai настраивается в момент генерации токена и соответственно может отличаться в ссылках на разные файлы и даже и в ссылках на один и тот же файл для разных клиентов.
Политика доступа с доменов
Опция необходима для запрета размещения ссылок на ваш контент на других сайтах. По умолчанию никакие ограничения доступа по доменам к ресурсу не применяются. Можно задать разрешающую или блокирующую политику.
Разрешающая политика
В появившемся окне напишите для каких доменов необходимо запретить доступ. При доступе с введенных доменов, пользователь будет получать отказ в доступе.
Запрещающая политика
В появившемся окне напишите для каких доменов необходимо разрешить доступ. При доступе с других доменов, пользователь будет получать отказ в доступе.
Политика доступа с IP-адресов
Опция ограничивает доступ к контенту CDN с определенных IP-адресов. По умолчанию никакие ограничения доступа по IP к ресурсу не применяются. Можно задать разрешающую или блокирующую политику.
Разрешающая политика
Доступ к ресурсу разрешен всем IP-адресам, кроме указанных в поле.
Блокирующая политика
Доступ к ресурсу запрещен всем IP-адресам, кроме указанных в поле.
Политика доступа по странам
Функция недоступна для ресурсов Akamai. Вы можете предоставить или ограничить доступ к контенту из конкретных стран. По умолчанию никакие ограничения доступа по странам к ресурсу не применяются. Можно выбрать разрешающую или блокирующую политику.
Разрешающая политика
Доступ к ресурсу разрешен всем странам, кроме указанных в поле.
Блокирующая политика
Доступ к ресурсу запрещен всем странам, кроме указанных в поле.
Политики доступа с клиентских приложений
Настройка ограничивает доступ к контенту из CDN по клиентским приложениям (User Agent), например, для определенного браузера, приставки, устройства. По умолчанию доступ к ресурсу разрешен всем клиентским приложениям. Можно задать разрешающую или блокирующую политику.
Разрешающая политика
Доступ к ресурсу разрешен всем клиентским приложениям, кроме указанных в поле.
Блокирующая политика
Доступ к ресурсу запрещен всем клиентским приложениям, кроме указанных в поле.
Уникальные HTTP-заголовки
Можно задавать собственные HTTP-заголовки, которые CDN-сервер добавит в запрос при обращении к источнику. Допустимые символы для полей:
- Название заголовка: латинские буквы (A-Z, a-z), цифры (0-9), подчеркивание (_) и тире (-);
- Значение: латинские буквы (A-Z, a-z), цифры (0-9), подчеркивание (_), точка (.), слэш (/), двоеточие (:), тире (-), равно (=), пробел.
Пробелы могут добавляться лишь в середину значения. Начинаться или заканчиваться пробелами значение не может. Также между словами в середине можно внести лишь один пробел.
Заголовок Access-Control-Allow-Origin
Настройка предназначена для защиты контента от загрузки на сторонних сайтах или в сторонних приложениях за счет добавления заголовка Access-Control-Allow-Origin и применяется ко всем файлам, передающимся через CDN.
Как работает CORS?
Например, пользователь, находящийся на сайте site1.com
, открывает изображение, которое расположено на вашем сайте по адресу cdn.site.com/image.jpg
.
В таком случае браузер пользователя отправляет на сервер домена cdn.site.com/image.jpg
запрос, например, вида:
GET /image HTTP/1.1
Host: site2.com
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://site1.com/examples/access-control/test.html
Origin: http://site1.com
В запросе важным является заголовок Origin. Он сообщает серверу, что запрос отправлен с домена site1.com
.
Сервер домена cdn.site.com/image.jpg
учитывает заголовок Origin запроса и принимает запрос или отказывает в его обработке.
Если сервер принял запрос, в ответе браузеру будет отправлен заголовок Access-Control-Allow-Origin, который позволит браузеру отобразить изображение для пользователя сайта site1.com
.
Если сервер отказал в обработке запроса, ответ браузеру будет отправлен без заголовка Access-Control-Allow-Origin и браузер не отобразит изображение для пользователя.
Настройка в панели управления
В этой опции доступно три варианта настройки:
*
, для всех доменов — отображение контента разрешено всем сайтам.- Только для указанных доменов — при получении запроса CDN сверяет значение заголовка Origin с доменами, которые указаны для опции HTTP-заголовок Access-Control-Allow-Origin. Если значение заголовка Origin соответствует одному из указанных доменов, CDN добавляет к ответу заголовок Access-Control-Allow-Origin с доменом, с которого пришел запрос. Если значение заголовка Origin не соответствует указанным доменам, заголовок Access-Control-Allow-Origin не добавляется. Браузер клиента отдает контент только если заголовок Access-Control-Allow-Origin присутствует в ответе.
- Для всех доменов — отображение контента разрешено всем сайтам. При получении запроса CDN-сервер добавляет к ответу заголовок Access-Control-Allow-Origin с доменом, с которого пришел запрос.
Переадресация на HTTPS
Настройка перенаправляет все запросы с HTTP на HTTPS.
Если вы используете персональный CNAME, убедитесь, что он доступен через HTTPS.