Вопрос или проблема
Похоже, что в RBAC субъект создает сессию с активной ролью(ями), которые затем используются для определения прав и действий, которые могут быть выполнены. Это, похоже, подходит большинству нашей организации, пока не дойдете до субъектов с ролью клиента. Клиенты должны иметь возможность читать только то, что они владеют, в отличие от других ролей, которые могут иметь права чтения/записи (или другие действия) на объекты одного и того же типа.
Я не уверен, как лучше всего реализовать это с использованием RBAC. Должна ли сессия также содержать субъект? Несколько ссылок предполагают, что нет.
Примечание: возможно, я слишком пуристичен, но я проверяю, что могу упустить. Я рассматривал вариант с PostgreSQL, где пользователь является ролью, а активная роль в сессии — это пользователь. Каковы мои варианты ограничения роли только для просмотра объектов не по типу, а по праву собственности?
Вы сталкиваетесь с ограничениями RBAC. В дополнение к учету возможностей, как предложил Авраам Мавридис, рассмотрите возможность использования контроля доступа на основе атрибутов (ABAC), который расширяет возможности RBAC, включая дополнительные атрибуты (метаданные), такие как атрибуты пользователя (местоположение, допускаемость, гражданство) и метаданные ресурсов (классификация, право собственности…).
XACML — это стандарт OASIS, реализующий ABAC. С помощью XACML вы можете легко написать правило о взаимосвязи, которое говорит:
- доступ к ресурсу разрешен только в том случае, если идентификатор запрашивающего равен идентификатору владельца.
Еще лучше, вы можете переписать правило в отрицательной форме, так как быть владельцем может быть недостаточно для доступа к ресурсу, но не будучи владельцем, достаточно для отказа в доступе:
- отказать в доступе к ресурсу, если идентификатор запрашивающего не равен идентификатору владельца.
Я думаю, это можно реализовать с использованием возможностей. Каждый субъект имеет набор пар (O, R)
, где O
— это объект, а R
— это права. Например, если Customer1
может читать file1
, и читать и записывать file2
, у вас может быть такой список возможностей:
Customer1={
(file1, { read }),
(file2, { read, write })
}
Если у многих клиентов есть одни и те же права, вы можете использовать группы, чтобы ограничить объем хранилища, используемого для сохранения этой информации.
Но затем вы должны быть уверены, что субъекты не могут модифицировать список возможностей.
Что вы можете сделать, так это определить контейнер определенного типа; назначить подмножество его объектов с правами, равными уровню доступа/разрешения субъекта. Звучит тривиально, но я знаю, что это работает. Это можно визуализировать в виде матрицы контроля доступа; другая роль при попытке доступа к объекту другого уровня доверия получит ошибку разрешения.
Смотрите это
https://www.owasp.org/images/d/d5/Acm.png
или лучше найдите матрицу контроля доступа OWASP в Google.
Для консистентности в системе RBAC все ресурсы должны содержать информацию о праве собственности. Объект состояния сессии обычно содержит информацию, используемую для обеспечения правил контроля доступа. Сессии создаются (или модифицируются) при аутентификации и деаутентификации. Правила, определяющие, кто имеет право аутентифицироваться и к каким ресурсам у них есть доступ, контролируются суперпользователем. Логично думать, что все сессии могут быть изменены только системой на основе намерений суперпользователя. Обычный пользователь никогда не должен иметь возможность изменять состояние сессии и изменять первичный ключ своей учетной записи пользователя.
Теперь давайте рассмотрим сценарий. Сотрудник в данный момент вошел в систему. Его увольняют руководство. Суперпользователь удаляет эту учетную запись, и его состояние сессии должно быть немедленно уничтожено, а его привилегии должны быть отозваны. Суперпользователь владеет объектом сессии и уничтожает его по запросу. Пользователь не контролирует, когда он вошел в систему; если бы это было так, он мог бы повредить другие данные, принадлежащие данной учетной записи пользователя.
Ответ или решение
Чтобы обеспечить, чтобы Субьект (пользователь) мог только читать и изменять свои собственные объекты в рамках модели контроля доступа на основе ролей (RBAC), необходимо учитывать архитектуру доступа и механизмы управления, которые обеспечивают такую функциональность.
Проблема
В вашем случае пользователи с ролью «Клиент» должны иметь доступ только к тем объектам, которые они владеют. Стандартные механизмы RBAC могут оказаться недостаточными, поскольку они часто не учитывают атрибуты объектов или не позволяют granular control по сравнению с правами доступа до уровня владения.
Решения
-
Использование атрибутно-ориентированного контроля доступа (ABAC):
- Рассмотрите возможность внедрения ABAC, который расширяет RBAC за счет использования дополнительных атрибутов, таких как идентификатор владельца ресурса.
- Например, с использованием спецификации XACML можно задать правила, которые выглядели бы следующим образом:
- Правило 1: доступ к ресурсу разрешен только в случае, если
ID_запрашивающего = ID_владельца
. - Правило 2: доступ к ресурсу запрещен, если
ID_запрашивающего ≠ ID_владельца
.
- Правило 1: доступ к ресурсу разрешен только в случае, если
-
Использование возможностей (Capabilities):
- Можете рассмотреть возможность внедрения модели управления доступа через возможности, где для каждого Субъекта существует список пар
(Объект, Права)
. - Например:
Клиент1 = { (файл1, {чтение}), (файл2, {чтение, запись}) }
- Это обеспечит гибкость и позволит четко указать права доступа для каждого объекта.
- Можете рассмотреть возможность внедрения модели управления доступа через возможности, где для каждого Субъекта существует список пар
-
Структура контейнера:
- Определите контейнер (например, категорию), в котором объекты с определенными правами будут ассоциироваться с ролями Субъектов.
- Это обеспечит централизованный контроль, и при попытке доступа к объектам с другими уровнями доверия можно будет выдавать ошибку доступа.
-
Информирование системы о владении:
- Убедитесь, что все ресурсы содержат информацию о владельце. В состоянии сессии храните данные, необходимые для применения правил доступа.
- Установите, что сессии создаются и модифицируются системой, согласно политике доступа, установленной управляющим (Super User).
-
Мониторинг и аудит сессий:
- Обеспечьте мониторинг сессий и ведение журналов доступа для анализа использования и обнаружения возможных нарушений. Это важно как с точки зрения безопасности, так и compliance.
Заключение
Каждое из предложенных решений может использоваться в комбинации, чтобы создать гибкую и надежную систему контроля доступа, которая позволит удовлетворить требования вашей организации. Переход к ABAC или использование возможностей (Capabilities) может потребовать значительных изменений в архитектуре, однако они также откроют дополнительные возможности и обеспечат большую безопасность.