Задача импортозамещения ПО, поставленная руководством страны, постепенно решается, о чем свидетельствует постоянно расширяющийся реестр российского софта. Существенные трудности возникают, когда требуется заместить проприетарные платформенные решения, такие как СУБД, на разработку и развитие которых западные вендоры потратили годы труда и массу финансовых ресурсов. Вряд ли найдется отечественный разработчик, способный создать подобный продукт с нуля, но задача заметно упрощается, если имеется достаточно зрелое решение с открытым исходным кодом, на основе которого можно строить собственные коммерческие продукты. К счастью, в случае реляционных СУБД такое решение есть: оно развивается и поддерживается в рамках открытого проекта PostgreSQL. Одним из коммерческих решений на его базе стала СУБД Jatoba, выпущенная в прошлом году компанией «Газинформсервис».

По словам руководителя разработки ПО компании «Газинформсервис» Дениса Рожкова, многие заказчики, использовавшие западные коммерческие СУБД, уже давно по тем или иным причинам ставили вопрос об их замене. В качестве альтернативы рассматривались как исходная (так называемая ванильная) версия PostgreSQL с открытым кодом, так и коммерческие форки. Как оказалось, все они не в полной мере соответствовали требованиям корпоративного уровня, предъявляемым крупными заказчиками, по обеспечению отказоустойчивости и оказанию полноценного оперативного сервиса на площадках, расположенных в разных, достаточно удаленных регионах. Поэтому было принято решение о разработке собственной СУБД.

Коммерческие версии СУБД (и Jatoba в частности) отличаются от ванильной PostgreSQL расширениями и дополнениями, которые либо важны для тех или иных приложений, либо обусловлены нормативными требованиями, налагаемыми на определенные группы заказчиков. К примеру, в настоящее время в компании «Газинформсервис» ведется разработка набора расширений, обеспечивающих совместимость с бизнес-приложениями «1С». Кроме того, в СУБД Jatoba реализованы поддержка расширенных парольных политик и возможность ограничения доступа администратора СУБД к определённым защищаемым данным. В продукт включен ряд системных утилит для управления кластером (JaManager), для балансировки нагрузки (JaPool) и анализа аспектов безопасности СУБД (Jatoba Data Safe).

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

Все современные СУБД в той или иной мере поддерживают хранимые процедуры и функции, написанные на расширениях языка SQL, включающих логические конструкции языков высокого уровня и исполняемые непосредственно сервером БД. В частности, в PostgreSQL такими языками могут быть PL/pgSQL, PL/Tcl, PL/Perl, PL/PerlU, PL/Python. Все они поддерживаются и в СУБД Jatoba. У хранимых процедур есть множество достоинств: они позволяют повысить производительность приложений (в том числе и за счет сокращения обмена информацией между клиентом и сервером), расширяют возможности программирования сложной логики и поддерживают функции безопасности данных, ограничивая или вовсе исключая не регламентируемый непосредственный доступ пользователей к таблицам БД.

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

Почему нужно скрывать текст процедур? Почти каждое коммерческое приложение содержит информацию, которую хотелось бы защитить от просмотра и тем более от изменения логики ее обработки без согласования с автором программного обеспечения. В коде хранимых процедур могут содержаться определённые ноу-хау самого продукта или способы его лицензионной защиты, реализованы механизмы ограничения доступа к данным с использованием ролевой модели и т. д. Определенные возможности такого рода могут обеспечиваться базовой версией PostgreSQL, но они весьма ограничены и нуждаются в расширении. Например, ограничение видимости данных можно реализовывать и с помощью технологий row level security и через собственную логику доступа к данным на уровне кода процедур и функций.

В PostgreSQL информацию об исходном коде процедуры можно получить с помощью стандартных инструментов из системных представлений базы данных. Здесь одним из вариантов ограничения доступа к тексту процедуры может служить тонкая настройка прав доступа к системным представлениям (view). Но в PostgreSQL сделать это для пользователей superuser невозможно, так как пользователь с этой ролью имеет доступ ко всем БД и всем объектам всех БД.

Созданная разработчиками компании «Газинформсервис» программа wrap преобразует ASCII-текст исходного кода в нечитаемую форму, которую можно передавать пользователям, в территориально удалённые филиалы и т. д. для последующего сохранения соответствующих процедур и функций в других экземплярах базы данных. Код характеризуется такой же переносимостью, что и исходный код pgsql, и может импортироваться, и экспортироваться. СУБД Jatoba поддерживает зависимости для программ со скрытым кодом точно так же, как для программ с обычным кодом. Иначе говоря, скрытые программы в базе данных с функциональной точки зрения ничем не отличаются от обычных программ на pgsql; единственное различие заключается в том, что их текст в исходном виде нельзя прочитать через представление pg_proc.

С исходным кодом процедур и функций на языке pgsql программисты работают в удобном для них режиме без использования механизмов скрытия. Подготовку кода к поставке или сборке релиза необходимо проводить в среде СУБД Jatoba, оснащенной утилитами преобразования кода pgsql. С их помощью создается файл, где текст представляет собой нечитаемый набор символов и не подлежит изменению. Затем дистрибутив с преобразованными файлами передаётся службе эксплуатации заказчика для установки в промышленную среду. Файлы могут быть скомпилированы в СУБД Jatoba без раскрытия их исходного текста. На этапе эксплуатации после компиляции текст файла хранится в СУБД в преобразованном виде и не подлежит изменению, но полностью сохраняет работоспособность и соответствует изначальной логике разработчика.

Основным инструментом для скрытия кода является созданная в компании «Газинформсервис» утилита wplpgsql, которая работает только в среде СУБД Jatoba. Утилита имеет модульную архитектуру, причем механизмы преобразования текстов процедур и функций могут быть различными, они подключаются к утилите как модули расширения. Основное условие, предъявляемое к механизмам преобразования, — использование обратимых алгоритмов, поскольку на этапе установки в среде эксплуатации утилита после обратного преобразования текста производит валидацию синтаксиса. Утилита wplpgsql способна преобразовывать файлы в пакетном режиме, оставляя неизменными их имена, но сохраняя преобразованные файлы в другом целевом каталоге, повторяющем структуру исходного вместе со всеми подкаталогами.

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

В настоящее время поддерживается сокрытие исходных кодов только на языке pgplsql. Скрытый код не может компилироваться в экземплярах СУБД отличных от Jatoba, иными словами в опенсорсной версии PostgreSQL эта функция не поддерживается.

В то же время в компании «Газинформсервис» постоянно отслеживаются все новации, вносимые в открытую PostgreSQL, которые после их тщательной проверки включаются в состав СУБД Jatoba.

СПЕЦПРОЕКТ КОМПАНИИ «ГАЗИНФОРМСЕРВИС»