Перейти к основному содержимому

Реализация функциональности лицензирования в продукте

Для ознакомления с описанием редакций продукта прочитайте документ «Политика лицензирования продукта СУБД Pangolin».

Сведения

Редакции Standard для ERP-систем и Enterprise для ERP-систем по тексту указаны как StandardWith1C и EnterpriseWith1C соответственно.

Для целей соблюдения лицензионных условий применяется файл, содержащий параметры лицензии и подписанный цифровой подписью с использованием приватного ключа, хранимого в закрытом репозитории СУБД Pangolin. Реализация цифровой подписи основана на RSA-шифровании, предоставляемом библиотекой OpenSSL:

openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
примечание

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

Для работы с лицензиями реализуется библиотека, предоставляющая возможность проверки наличия лицензии, ее тип и срок действия. Данная библиотека статически подключается к продукту и его утилитам для проверки доступности лицензируемой функциональности. Файл лицензии хранится и обрабатывается в формате JSON. Электронная цифровая подпись хранится в самом файле. Подписывается секция license, содержащая следующие поля:

  • end_date - дата окончания в формате <year>-<month>-<day> <hour>:<minute>:<second>;

  • licensee - лицо, имеющее право пользования лицензией;

  • type - тип лицензии в строковом представлении, одно из значений перечисления LicenseType:

    typedef enum
    {
    LICTYPE_Enterprise,
    LICTYPE_EnterpriseWith1C,
    LICTYPE_Trial,
    LICTYPE_StandardWith1C,
    LICTYPE_Standard,
    LICTYPE_Undefined
    } LicenseType;
  • features - список дополнительной функциональности в строковом представлении, одно из значений перечисления LicensedFeature:

    typedef enum
    {
    LIC_TDE,
    LIC_AuthEncryption,
    LIC_Protection,
    LIC_SecuredConfig,
    LIC_Masking,
    LIC_CertPKCS12,
    LIC_PerformanceInsights,
    LIC_RelBlock,
    LIC_DateMotidification,
    LIC_ConnectionQuota,
    LIC_OutlineQuery,
    LIC_Support1C,
    LIC_PreparedStatements,
    LIC_NativePartitioning,
    LIC_DiagnosticTool,
    LIC_GraceAuth,
    LIC_ResourceConsumptionLimits,
    LIC_JsonTable,
    LIC_GI,
    LIC_Tracing,
    LIC_COUNT
    } LicensedFeature;
  • total_CPUs - количество ядер процессора, которые может использовать запущенный продукт СУБД Pangolin (в случае отсутствия поля процессам доступны все ядра);

  • total_mem - объем доступной памяти в байтах, которую могут использовать процессы запущенного продукта СУБД Pangolin (в случае отсутствия поля процессам доступна вся память).

Пример файла лицензии:

{
"license" : {
"end_date" : "2023-07-01 12:00:00",
"features" : [ ],
"licensee" : "Pangolin internal tests",
"total_CPUs" : 6,
"total_mem": 3221225472,
"type" : "EnterpriseWith1C"
},
"sign" : "{хеш}"
}
Внимание!

На данный момент возможность расширения типа лицензии дополнительной функциональностью отключена макросом SUPPORT_FEATURE_LICENSING. Поэтому перечисление дополнительной функциональности в секции features не влияет на содержание лицензии.

Ограничение по использованию ресурсов делается на базе механизма контрольных групп (cgroup). Проверка заключается в сопоставлении данных в файле лицензии с ограничениями, используемыми в контрольной группе, где запущен главный процесс postmaster.

Особенности при смене лицензии Enterprise (Trial) на Standard

При изменении типа лицензии:

  • В случае ранее настроенного защитного преобразования данных — данные остаются доступны, но дальнейшее преобразование не осуществляется.

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

  • В рамках обновления продукта с использованием утилиты pg_upgrade каталоги безопасности обновлены не будут.

  • Активная лицензия задается в виде пути к конкретному файлу, и для ее обновления необходимо заменить файл, расположенный по пути, указанному при запуске СУБД.

  • Обновление с версий до 5.3.1 возможно двумя способами:

    • обновление кластера до версии 6.x.x с использованием лицензии Trial -> отключение преобразования -> переход на регулярную версию Standard;
    • обновление кластера до версии 5.3.1 -> отключение преобразования -> обновление до 6.x.x с лицензией Standard.
  • В ОС РЕД ОС использование механизма контрольных групп для приведения сервера к условиям лицензии в части доступных ресурсов не поддерживается.

