Открыт код шифрованной СУБД ZeroDB

2015-12-08

Опубликованы исходные тексты СУБД ZeroDB, предоставляющей средства для end-to-end шифрования хранимых данных. При использовании ZeroDB данные шифруются на стороне клиента и не могут быть раскрыты в случае компрометации сервера, что даёт возможность запускать серверы ZeroDB даже в не заслуживающих доверия окружениях. Код системы написан на языке Python и опубликован под лицензией AGPLv3 (клиент, сервер). В ближайшее время также планируется опубликовать реализацию клиента ZeroDB на языке JavaScript.

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

Особенностью ZeroDB является то, что выборка, в том числе операции поиска и сортировки, выполняется над зашифрованными данными. При том, что логика формирования БД реализуется на стороне клиента и сервер не имеет сведений о структуре и порядке размещения данных. При выполнении запросов к СУБД end-to-end шифрование не требует загрузки всех данных на сторону клиента, не требует использования перешифрующих прокси и не приводит к провалам в производительности из-за применения ресурсоёмких методов шифрования по открытым ключам.

При выполнении запроса клиент взаимодействует с сервером через серию обращений к индексу. Индекс хранится на сервере в зашифрованном виде в формате B-Tree. Клиент имеет возможность обходить узлы индекса, получая только требуемые для выполнения запроса зашифрованные записи. На стороне клиента поддерживается настраиваемый кэш, хранящий наиболее часто используемые части структур данных и позволяющий значительно ускорить выполнение запросов даже при небольшом размере такого кэша (около мегабайта).

Для доступа к данным ZeroDB предоставляет объектно-ориентированный интерфейс на основе ZODB (Zope Object Database), позволяющий сохранять Python-объекты. Запросы также могут формироваться в формате JSON. Из операций над данными поддерживаются Contains, Eq, NotEq, Gt, Lt, Ge, Le, DoesNotContain, Any, NotAny, All, InRange и NotInRange. Система демонстрирует достаточно неплохую производительность, например, операция полнотекстового поиска над зашифрованной базой, содержащией 250-мегабайтный архив списка рассылки разработчиков ядра Linux, занимает 0.5 сек. Время сохранения данных в БД изменяется логарифмически и для вышеуказанного архива запрос на добавление занимает примерно 0.5 сек.