Spring Security Access Control Список миллиардов подряд

Реализация решения по безопасности на основе Spring Security Framework, в частности, его ACL-модулей.
В приложении миллионы доменных объектов и несколько сотен пользователей.

При использовании модуля Spring Security Acl запись в acl_sid и других связанных таблицах увеличивается до десятков миллиардов, что влияет на производительность приложения.

Хотелось бы узнать лучшую практику для обработки таких сценариев.

Есть ли альтернативная структура безопасности, которая эффективно справляется с подобной ситуацией?

1 ответ

Есть несколько структур, которые делают управление доступом более управляемым.

Прежде всего, ACL-списки хороши и просты в настройке, но они плохо масштабируются.

Вариант № 1: Управление доступом на основе ролей (RBAC)

RBAC - это хорошо известная модель, определенная NIST в 1992 году. Многие приложения и платформы реализуют модель RBAC. В RBAC вы предоставляете пользователям набор ролей, и каждая роль имеет набор разрешений. Как следствие, пользователи наследуют эти разрешения. Например, вы можете иметь роль менеджера с разрешением просматривать все транзакции.

Spring Security, Apache Shiro, JAAS и многие другие фреймворки (с открытым исходным кодом, коммерческие...) реализуют RBAC.

Вариант № 2: Управление доступом на основе атрибутов (ABAC)

Иногда RBAC недостаточно. В частности, когда вы хотите использовать контекст или отношения. Например, в RBAC сложно реализовать роли и разрешения, которые бы обрабатывали следующее:

Менеджеры могут просматривать транзакции в своем собственном отделе

Для этого вы должны использовать ABAC. Вы должны определить атрибут роли, атрибут отдела пользователя и атрибут отдела транзакций. Затем вы должны объединить атрибуты вместе в политике:

Пользователь с ролью ==manager может выполнить действие =='просмотреть транзакцию', если user.department== транзакция.department

XACML - реализация ABAC

XACML, расширяемый язык разметки контроля доступа, является стандартом, определенным OASIS, и все чаще используется для реализации сложных задач авторизации. Есть несколько реализаций сегодня:

Как RBAC и ABAC уменьшают бремя управления?

В списках контроля доступа у вас есть список для каждого элемента, который вы хотите защитить, и вы должны вставить идентификационные данные пользователей в эти списки. Вы также можете добавить данные о действиях, чтобы получить:

  • Элемент № 1 ACL
    • Алиса, читай
    • Алиса, пиши
    • Боб, читай
    • Кэрол, читай
  • Элемент № 2
    • ...

Если у вас 1 миллион элементов и 10000 пользователей, у вас есть потенциальная возможность 1 миллиона x 10k x 3 действий (чтение, запись, удаление) = всего 30 миллиардов строк. Это равносильно управленческому кошмару, но также может привести к проблемам с производительностью.

Теперь идея с RBAC была немного упростить это. Вместо того, чтобы назначать пользователей элементам в ACL, мы используем роли и разрешения в качестве уровня косвенности. Так что Алиса будет редактором. Боб и Кэрол будут зрителями. Ваши ACL теперь стали проще:

  • Элемент № 1
    • Редактор, читай
    • Редактор, редактировать
    • Читатель, читай

Список становится все меньше. И все же у RBAC все еще есть несколько проблем. У этого все еще должен быть ACL на объект. Если у вас есть миллион объектов, у вас все еще будет несколько миллионов строк (все же лучше, чем 30 миллиардов).

С ABAC вы решаете использовать атрибуты объекта, например, отдел или классификацию. У объектов больше нет ACL, и вы в конечном итоге пишете политики, которые используют эти атрибуты. Это делает количество политик меньшим (как правило, сотнями).

Благодаря атрибутам ABAC масштабируется лучше.

Другие вопросы по тегам