Добавляемые утилиты

Помимо описанных выше, реализована утилита, подписывающая лицензии, а также утилита, осуществляющая проверку ранее подписанной лицензии - psql_rsa_sign и psql_rsa_verify соответственно.

Утилита подписания в качестве входных параметров принимает файл с приватным ключом для формирования ЭЦП, а также файл, содержащий данные лицензии. Данные на корректность утилитой не проверяются. Дополнительно может быть указан путь для сохранения подписанной лицензии. Если этот параметр не указан, то подпись добавляется во входной файл.

Параметры запуска утилиты подписания:

  • --key, -k <path> - расположение файла, содержащего приватный RSA-ключ (обязательный параметр);
  • --out, -o <path> - расположение подписанного файла лицензии (опциональный параметр, в случае отсутствия подпись будет добавлена ко входному файлу);
  • --version, -V - версия продукта, в составе которой была собрана данная утилита;
  • --help, -? - вывод справки о способах запуска утилиты.

Утилита не входит в состав продукта, хранится в виде исполняемого файла в закрытом репозитории команды СУБД Pangolin.

Утилита проверки подписанной лицензии в качестве входных параметров принимает подписанный файл лицензии. Во время работы утилита проверяет корректность подписанного содержимого лицензии и производит верификацию подписи с прекомпилированным публичным ключом (если ключ не задан явно через параметры запуска). Также производится печать данных файла лицензии в человекочитаемом варианте.

Параметры запуска утилиты верификации:

  • --json, -j - флаг, указывающий о необходимости вывода данных о верификации, а также параметров лицензии в формате JSON (используется для автоматизации установки);
  • --key, -k <path> - расположение файла, содержащего публичный RSA-ключ (в случае отсутствия данного параметра для верификации используется прекомпилированный ключ продукта);
  • --version, -V - версия продукта, в составе которой была собрана данная утилита;
  • --help, -? - вывод справки о способах запуска утилиты.

Утилита верификации входит в состав продукта (RPM) в месте расположения всех исполняемых файлов, а также отдельно дублируется в utilities для возможности проверки типа лицензии перед началом установки с помощью атоматизированных скриптов.

Использование подписанного файла лицензии сервером

Загрузка лицензии

Файл подписанной лицензии располагается на машине установки экземпляра продукта. Переменная окружения PG_LICENSE_PATH задает путь к директории, которая содержит лицензии или путь к конкретному файлу лицензии. Данная переменная окружения используется самим сервером и его утилитами для получения данных об используемой лицензии. По умолчанию используется директория /opt/pangolin_license. В директории единовременно могут находиться несколько лицензий. Модуль загрузки лицензий выбирает лицензию с валидным сроком действия, руководствуясь следующей системой приоритетов по доступной функциональности (от высокого к низкому):

  • Enterprise;
  • EnterpriseWith1C;
  • Trial;
  • StandardWith1C;
  • Standard.

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

Сведения

Лицензия поставляется вместе с дистрибутивом в личном кабинете клиента. В случае ее отсутствия, обратитесь к менеджеру.

Ограничение лицензируемой функциональности под управлением конфигурационного параметра

После успешной загрузки лицензии осуществляется проверка ограничений функциональности, сконфигурированной для запуска, на соответствие типу загруженной лицензии. Функциональность, ограниченная типом лицензии, отключается через параметры конфигурации (если это предусматривает функциональность). В этом случае используется источник параметра PGC_S_OVERRIDE, чтобы параметры не могли быть переопределены после запуска. В логе указывается форсированное отключение такой функциональности, если она была предусмотрена к включению в конфигурации запуска. Предупреждение об отключении функциональности защиты параметров через защищенное хранилище пишется в лог вне зависимости от значения параметра, так как при лицензии типа Standard параметры из защищенного хранилища не считываются, даже при наличии конфигурации подключения.

