Thunderclap — это индексированная пара ключ-значение на этапе альфа-тестирования, JSON-документ и функционально-ориентированная база данных и библиотека приложений, разработанная специально для Cloudflare. Он работает в Cloudflare Workers поверх магазина Cloudflare KV и имеет клиент на основе браузера. Его язык запросов JOQULAR (JavaScript Object Query Language) подобен, но более обширен, чем язык запросов, связанный с MongoDB.
Одной из ключевых особенностей Thunderclap является мощный, гибкий, декларативный механизм детального управления доступом (FGAC), который можно использовать для решения многих современных проблем политики конфиденциальности. В этой статье описывается, как достигается этот детальный контроль доступа. Однако принципы, изложенные в статье, также могут быть применены к MongoDB с прокси-сервером обработки, размещенным между MongoDB и приложением, использующим его данные; таким образом, снимая с приложения ответственность за безопасность, упрощая логику, повышая отказоустойчивость и улучшая возможность аудита.
Определен детальный контроль доступа
Для JavaScript детальное управление доступом выходит за рамки коллекций или классов объектов. Он включает в себя применение контроля доступа на основе имен свойств, диапазонов имен свойств, наличия имен свойств, типа и значения данных, хранящихся в свойствах, и контекстной информации, такой как запрос IP-адреса. Для хранилищ данных типа "ключ-значение" это включает применение политик на основе имен ключей или типа и значения данных, связанных с ключами. Для платформ, поддерживающих удаленный вызов функций, это также подразумевает управление выполнением функции по имени или конечной точке.
Состояние отрасли
В настоящее время Accumulo является самой цитируемой базой данных No-SQL, поддерживающей любой тип детального контроля доступа. Однако сложный контроль доступа на уровне элементов данных также доступен в Firebase Google. На момент написания этой статьи MongoDB не имеет встроенной поддержки мелкозернистого контроля доступа. Microsoft Cosmos находится где-то между Firebase и MongoDB. С точки зрения возможностей Firebase ближе всего к Thunderclap.
Для получения дополнительной информации по этой теме выполните поиск по запросу «мелкозернистый контроль доступа NoSQL». Для быстрого ознакомления вот несколько ссылок:
- Точный контроль доступа в документо-ориентированных хранилищах данных NoSQL
- К базам данных мультивселенной
- Улучшение MongoDB с помощью мелкозернистого контекстно-зависимого управления доступом
Удар грома
Механизмы безопасности Thunderclap поддерживают применение правил доступа на чтение и запись на основе ролей для функций, объектов, свойств и ключей хранения.
Если пользователю не разрешен доступ на чтение к объекту или значению ключа, он не будет возвращен. Если у пользователя нет авторизованного доступа к определенному свойству, это свойство будет удалено из объекта до того, как объект будет возвращен. Кроме того, запрос объекта с использованием свойств, к которым у пользователя нет доступа, автоматически исключает свойства из процесса поиска в индексе, чтобы предотвратить утечку данных в результате логического вывода.
Если пользователю не разрешен доступ на запись к определенным свойствам объекта, попытки обновления будут возвращаться к частичному обновлению только тех свойств, для которых разрешен доступ на запись. Если доступ для записи к ключу или ко всему объекту запрещен, запись просто завершится ошибкой и будет возвращено значение `undefined`.
Удар грома Архитектура
Одной из ключевых особенностей JavaScript и документов JavaScript является то, что они интерпретируются или компилируются во время выполнения, что упрощает:
- проверять имена свойств как строки
- сопоставить структуру одного объекта с другим
- сравнить типы значений
- изменять поведение и структуру во время выполнения
Thunderclap использует вышеизложенное, используя правила управления доступом со спецификациями, которые точно соответствуют структуре контролируемых данных, а также обеспечивают более обобщенное сопоставление с использованием функций или регулярных выражений. Эти правила управления доступом хранятся в специальном файле acl.js
, который содержит один объект JavaScript, как описано ниже.
Thunderclap объединяет содержимое файла acl.js
с определениями ролей, указанными в roles.js
, которые иерархически сопоставляют роли, такие как dbo
(оператор базы данных), user
, или другие роли, специфичные для приложения.
User
— это встроенный класс для Thunderclap, который содержит свойство для прикрепления самих ролей к экземплярам. Это также описано далее в статье.
ACL-файл Thunderclap
Входной набор правил ACL Thunderclap представлен в виде объекта JavaScript. По соображениям безопасности этот объект включается во время сборки как файл JavaScript, а не загружается во время выполнения как файл JSON. Это также позволяет языку ACL использовать функции и сокращенные инициализированные имена ключей, представляющие регулярные выражения, которые обычно не могут быть загружены при использовании JSON.
Я привожу Thunderclapacl.js
по умолчанию в качестве примера и далее объясняю его структуру.
Объект JSON в acl.js
состоит из набора свойств, используемых для поиска правил. К свойствам верхнего уровня относятся:
- обычные выражения
- названия функций,
- имена ключей для базового хранилища ключ-значение,
- имена классов, за которыми следует знак
@
,
Непосредственно под каждым ключом находятся read/write/execute
спецификаций, которые относятся к управляемому ключу в целом. Для ключей, указывающих на объекты, также есть специальное свойство properties
. Он содержит имена свойств, которые должны быть параллельны возможным именам свойств в контролируемом объекте и содержать вложенные спецификации управления доступом.
Спецификации read/write/execute
— это имена свойств read
, write
, execute
, за которыми следует либо массив имен ролей, либо карта имен ролей с true
в качестве каждого из их значений, либо функция, определяющая, следует ли разрешить чтение, запись или выполнение на основе фактический характер данных, текущий пользователь и контекст выполнения. Также может быть специальный ключ, filter,
который имеет функцию в качестве аргумента. Фактически это подстановочный знак, управляющий доступом для чтения, записи и выполнения.
Функции ACL имеют сигнатуру async function({action, user, data, object, request})
. action
может быть одним из read
, write
, execute
. user
— это пользовательский экземпляр, из которого можно извлечь свойство userName
или roles
. data
— это фактические контролируемые данные. Когда объект находится под контролем, для удобства также используется псевдоним object
. И request
— это объект HTTP-запроса, который можно использовать для ограничения доступа на основе таких вещей, как запрос IP-адреса. Если целевые данные являются объектом, функции ACL могут изменять его перед возвратом. Если возвращается истинное значение, обработка продолжается; в противном случае Thunderclap вернет запрашивающему клиенту ошибку доступа HTTP 401.
Всякий раз, когда предпринимается попытка чтения/записи ключа или объекта и его свойств или выполнения функции, предоставляемой клиентам, Thunderclap просматривает спецификации ACL, чтобы определить, существует ли соответствующее правило, основанное на имени функции, ключа или класса. доступ. Если есть, оцениваются спецификации верхнего уровня. Если это удается, то для объектов оцениваются спецификации уровня свойства.
Если нет соответствующего правила ACL, Thunderclap предполагает, что доступ доступен ко всем функциям и данным. Чтобы что-то контролировать, должно быть соответствующее правило. В результате в acl.js
есть некоторые правила по умолчанию для предотвращения определенных видов деятельности, например. прямой доступ к индексу кем-либо, кроме dbo
.
Файл ролей Thunderclap
Thunderclap поддерживает произвольное количество иерархических ролей. Имена ограничены теми, которые являются допустимыми именами свойств JavaScript. Роли указаны в файле с именем roles.js.
Thunderclap имеет только две встроенные роли, dbo
и user
. Файл по умолчанию ниже:
Чтобы сделать одну роль подролью другой, просто укажите ее в качестве ключа внутри другой роли.
Пользовательский объект Thunderclap
Thunderclap имеет встроенный класс User
class. У него всего два встроенных свойства: userName
и roles
. Другие свойства можно добавить, передав объект конфигурации при создании пользователя, например:
const user = new User("jjones",{age: 27});
приведет к объекту:
{ userName: "jjones", roles: { user: true }, age: 27 }
Объект конфигурации также можно использовать для передачи дополнительных ролей, например:
const user = new User("jjones",{age: 27,roles:{dbo:true});
{ userName: "jjones", roles: { user: true, dbo: true }, age: 27 }
Обратите внимание, что указанный выше пользователь не может быть вставлен в базу данных Thunderclap кем-либо, кроме другого пользователя с ролью dbo
.
Свойства и роли могут использоваться правилами ACL для управления доступом к данным или выполнением функций на сервере.
Вывод
Надеюсь, вам было интересно это краткое введение в модель управления доступом Thunderclap. Как минимум, возможно, вы увидите, как можно упростить свои приложения MongoDB, применив аналогичный подход к MongoDB с перезаписью запросов или фильтрацией результатов. В идеале, вы найдете его достаточно интригующим, чтобы похлопать в ладоши и взглянуть на Thunderclap для Cloudflare.