Защита контента с помощью DRM¶
DRM (Digital Rights (Restrictions) Management) — это способ защиты видео-контента при помощи шифрования парой ключей. Ключи выдаются сервером ключей DRM-системы.
Ниже на этой странице приведены настройки, одинаковые для всех поддерживаемых DRM систем.
По ссылкам приведены настройки для конкретных DRM. Flussonic Media Server поддерживает работу со следующими системами DRM:
Описание механизма защиты DRM¶
Apple в спецификации протокола HLS описывает два штатных механизма шифрования: AES-128 и SAMPLE-AES. Flussonic Media Server поддерживает оба.
Механизмы отличаются лишь непосредственным способом шифрования данных и работают по трёхсторонней схеме. Вот как это реализовано во Flussonic:
- Flussonic запрашивает ключ для шифрования контента от сервера ключей и получает его вместе с URL этого ключа.
- Клиент получает от Flussonic шифрованный контент и URL ключа для дешифрования.
- Сервер ключей получает от клиента запрос на ключ для дешифрования и решает: отдавать ключ или нет.
Если клиент получает контент от Flussonic по безопасному соединению и общается с сервером ключей по протоколу HTTPS, то можно надеяться на то, что он сможет расшифровать видео и проиграть его, не открыв доступ к нешифрованному контенту неавторизованным пользователям.
Механизмы получения ключа для видеопотоков и для файлов не отличаются.
Настройка шифрования в общем случае¶
Flussonic Media Server хранит контент в нешифрованном виде. Контент шифруется при отдаче клиенту.
Чтобы включить шифрование, добавьте параметр drm
в настройки потока или зоны файлов в файле конфигурации (/etc/flussonic/flussonic.conf
). Затем укажите метод шифрования и сервер ключей (в зависимости от выбранной системы DRM могут потребоваться и другие данные):
stream channel0 {
input fake://fake;
drm aes128 keyserver=http://examplehost:5000/cas-server;
}
Вы также можете осуществить настройку шифрования в веб-интерфейсе Flussonic UI. Для этого:
- Перейдите на вкладку Media в раздел Streams и выберете необходимый поток. После чего кликните на его название.
- В открывшемся окне настроек потока, перейдите на вкладку Auth и найдите раздел Require DRM authorization. Выберете желаемую систему DRM из списка доступных и укажите необходимую информацию:
Примеры настроек для отдельных DRM-систем приведены в одноименных разделах (см. ссылки в начале этой странице). Актуальный список настроек для каждой DRM-системы вы можете найти в Flussonic API reference.
После сохранения настроек Flussonic будет шифровать контент для всех протоколов, которые могут работать с указанным методом шифрования.
Вы также можете редактировать настройки DRM с помощью API, передавая объект drm
в запросе Flussonic-API: PUT /streams/{name}
.
Вы также увидите следующее предупреждение на вкладке Overview в настройках потока:
Опции для проигрывания по HLS¶
Для успешного проигрывания AES128-шифрованного потока по HLS на некоторых современных устройствах (работающих на Tizen 5) необходимо добавить опцию hls_ext_x_key_iv=false
:
stream channel0 {
input fake://fake;
drm aes128 keyserver=http://examplehost:5000/cas-server hls_ext_x_key_iv=false;
}
Запретить проигрывание по протоколам¶
Danger
Необходимо отключить все протоколы, которые несовместимы с выбранной DRM системой. Если указанный метод шифрования поддерживается в протоколе HLS, но у вас остался работающим протокол DASH, то пользователь сможет без проблем проиграть видео по DASH без шифрования.
Чтобы этого не произошло, надо отключить все лишние протоколы для нужного потока или зоны файлов:
stream channel0 {
input udp://239.0.0.1:1234;
protocols hls;
drm aes128 keyserver=http://examplehost:5000/cas-server;
}
vod vod_files {
storage /storage;
protocols hls;
drm aes128 keyserver=http://examplehost:5000/cas-server;
}
Теперь доступ к контенту доступен только по протоколу HLS.
DRM для файлов¶
В случае с файлами, внешний сервер ключей не может явно указывать ключ, потому что не знает, когда файл будет открыт на чтение.
Необходимо сконфигурировать файл на явное обращение к серверу ключей:
vod vod_files {
storage /storage;
protocols dash hls;
drm aes128 keyserver=http://examplehost:5000/cas-server;
}
При такой конфигурации Flussonic будет делать HTTP GET
-запросы к серверу ключей с параметром ?name=
:
http://192.168.0.80:4500/?name=drm/bunny.mp4&number=1
Flussonic ожидает ответ, в котором первые 32 байта будут HEX-представлением ключа, используемого для шифрования.
Также в этом ответе ожидается заголовок X-Key-Url
, который будет сообщён клиенту.
По этой причине X-Key-Url
клиент будет ожидать 16-байтный ключ (не в HEX
виде) для дешифровки.
Защита DVR архива с помощью DRM¶
Архив шифруется посегментно одним ключом, и каждые 10 минут Flussonic запрашивает новый ключ для следующей группы сегментов.
Danger
Чтобы DRM защита DVR архива работала, сервер ключей должен хранить старые ключи (по старым URL) по продолжительности не менее, чем глубина архива.
Включение шифрования всех кадров¶
По умолчанию Flussonic шифрует только ключевые кадры. Как правило, этого достаточно для защиты от несанкционированного доступа к потоку, однако некоторые Smart TV и приставки требуют, чтобы шифрованию подвергались все кадры в потоке. К тому же шифрованию ключевых кадров снижает энергопотребление при дешифровке на стороне клиента.
Чтобы включить шифрование всех кадров, используйте опцию encryption=full
при настройке DRM.
Для включения режима шифрования только ключевых кадров используйте опцию encryption=sparse
.
stream channel0 {
url fake://fake;
protocols dash hls;
drm aes128 keyserver=http://examplehost:5000/cas-server encryption=full;
}
Ротация ключей шифрования¶
Многие серверы DRM периодически меняют (ротируют) ключи с целью более надежной защиты. По умолчанию Flussonic не ротирует ключи шифрования. Для включения ротации и изменения интервала ротации ключей используйте опцию expires
и укажите требуемое время в минутах:
stream channel1 {
url fake://fake;
protocols dash hls;
drm aes128 keyserver=http://examplehost:5000/cas-server expires=60;
}
В случае использования опции expires
параметр drm_id
генерируется автоматически при каждом новом запросе ключа шифрования.
Warning
Включение опции expires
означает регулярное получение новых ключей шифрования от сервера ключей. В зависимости от условий провайдер DRM может взимать оплату за каждый выданный ключ. Рекомендуем перед включением опции expires
проверить свой договор с провайдером DRM.
CPIX API¶
CPIX — это открытая спецификация, разработанная DASH-IF, которая предоставляет совместимый формат на основе XML для обмена конфигурациями защиты контента между различными системами.
Flussonic Media Server поддерживает CPIX API. Используя этот API, любой поставщик DRM может интегрироваться с Flussonic, если в его системе поддерживается CPIX API.
CPIX использует некоторую XML схему для описания взаимодействия между сервером ключей и Flussonic.
Добавление защиты CPIX DRM¶
Чтобы настроить DRM с обменом ключами в формате CPIX, укажите ваш сервер ключей с помощью опции drm cpix
.
Для потока:
stream mystream {
input udp://239.0.0.1:1234;
protocols dash hls mss;
resource_id MYSTREAM;
drm cpix keyserver=http://my.keyserver;
}
Для файла:
vod drm {
storage /storage/vod;
protocols dash hls mss;
drm cpix keyserver=http://my.keyserver;
}
Обратите внимание, что при использовании конфигурации для файла нужно поместить drm_id
в файл *.cpix_id
, потому что для VOD нет опции meta
. Этот drm_id
будет использоваться в запросах CPIX.
Пример запроса¶
Когда запрашивается поток mystream
, Flussonic отправляет POST-запрос по URL-адресу http://my.keyserver
со следующим телом запроса:
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke" id="MYSTREAM">
<cpix:ContentKeyList>
<cpix:ContentKey kid="2d70751b-972e-1479-7ef9-9fc835860120"/>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem kid="2d70751b-972e-1479-7ef9-9fc835860120" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/> # widevine
<cpix:DRMSystem kid="2d70751b-972e-1479-7ef9-9fc835860120" systemId="9a04f079-9840-4286-ab92-e65be0885f95"/> # playready
<cpix:DRMSystem kid="2d70751b-972e-1479-7ef9-9fc835860120" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2"/> # fairplay
</cpix:DRMSystemList>
</cpix:CPIX>
Поля, используемые в запросе и ответе, такие как ContentKeyList и DRMSystemList, описаны в документе DASH-IF Implementation Guidelines: Content Protection Information Exchange Format
Пример ответа¶
Flussonic ожидает ответа следующего вида:
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke" id="MYSTREAM">
<cpix:ContentKeyList>
<cpix:ContentKey explicitIV="" kid="2d70751b-972e-1479-7ef9-9fc835860120">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>iufSFDzgKQ+6pnV88WyZnA==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem kid="2d70751b-972e-1479-7ef9-9fc835860120" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
<cpix:URIExtXKey>aHR0cHM6Ly83azR5dHV4cTVkLmV4ZWN1dGUtYXBpLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL0VrZVN0YWdlL2NsaWVudC9hYmMxMjMvOThlZTU1OTYtY2QzZS1hMjBkLTE2M2EtZTM4MjQyMGM2ZWZm</cpix:URIExtXKey>
</cpix:DRMSystem>
<cpix:DRMSystem kid="2d70751b-972e-1479-7ef9-9fc835860120" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cpix:PSSH>AAAAd3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFcIARIQzLxOBq/7WMlQjQ4jrSMwnxoIbW92aWRvbmUiM3sia2lkIjoiekx4T0JxXC83V01sUWpRNGpyU013bnc9PSIsInRyYWNrcyI6WyJTRCJdfSoCU0Q=</cpix:PSSH>
</cpix:DRMSystem>
<cpix:DRMSystem kid="2d70751b-972e-1479-7ef9-9fc835860120" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
<speke:ProtectionHeader>mAIAAAEAAQCOAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AQgBrADYAOAB6AFAAdQB2AHkAVgBoAFEAagBRADQAagByAFMATQB3AG4AdwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBsADEANgBXAHYAcABrADUAVABwAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBwAGwAYQB5AHIAZQBhAGQAeQAuAGUAegBkAHIAbQAuAGMAbwBtAC8AYwBlAG4AYwB5AC8AcAByAGUAYQB1AHQAaAAuAGEAcwBwAHgAPwBwAFgAPQA1ADEANAA1ADgAOQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</speke:ProtectionHeader>
<cpix:PSSH>AAACuHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAApiYAgAAAQABAI4CPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBCAGsANgA4AHoAUAB1AHYAeQBWAGgAUQBqAFEANABqAHIAUwBNAHcAbgB3AD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AGwAMQA2AFcAdgBwAGsANQBUAHAAUQA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZQB6AGQAcgBtAC4AYwBvAG0ALwBjAGUAbgBjAHkALwBwAHIAZQBhAHUAdABoAC4AYQBzAHAAeAA/AHAAWAA9ADUAMQA0ADUAOAA5ADwALwBMAEEAXwBVAFIATAA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cpix:PSSH>
</cpix:DRMSystem>
</cpix:DRMSystemList>
</cpix:CPIX>
Опции, которые используются только на Flussonic и могут быть полезны:
save_template
— сохраняет ответ сервера ключей в файл.dump_url
— логирует запрашиваемый URL.