Ограничение лицензируемой функциональности, не имеющей управляющих параметров

Если функциональность не может быть выключена при запуске СУБД, то проверка возможности исполнения данной функциональности осуществляется в момент исполнения. К такому типу функциональности относятся:

  • нативное интервальное партиционирование;
  • маскирование паролей;
  • квотирование подключений;
  • преобразование пользовательских данных.

Функциональность преобразования данных (TDE) после включения не может быть отключена через параметр конфигурации is_tde_on, из-за наличия преобразований, не только пользовательских данных, но и служебной информации WAL и CHECKPOINT. Поэтому данная лицензируемая функциональность при лицензии Standard и включенном параметре is_tde_on осуществляет преобразование служебной информации, но не пользовательских данных. Параметр конфигурации сервера не переопределяется на старте, однако, в лог пишется предупреждение о невозможности использования преобразованных табличных пространств. На работающем экземпляре продукта проверка доступности данной функциональности должна проверяться с помощью функции мониторинга check_tde_is_on(), а не через прямое чтение параметра конфигурации.

Проверка времени действия лицензии

При запуске основного процесса СУБД создается процесс, контролирующий время жизни лицензии. Данный процесс осуществляет мониторинг текущего времени на предмет соответствия времени действия лицензии. Если время действия лицензии закончилось, производится попытка перечитать лицензию, чтобы загрузить новые данные при обновлении лицензии, после чего процесс мониторинга продолжает штатное функционирование с новыми данными. В противном случае серверу посылается сигнал SIGINT для завершения работы продукта.

Лицензия может быть перезагружена без ожидания окончания времени действия текущей лицензии. Для этого необходимо выполнить перезагрузку (reload) СУБД. Если при обновлении лицензии ее тип изменился на более широкую по функциональности лицензию, то процесс контролирующий время действия лицензии будет использовать новое время для проверки актуальности. Ограничения функциональности будут определяться первоначальной лицензией. Это связано с тем, что большинство параметров конфигурации лицензируемой функциональности могут быть изменены только при запуске продукта. При этом в логе после загрузки новой лицензии будет получено предупреждение о том, что для использования новой лицензии в полном объеме необходима перезагрузка СУБД. В случае, если при обновлении лицензии загружена лицензия с меньшим набором функциональности, продукт будет остановлен автоматически, так как при конфигурации продукта СУБД Pangolin с оркестратором Pangolin Manager последний автоматически перезапустит СУБД с новой лицензией.

Для предотвращения попытки остановить процесс проверки лицензии сигналом SIGSTOP основной процесс отслеживает состояние процесса данной проверки и в случае остановки самостоятельно посылает ему сигнал SIGCONT для возобновления процесса.

Периодическая проверка данным процессом также позволяет отследить ситуацию изменения времени на машине после запуска сервера.

Проверка лицензии в утилитах

Утилиты, подлежащие лицензированию, проверяют данные лицензии при запуске и в случае ограничений выводят соответствующие сообщения.

Агент ротации сертификатов помимо проверки лицензии осуществляет проверку времени действия лицензии в процессе функционирования, по аналогии с процессом проверки в СУБД. Попытка перезагрузки лицензии будет осуществлена при окончании текущей лицензии либо при обработке сигнала SIGHUP.

Функции мониторинга активной лицензии

Функции мониторинга доступны пользователю с расширением psql_license_info. Устанавливать расширение нужно в схему pg_catalog:

CREATE EXTENSION psql_license_info WITH SCHEMA pg_catalog;

