Технические подробности работы системы лицензирования

Материал из ISPWiki
Перейти к: навигация, поиск

Для технической защиты продуктов от тиражирования нами была разработана система лицензирования, которая проверяет право на использование программного продукта привязывая его к 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

При получении запроса на лицензию, сервер ищет ее в своей базе по ключу и проверяет внутренний параметр 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. Решение - обновить панель.

Частые вопросы

  • Как перейти на триальную лицензию, если у коммерческой истек срок действия? Удалите файл лицензии (например: rm etc/ispmgr.lic), тогда не будет информации о предыдущей лицензии и будет предпринята попытка выдачи триала. Однако если ваше текущее состояние продукта превышает ограничения триальной лицензии, ничего работать не будет, будет требоваться активация коммерческой лицензии.
  • Можно ли безболезненно удалять файл лицензии? Вообще мы не рекомендуем этого делать, поскольку теряется точная идентификация выданной вам лицензии, потребуется процедура автоматической идентификации, которая может не отработать и потребовать активацию по ключу, кроме того может быть выдана чужая лицензия с более новым ID (мы не запрещаем покупку лицензий на одни и те же адреса разными клиентами)
  • Что делать, если лицензия на активируется? Если не удается автоматическая активация, которая может быть связана с проблемами идентификации, а также обратной связи с вашим сервером, то пробуйте выполнить активацию по ключу, и не удаляйте файл лицензии (иначе придется делать перегенерацию ключа и заново активировать лицензию). В случае активации по ключу, никакие побочные эффекты от особенностей вашей сетевой инфраструктуры, NAT, proxy, firewall и т.д. никак не могут влиять на процедуру получения лицензии.