Свой сервер проверки BAS лицензий

Делитесь приложениями
  • Решил выложить свое решение для проверки лицензий в скомпилированных BAS скриптах.

    Для чего это нужно?

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

    Решение позволяет проверять лицензии прямо в рантайме, во время работы скрипта.

    Компоненты

    • сервер проверки лицензий (ссылка на репозиторий);
    • скрипт, который встраивается в шаблон BAS и проверяет через заданный интервал времени не истекла ли лицензия.

    Как это работает?

    1. Раз в час (или любой заданный интервал) шаблон, запущенный клиентом, отправляет запрос на ваш сервер.
    2. Сервер при необходимости авторизуется с вашим логином и паролем в админ панели BAS, решая капчу. Сохраняет сессию авторизации, чтобы не входить повторно.
    3. Сервер отправляет запрос в BAS и получает данные лицензии.
    4. Клиент получает данные лицензии. Если лицензия истекла, то принудительно останавливает работу.

    Зачем нужен сервер и почему нельзя отправлять запрос из шаблона напрямую к API BAS?

    1. Это неприемлемо с точки зрения безопасности. Запрос легко подделать, узнав данные запроса посредством любого MITM прокси. Далее достаточно подменить домен BAS'а на локалхост и поднять свой API, который всегда будет возвращать ответ, что лицензия валидна.
    2. Нельзя отслеживать статистику.

    Как свой сервер позволяет решить проблемы безопасности?

    Данные ответа сервера защищены ассиметричным шифрованием. Сервер подписывает тело ответа приватным ключом и передает подпись в заголовке X-Signature. Клиент (шаблон BAS) валидирует подпись публичным ключом.

    Помимо этого в теле ответа передается:

    1. Уникальный request_id, который генерируется с каждым запросом, чтобы предотвратить reply атаки. Без этого можно было бы один раз получить тело запроса и подпись и, подделав запрос на своем домене, отправить те же данные. Но благодаря уникальному токену, body всегда будет уникальный и подпись всегда будет подписывать новое тело запроса.
    2. Таймстамп в поле created_at, где передается текущее время. Клиент сравнивает переданный таймстамп со своим текущим временем и, если время не сходится (пользователь перевел часы у себя на ПК), считает запрос скомпрометированным.

    Мониторинг

    Вы можете мониторить запросы и ошибки через Grafana.

    Как установить сервер?

    Процесс установки описан в Readme.

    Как встроить код клиента в свои шаблоны?

    Смотрите examples в репозитории.

    Зачем изобретать велосипед?

    Понимаю, что можно сделать свой собственный сервер лицензий, не используя BAS. Но, возможно, вы, как и я, уже имеете шаблоны с созданными пользователями и не хотите переносить данные лицензий. К тому же, это проще 🔥.

  • Дико заранее извиняюсь, но хотелось бы понять как защищен код для проверки лицензии, если допустим скрипт открытый, без премиум BAS? Что мешает открыть скрипт и удалить все проверки, или это решение только для премиум пользователей и закрытых скриптов?

  • @val2020 said in Свой сервер проверки BAS лицензий:

    Дико заранее извиняюсь, но хотелось бы понять как защищен код для проверки лицензии, если допустим скрипт открытый, без премиум BAS? Что мешает открыть скрипт и удалить все проверки, или это решение только для премиум пользователей и закрытых скриптов?

    Вы думаете мы на форуме BAS позволили бы жить теме, которая рассказывает как бесплатно реализовать аналог платного функционала BAS?

  • @val2020 этот "скрипт" не имплементирует функционал BAS по защите шаблонов лицензией. Он проверяет существует ли лицензия у скрипта во время работы шаблона. Из коробки BAS проверяет лицензию только при запуске скрипта. Но если шаблон уже запущен и лицензия истекла, он продолжит работать. Этот скрипт для этого и предназначен - проверять лицензию в рантайме, в реальном времени. Функционал лицензирования баса он не заменяет, а дополняет.

    Насколько помню, я с @Fox обсуждал правомерность выкладывания этого скрипта в паблик, он дал согласие. Думал, из описания всем все понятно.

  • @thepappo said in Свой сервер проверки BAS лицензий:

    Из коробки BAS проверяет лицензию только при запуске скрипта.

    Что в общем то капец какая недоработка. Время идет, а каждый разраб(кто в теме) продолжает пилить свой велосипед на это.

  • Не проще получить в начале дату истечения лицензии скрипта. И потом в шаблоне сравнивать ее с текущей? Зачем велосипед?

  • @kodes said in Свой сервер проверки BAS лицензий:

    Не проще получить в начале дату истечения лицензии скрипта. И потом в шаблоне сравнивать ее с текущей? Зачем велосипед?

    А если пользователь продлил лицензию во время работы скрипта?

  • Такое бывает крайне редко и если он перезапустит скрипт ничего страшного не произойдет

  • @kodes said in Свой сервер проверки BAS лицензий:

    Такое бывает крайне редко и если он перезапустит скрипт ничего страшного не произойдет

    Действительно, подумаешь, на 800-х серверах нужно все перезапустить(а такой кейс есть).

  • @kodes said in Свой сервер проверки BAS лицензий:

    Не проще получить в начале дату истечения лицензии скрипта. И потом в шаблоне сравнивать ее с текущей? Зачем велосипед?

    Чтобы получить дату истечения скрипта, нужно также авторизоваться в BAS, сохранить сессию. При этом безопасно это сделать можно только на бэкенде, который предоставляет API для клиентской части.