К функциям мониторинга относятся:

  • psql_lisense_info() - вывод информации о текущей активной лицензии:

    First_db=# select psql_license_info();
    psql_license_info
    ----------------------------------------------------------
    License Type : Enterprise +
    Licensee : Pangolin Autotests +
    License expiration date : 2123-12-01 13:00:00+03+
    License CPUs number allowed : unlimited +
    License allowed memory in bytes : unlimited +

    (1 row)
  • psql_licensed_features() - вывод информации о доступности лицензируемой функциональности:

    SELECT * FROM psql_licensed_features();

    feature_name | available | pending_restart
    ----------------------------+-----------+-----------------
    Data encryption | t | f
    Auth encryption | t | f
    Data protection | t | f
    Configuration protection | t | f
    Log masking | t | f
    Certificate PKCS12 | t | f
    Performance insights | t | f
    Relations block | t | f
    Object modification date | t | f
    Connection quota | t | f
    OutlineQuery | t | f
    Support 1C | t | f
    Prepared statements | t | f
    Native Partitioning | t | f
    DiagnosticTool | t | f
    Grace Auth | t | f
    Resource Consumption Limits | t | f
    Json Table | t | f
    Global indexes | t | f
    Session tracing | t | f
    Utility psql_set_lsn | t | f
    Fadvise | t | f
    WalRecovery checker | t | f
    Disable audit | f | f
    Disable masking | f | f
    Page compression | t | f
    Set transaction mode | t | f
    Plan cache lru | t | f
    (28 rows)

    Поля таблицы:

    • feature_name - наименование функциональности;
    • available - доступность на старте СУБД (согласно лицензии);
    • pending_restart - флаг, сигнализирующий о том что значение будет изменено после перезапуска согласно обновленной лицензии.

Использование REST-лицензий. Реализация сервера LicAud

В рамках использования REST-лицензий СУБД Pangolin позволяет:

  • использовать централизованное хранилище лицензий из личного кабинета;
  • собирать и анализировать статистики использования ядер продуктом;
  • включать rest-лицензии.

Настройка

Рекомендуемые параметры конфигурации LicAud сервера:

  • 4 ядра;
  • 4Гб ОЗУ;
  • 10Гб Дискового пространства.

В таком случае при 40% нагрузки 1 ядра CPU нагрузочная способность будет составлять 200 запросов/секунду.

Важно

Для работы сервера LicAud требуется наличие пакета Linux glibc >= 2.25.

Далее приведены параметры, которые рекомендуется задавать в качестве аргументов командной строки в *.service-файле при запуске сервиса.

При установке rpm/deb-пакета создается необходимый service-файл, в который позже можно внести изменения. Для целей отладки возможен запуск сервера из командной строки. Для его остановки используется сочетание клавиш Ctrl+C.

--adress
Указывает bind-адрес, на котором будет работать сервер. При указании 0.0.0.0 будут использованы все доступные на момент запуска адреса.
Важно

Временная недоступность интерфейса может потребовать перезапуска сервера для продолжения работы.

Примеры:

  • --address 127.0.0.1;
  • --address localhost;
  • --address 0.0.0.0.
--port
Порт для запросов лицензий и отправки метрик, на котором рекомендуется минимизировать любой внешний трафик, чтобы снизить влияние на скорость работы СУБД.
Важно

Для избежания конфликтов с настройками безопасности ОС рекомендуется использовать port выше 1024.

Примеры:

  • --port 8081 (по умолчанию);
  • --port 12345.
--api-port
Порт для запросов статистики и другой информации с сервера. Работает в отдельном процессе и не оказывает влияния на скорость работы СУБД.
Важно

Для избежания конфликтов с настройками безопасности ОС рекомендуется использовать port выше 1024.

Примеры:

  • --api-port 8082 (по умолчанию);
  • --api-port 23456.
--save-raw-metrics
Опция позволяет генерировать отчет raw_metrics.log по принятым метрикам. Используется для отладки, перезапуск сервера обнуляет содержимое файла.
Важно

При непрерывной работе сервера файл метрик raw_metrics.log достигает значительных размеров, поэтому опция не рекомендуется для постоянного использования.

--uiuser
Имя пользователя, которому разрешено вносить и удалять лицензии, а также смотреть статистику по оперативным данным.

Пример: --uiuser admin (по умолчанию).

--uiauth_password
Пароль для пользователя, заданного опцией --uiuser.

Пример: --auth_password admin (по умолчанию).

--retention_time_hours
Время хранения оперативной статистики до очистки (в часах). Должно составлять не менее 2 часов.

