Настройки безопасности

Все настройки безопасности находятся в карточке CDN-ресурса на вкладке Настройки.

Доступ по ключу

При использовании опции Доступ по ключу контент может быть загружен только по запросам, содержащим хеш-ключ. Опция защищает контент от нежелательных загрузок. Временные ссылки на защищаемый контент будут иметь вид:

  • CDN Selectel: <cdn_selectel-domain>/123.jpg?md5=DMF1ucDxtHCxwYQ&expires=2147483647
  • CDN Akamai: <akamai-domain>/123.jpg?sel-token=exp=1592563853~hmac=0851b56b74c47120565024a6c6532dc77dff809b0eeeb6fc1e01c86090a1bccd

Чтобы включить Доступ по ключу:

  1. Перейдите в раздел Настройки карточки CDN-ресурса и активируйте данную функцию.
  2. В появившемся окне нажмите кнопку Сгенерировать ключ либо введите желаемый ключ подписи вручную.

Требования к ключу:

  • CDN Selectel

    • латинские буквы и цифры;
    • длина от 6 до 32 символов;
  • CDN Akamai

    • шестнадцатеричное число;
    • от 6 до 64 разрядов;
    • четное число разрядов.

По умолчанию при генерации токена учитываются 4 параметра:

  • время истечения ссылки;
  • исходная ссылка на файл;
  • IP-адреса, для которых разрешен доступ к файлу;
  • ключ.

Можно настроить токен так, чтобы доступ к файлу был открыт для любых IP-адресов. Для этого уберите галочку в поле Добавить IP-адрес клиента к токену и настройте токен на сервере-источнике так, чтобы параметр IP не учитывался.

Настройка на сервере-источнике для CDN Selectel

Организуйте сайт таким образом, чтобы обращения пользователей к защищаемым файлам в CDN производились по временным ссылкам. При обращении серверов CDN, контент должен отдаваться вне зависимости от наличия ключа. Хеш-ключ — результат вычисления односторонней хеш-функции MD5 (String), где String — параметр, полученный слиянием следующих элементов (в указанной последовательности): <expires><path><ip> <key>

Элемент Описание
Время истечения ссылки. Указывается в формате UNIX Timestamp.
Исходная ссылка на файл
Ключ
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?

Например, пользователь, находящийся на сайте http://domain1.com, открывает изображение, которое расположено на вашем сайте по адресу http://cdn-domain.com/image.jpg.

В таком случае браузер пользователя отправляет на сервер домена http://cdn-domain.com/image.jpg запрос, например, вида:

GET /image HTTP/1.1
Host: domain2.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://domain1.com/examples/access-control/test.html
Origin: http://domain1.com

В запросе важным является заголовок Origin. Он сообщает серверу, что запрос отправлен с домена http://domain1.com.

Сервер домена http://cdn-domain.com/image.jpg учитывает заголовок Origin запроса и принимает запрос или отказывает в его обработке.

Если сервер принял запрос, в ответе браузеру будет отправлен заголовок Access-Control-Allow-Origin, который позволит браузеру отобразить изображение для пользователя сайта http://domain1.com.

Если сервер отказал в обработке запроса, ответ браузеру будет отправлен без заголовка Access-Control-Allow-Origin и браузер не отобразит изображение для пользователя.

Настройка в панели управления

В этой опции доступно три варианта настройки:

  1. *, для всех доменов — отображение контента разрешено всем сайтам
  2. Только для указанных доменов — при получении запроса CDN сверяет значение заголовка Origin с доменами, которые указаны для опции HTTP-заголовок Access-Control-Allow-Origin. Если значение заголовка Origin соответствует одному из указанных доменов, CDN добавляет к ответу заголовок Access-Control-Allow-Origin с доменом, с которого пришел запрос. Если значение заголовка Origin не соответствует указанным доменам, заголовок Access-Control-Allow-Origin не добавляется. Браузер клиента отдает контент только если заголовок Access-Control-Allow-Origin присутствует в ответе.
  3. Для всех доменов — отображение контента разрешено всем сайтам. При получении запроса CDN-сервер добавляет к ответу заголовок Access-Control-Allow-Origin с доменом, с которого пришел запрос.

Переадресация на HTTPS

Настройка перенаправляет все запросы с HTTP на HTTPS.

Если вы используете персональный CNAME, убедитесь, что он доступен через HTTPS.