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, и все чаще используется для реализации сложных задач авторизации. Есть несколько реализаций сегодня:
- Открытый исходный код
- SunXACML
- WSO2
- коммерческий
Как RBAC и ABAC уменьшают бремя управления?
В списках контроля доступа у вас есть список для каждого элемента, который вы хотите защитить, и вы должны вставить идентификационные данные пользователей в эти списки. Вы также можете добавить данные о действиях, чтобы получить:
- Элемент № 1 ACL
- Алиса, читай
- Алиса, пиши
- Боб, читай
- Кэрол, читай
- Элемент № 2
- ...
Если у вас 1 миллион элементов и 10000 пользователей, у вас есть потенциальная возможность 1 миллиона x 10k x 3 действий (чтение, запись, удаление) = всего 30 миллиардов строк. Это равносильно управленческому кошмару, но также может привести к проблемам с производительностью.
Теперь идея с RBAC была немного упростить это. Вместо того, чтобы назначать пользователей элементам в ACL, мы используем роли и разрешения в качестве уровня косвенности. Так что Алиса будет редактором. Боб и Кэрол будут зрителями. Ваши ACL теперь стали проще:
- Элемент № 1
- Редактор, читай
- Редактор, редактировать
- Читатель, читай
Список становится все меньше. И все же у RBAC все еще есть несколько проблем. У этого все еще должен быть ACL на объект. Если у вас есть миллион объектов, у вас все еще будет несколько миллионов строк (все же лучше, чем 30 миллиардов).
С ABAC вы решаете использовать атрибуты объекта, например, отдел или классификацию. У объектов больше нет ACL, и вы в конечном итоге пишете политики, которые используют эти атрибуты. Это делает количество политик меньшим (как правило, сотнями).
Благодаря атрибутам ABAC масштабируется лучше.