Реализация ABAC в nodejs / реагировать с нуля - PullRequest
5 голосов
/ 08 июля 2019

У меня есть проект, в котором мне нужно внедрить ABAC. Я искал в интернете информацию о том, как ABAC работает именно с точки зрения Nodejs. У меня есть понимание основных концепций ABAC, но я не совсем понимаю, как их успешно реализовать. Я прочитал официальные документы по этому вопросу и попытался изучить некоторые проекты, которые утверждают, что внедрили ABAC, но это не показалось полным или неясным.

Сначала я хочу описать свой проект на высоком уровне, а затем, как я планирую внедрить ABAC в свой проект. Я надеюсь, что кто-то может дать мне руководство по этой теме и определить, является ли способ, которым я хочу внедрить ABAC, хороший, плохой или я что-то упускаю, и ему нужно поработать.

Мой технический стек:

ниже приведены самые важные элементы в моем стеке

  1. reactjs
  2. nodejs
  3. экспресс
  4. MySQL
  5. JSON веб-токены

Мой проект:

Это платформа электронной коммерции, которая позволит пользователям создавать определенные ресурсы, которые можно продавать и / или делиться с другими пользователями в системе. Когда эти ресурсы используются совместно или продаются, тогда ABAC «включится». Проект будет иметь интерфейс, который позволит его конечным пользователям создавать политики ABAC для своих ресурсов. политики будут влиять на других пользователей и организаций, к которым относятся пользователи. Там могут быть тысячи пользователей и сотни тысяч ресурсов.

Моя возможная реализация ABAC:

Итак, первое, что я хочу сделать, это реструктурировать мою базу данных так, чтобы каждый объект и предмет (в данном случае это были пользователи и их ресурсы) будет иметь таблицу только для их атрибутов и таблицу поиска, которая отслеживает, какой объект / субъект имеет какую пару ключ / значение атрибута. Например, если существует таблица users, то будет таблица с ключами атрибутов пользователя и таблица поиска, которая отслеживает, для какого пользователя назначен какой ключ атрибута, и значение этого ключа. Пример:

| userId | attr_key   | attr_val |
|--------|------------|----------|
| 1      | department | sales    |

Мой проект будет иметь пользовательский интерфейс для конечных пользователей для создания политик для своих ресурсов. Пользовательский интерфейс позволит пользователю создать политику, основанную на 4 основных принципах ABAC: субъект, объект, действие и среда (в этом случае «среда» будет временем). В пользовательском интерфейсе каждый из этих принципов будет есть кнопка, что пользователь может добавить атрибут и логический оператор к нему. Когда пользователь завершит создание политики, пользовательский интерфейс сохранит ее в БД MySQL особым образом, чтобы его можно было запрашивать при необходимости применения.

Учитывая то, что я написал выше, я вижу, что ABAC работает таким образом в моем проекте:

  1. Создана политика, которая разрешает или запрещает доступ пользователя к ресурсу (я создам синтаксис политики, который может быть сохранен в БД, который может быть получен позже для интерпретации и расчета)
  2. когда пользователь пытается выполнить действие с ресурсом по определенному маршруту RESTFUL (скажем, он хочет просмотреть / получить), PEP, который я создам, перехватит запрос RESTFUL и извлечет все данные, отправленные в запросе, а затем PEP отправит запрос в PDP, используя данные, извлеченные из запроса, для запроса политики, связанной с пользователем и запрошенным ресурсом.
  3. PDP извлечет политику для этого ресурса и всех атрибутов, связанных с политикой (это будет запрос к PIP для субъекта, объекта и среды), а затем соберет политику.
  4. собранная политика будет вычисляться по данным запроса, текущим атрибутам и значениям, используемым в вычислениях по атрибутам, и будет сгенерировано логическое решение.
  5. логическое решение будет использоваться либо для возврата запрошенного ресурса, либо для возврата причины, по которой ему было отказано в маршруте, инициировавшем запрос.

Итак, во-первых, возможен ли вышеуказанный способ?во-вторых, это практично?И, наконец, что-то отсутствует в парадигме ABAC с моим запланированным внедрением или какие-либо предложения о том, как ее улучшить?

...