Пример: --retention_time_hours 48.

--stop
Опция позволяет остановить все процессы сервера LicAud.

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

Важно

Параметр --stop останавливает все обнаруженные запущенные объекты сервиса на КТС по имени файла.

Форматы json-лицензий

Лицензии расположены в папке $PG_LICENSE_PATH (/opt/pangolin_license).

  • pure-json: использование продукта без сервера аудита. Представляет собой стандартный файл лицензии Pangolin 6.x.x:

    {
    "license" : {
    "end_date" : "2123-07-01 12:00:00",
    "features" : [],
    "licensee" : "Pangolin internal tests",
    "type" : "EnterpriseWith1C"
    },
    "sign" : "57XUuGvuEXTS7 ... GMgJNz9kxPx=="
    }
  • url-json: Использование продукта с сервером аудита (запрос действующей лицензии с сервера). Представляет собой ссылку на файл лицензии из ЛК (формат pango_license_1) - полный номер лицензии:

    {
    "rest_api_url":"https://10.40.xx.xx:8080/v1/licenses/205979fc-15ec-4903-831f-c126ee71bb8b"
    }
  • url+pubkey json: использование продукта с сервером при изменении сертификата (закрытого ключа) ЛК. Новый pubkey ЛК, заверенный RSA-подписью, в сочетании с URL-ссылкой на файл лицензии::

    {
    "license" : {
    "rest_pubkey" : "0B0A007733...08FA8",
    },
    "sign" : "57XUuGvuEXTS7 ... GMgJNz9kxPx==",
    "rest_api_url":"https://10.40.xx.xx:8080/v1/licenses/205979fc-15ec-4903-831f-c126ee71bb8b"
    }

Механизм soft-fail для работы СУБД Pangolin после окончания действия лицензии

Для обеспечения бесперебойной эксплуатации после окончания действия лицензии, в СУБД Pangolin реализован механизм мягкого выхода за пределы срока действия лицензии – soft-fail. Это позволяет временно продолжать использование СУБД Pangolin с сохранением базовой функциональности без необходимости немедленного обновления лицензии.

При активации механизма soft-fail поведение СУБД Pangolin изменяется следующим образом:

  • При истечении срока действия лицензии сервер продолжает работу, если доступен хотя бы один лицензионный файл, включая просроченные.

  • Если в директории содержится несколько лицензий, выбирается файл с максимально поздним сроком окончания, даже если он в прошлом.

  • Все стандартные ограничения, связанные с окончанием действия лицензии, временно отключаются:

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

    • при каждом запуске сервера;
    • при каждой плановой проверке лицензии.
  • Переключение между лицензиями допускается при условии:

    • новая лицензия должна заканчиваться позже действующей;
    • уровень новой лицензии не ниже текущей (например, нельзя переключиться с Enterprise на Trial).

Предупреждения о состоянии лицензии

Однократное предупреждение при старте

При запуске сервера и компонента обработки лицензий (license check worker) с использованием просроченной лицензии в журнал регистрации единовременно выводится предупреждение следующего формата:

2025-05-07 15:32:08.864 MSK [514892] LOG:  License type is "Trial"
2025-05-07 15:32:08.864 MSK [514892] LOG: Licensee is "Pangolin Autotests"
2025-05-07 15:32:08.864 MSK [514892] LOG: License expiration date is "2000-12-01 13:00:00+03"
2025-05-07 15:32:08.864 MSK [514892] WARNING: License has expired but all featured are still operable. Please check your license as soon as possible!

Периодическое предупреждение при регулярных проверках

Компонент проверки лицензий (license checker worker) регулярно проверяет срок действия текущей лицензии согласно заданному расписанию:

  • для файловых лицензий интервал составляет каждые 60 минут;
  • для лицензий через протокол REST — каждые 30 минут.

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

2025-05-07 15:32:44.946 MSK [514902] WARNING:  License has expired but all featured are still operable. Please check your license as soon as possible!

Дополнительные предупреждения при смене лицензии

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

2025-05-07 15:43:43.760 MSK [514902] WARNING:  Next license check will be at 2025-05-07 15:44:19.760344+03