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

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

Для ознакомления с описанием редакций продукта прочитайте документ «Политика лицензирования продукта СУБД 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 для возможности проверки типа лицензии перед началом установки с помощью атоматизированных скриптов.

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

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

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

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

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

Пример

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

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

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

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

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

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

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

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

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

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

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