ABAC

Архітектура

Визначення стандарту

На найвищому рівні система оперує правилами, яку групуються в політики, що зв'язують об'єкти та суб'єкти системи розмежування. Запити в систему здійнюються через інформаційну точку (Policy Information Point) в ядро системи (Policy Decision Point), де знійснюєьться обчислення ефективного доступу. Самі правила зберігаються у вбудованій в Erlang/OTP RDBMS mnesia (Policy Administration Point). Фронтальне API визначається як точка виклику (Policy Enforcement Point).

Точки підключення

Типи точок підключення, де здійснюються клієнтські виклики ABAC, визначаються наступним переліком:

BLOCK — Блокування користувача
SEARCH — Пошук документу по полям
VIEW — Видимі елементи: Табулятори, Меню, Помічники, Пошукові кнопки, Чат
CREATE — Створення документів, резолюцій, фільтрів, кнопок
EDIT — Редагування форм, додатків
DELETE — Видалення ділопроцесу певного документа
NEXT — Кнопки управління задачами
REJECT — Кнопки управління повернення
SIGN — Кнопки управління підписом
REGISTER — Реєстрація документів
CANCEL — Кнопка відміна документа
SEND — Кнопка відправки документа
RECEIVE — Отримання документів з асинхронних ендпойнтів
STATUS — Панель управління для виконавців, до відома та помічників

Об'єкти

-record(object_process, { module = [] :: [] | atom(), stage = [] :: [] | list(), status = [] :: [] | atom(), sched = [] :: [] | tuple() }). -record(object_file, { type = [] :: [] | term(), sign = [] :: [] | boolean(), convert = [] :: [] | failed | true | false }). -record(object_form, { id = [] :: [] | atom(), fields = [] :: [] | atom() }). -record(object_corr, { id = [] :: [] | list() | binary(), code = [] :: [] | list() | binary(), sendType = [] :: [] | term(), type = [] :: [] | list() | binary() }). -record(object_email, { id = [] :: [] | list() | binary(), email = [] :: [] | list() | binary(), name = [] :: [] | list() | binary() }). -record(object_employee, { id = [] :: [] | list() | binary(), org = [] :: [] | list() | binary(), branch = [] :: [] | list() | binary(), roles = [] :: [] | list() }).

Суб'єкти

-record(subject_employee, { id = [] :: [] | list() | binary(), roles = [] :: [] | list(atom()), routing = [] :: [] | atom(), substitute_type = [] :: [] | assistant | delegat, status = [] :: [] | atom(), org = [] :: [] | list(), branch = [] :: [] | list() }).

PEP

defmodule ABAC.API do require ABAC def decision(ABAC.request() = r) do :erlang.apply(:"Elixir.ABAC.PDP", :decision, [r]) end def decision(_), do: false end -record(request, { type = [] :: [] | atom(), endpoint = [] :: [] | atom(), subject = [] :: [] | term(), context = [] :: [] | term(), resources = [] :: [] | list() }). -record(context, { form = [] :: [] | tuple(), pid = [] :: [] | list() | binary(), corr = [] :: [] | tuple(), notification = [] :: [] | tuple(), stage_status = [] :: [] | tuple(), files = [] :: [] | tuple(), employee = [] :: [] | tuple() }).

PDP

-record(rule, { id = [] :: binary(), api_endpoint = [] :: atom(), description = <<>> :: binary(), type = auth :: auth | deny, condition = [] :: [] | list(), resource_match = all :: all | any, subject = [] :: [], object = [] :: [] }). -record(policy, { id = [] :: binary(), api_endpoint = [] :: atom(), description = <<>> :: binary(), combining = all :: all | any, object = [] :: [] | tuple(), rules = [] :: [] | list() }).

Приклад

Приклад визначення політики для підпису всіх додатків:

#policy{ api_endpoint = sign, combining = all, object = #object_process{ module = 'Elixir.Output.Proc', stage = #sequenceFlow { source = "Created", target = "Development" }}, rules = [ #rule{ api_endpoint = sign, type = permit, condition = employee_check, resource_match = all, subject = #subject_employee{ roles = [register, executor], routing = [executor], org = Default}, object = #object_process{ module = 'Elixir.Output.Proc', stage = #sequenceFlow{ source = "Created", target = "Development" }}}, #rule{ api_endpoint = sign, type = permit, condition = employee_check, resource_match = any, object = #object_file{sign = true}, subject = #subject_employee{ roles = [register, executor], routing = [executor], org = Default} } ] }