Для защиты продуктов от тиражирования была разработана система лицензирования, которая проверяет право на использование программного продукта, привязывая его к IP-адресу или уникальному ключу.

Общая информация


Лицензия имеет несколько основных атрибутов:

  • ID — уникальный порядковый номер лицензии;
  • Имя — произвольное наименование, на усмотрение владельца, заполняется при покупке лицензии;
  • IP-адрес — нужен для автоматической активации лицензии. В целях защиты от тиражирования, нельзя менять чаще одного раза в месяц;
  • Активационный ключ — нужен для активации лицензии вручную, используется в случаях когда автоматическая активация невозможна. Например, если сервер не имеет публичного IP-адреса;
  • Срок действия лицензии — дата, до которой действует право использования программного продукта;
  • Срок подписки на обновления — дата, до которой действует право на получение обновлений программного продукта.

Кроме этого имеется множество скрытых атрибутов. Наиболее важным является "внутренний срок действия" —  технически лицензия выдаётся не на весь срок на который она куплена, а на очень короткий промежуток времени. На момент написания статьи это случайный интервал от 2-х до 3-х суток, при этом он не может превышать фактический срок действия лицензии. По истечении внутреннего срока действия пользоваться программным продуктом станет невозможно, при этом это никак не повлияет на работу остальных сервисов на вашем сервере.

Отказоустойчивость системы


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

Кроме этого, для большей надежности мы используем не один, а несколько географически распределенных серверов лицензий, обращение к которым идет как по IP-адресам — для страховки от проблем с DNS, так и по доменным именам — для большей гибкости. В начале выбирается ближайший доступный сервер, и после этого производится запрос на лицензию. Если в процессе получения лицензии произошёл технический сбой, то будет использован следующий сервер. И так до тех пор, пока не будут испробованы все доступные сервера.

Каждый сервер лицензий имеет собственную базу данных лицензий и никак не зависит от работы нашей биллинговой системы и каких-либо других внешних подсистем. Синхронизация данных происходит в режиме реального времени, а в случае пропадания связи восстанавливается в считанные минуты.

Принципы работы


При выполнении запроса на лицензию в качестве параметров передаются её ключ и IP-адреc сервера.

Запрос передаётся на сервер лицензии по http через 80 порт или по https через 443 порт — в зависимости от версии.

Ключ лицензии берётся из существующего файла лицензии, указывается в форме активации лицензии или передаётся через параметр утилиты licctl.

Список IP-адресов формируется из списка адресов, которые слушает ihttpd. Если у него в качестве адреса указан 0.0.0.0 или ::, то используются все адреса сервера, которые можно посмотреть при помощи команды:

ip addr list
CODE

При получении запроса на лицензию, сервер ищет её в своей базе по ключу и проверяет внутренний параметр updatekey, значение которого меняется всякий раз, когда продукт запрашивает лицензию. Таким образом, только последний запросивший лицензию сервер знает правильный updatekey и может запросить лицензию заново. Если ключ есть в базе, updatekey совпал и срок действия лицензии не истёк, то генерируется новый файл лицензии, который возвращается в ответе на запрос лицензии.

Если ключа нет, или updatekey не совпадает, то делается попытка автоматической идентификации по IP-адресу. То есть выполняется поиск в базе по адресам, переданным в качестве списка IP-адресов сервера. Также добавляется адрес с которого фактически пришел запрос. Если на указанные адреса имеется несколько активных лицензий, выбирается лицензия с наибольшим ID. Для исключения подделок IP-адресов в параметрах, сервер лицензий выполняет попытку подключится к серверу клиента по адресу найденной лицензии и загрузить её. При этом полный URL берётся из настроек ihttpd сервера. Если это не получится, то запрос на лицензию вернёт ошибку.

Если лицензия не найдена или просрочена, то существует несколько вариантов действий:

  • IP-адрес попадает в диапазон адресов партнера, для которого активирована опция автоматического заказа и продления. В этом случае отправится запрос на активацию или продление лицензии в билинговую систему, а в качестве ответа будет возвращена ошибка, предписывающая повторить запрос на лицензию через 1 минуту;
  • в случае, если лицензия была найдена по ключу, но оказалась просрочена, возвращается ошибка о том что лицензия просрочена;
  • во всех остальных случаях будет предпринята попытка генерации триальной лицензии. Для ISPmanager триальные лицензии могут быть выданы только на IPv4 адреса и срок действия лицензии ограничен 14 днями. По истечению данного срока, получение триальной лицензии для IP-адреса, с которого пришёл запрос, блокируется на полгода. Для всех остальных продуктов всегда доступны триальные лицензии с некоторыми лимитами, подробнее о которых написано на страницах продуктов на сайте компании

Возможные ответы сервера лицензий


  • BADINFO — неверный запрос от клиента;
  • MYSQL FAILED — сервер MySQL недоступен/не отвечает на запросы. Техническая ошибка, будет предпринята попытка обращения к другому серверу;
  • MYSQL — ошибка при попытке получения информации о лицензии. Техническая ошибка, будет предпринята попытка обращения к другому серверу;
  • NOIPV6 — попытка получения триальной лицензии ISPmanager с IPv6 адреса;
  • EXPIRED — срок действия вашей лицензии истёк;
  • OK — лицензия была успешно залита на сервер;
  • OK\n... — лицензия успешно сгенерированна и передана в качестве ответа;
  • BACK QUERY FAILED — лицензия найдена, но на сервер её залить не удалось;
  • BADTIME — время сервера отличается от времени на сервере лицензий больше чем на час;
  • ORDER — была предпринята попытка автоматического заказа/продления лицензии. Повторите запрос ещё раз;
  • TOOOLD — возникает для лицензий, если версия панели ниже 5.45. Решение — обновить панель.