Библиотека авторизации c поддержкой RBAC
В нашем проекте для KFC мы используем микросервисную архитектуру с компонентами, написанными на разных языках программирования и в различных средах выполнения, таких как .NET, Ruby и Go. Многие из этих компонентов должны принимать решения на основе статуса авторизации пользователей: кто они, к каким ролям относятся, какие действия могут выполнять и для чего?
Нам нужен был способ использования RBAC, совместимый с несколькими независимыми языками и фреймворками, к тому же требовалось
Обычно при разработке приложений с общими фреймворками на таких языках, как Ruby, Python, PHP или Go, управление доступом на основе ролей входит в состав фреймворка или поставляется в виде библиотеки, что позволяет его легко использовать. Но это не сработает, если приложение разрабатывается как часть крупной системы, которая не всегда использует один язык программирования, тем более одни и те же фреймворки.
Мы начали изучать возможные варианты. Один из подходов — использование централизованной службы, такой как брокер Keycloak, который позволяет управлять авторизацией для всех микросервисов. Но централизованный брокер становится единой точкой отказа и потенциально узким местом — это явный недостаток, особенно для высоконагруженных систем.
Поэтому мы решили рассмотреть децентрализованные подходы и, в частности, найти способ представления и обработки списков контроля доступа, который был бы универсальным и работал для разных языков программирования. Так мы нашли Casbin,
У нас уже была реализация RBAC, но существовала одна загвоздка: нам требовалась реализация для Ruby, а Casbin ещё не была портирована на него. Мы решили сделать это сами и в результате получили
Как это работает?
Если коротко — каждый микросервис имеет доступ к двум файлам, которые распределены по системе. Первый содержит список пользователей, групп, ролей и тому подобное — он определяет принципы авторизации. Второй содержит соответствия между участниками, по сути — это слияние всех ACL, используемых системой.
Таким образом мы решили основную часть нашей задачи — получили децентрализованное (или распределённое) управление пользователями, их ролями и тем, что они могут делать.
Casbin позволяет:
- применять политику в классической форме
{subject, object, action}
или в той, которую вы сами определяете. Можно как разрешить, так и запретить авторизацию; - обрабатывать хранилище модели контроля доступа и её политику;
- управлять маппингом ролей и пользователей, а также сопоставлением ролей друг с другом, то есть иерархией ролей в RBAC.
- поддерживать встроенного суперпользователя, такого, как
root
илиadministrator
. Суперпользователь может без явных разрешений делать что угодно; - использовать несколько встроенных операторов для поддержки сопоставления правил. Например,
keyMatch
может сопоставить ключ ресурса/foo/bar
с шаблоном/foo*
.
Casbin не позволяет:
- выполнять аутентификацию (проверку имени пользователя и пароля при входе пользователя в систему);
- управлять списком пользователей или ролей. Этими сущностями удобнее управлять в самом проекте. Однако Casbin хранит соответствия между пользователями и ролями для сценария RBAC.
Установка Casbin-ruby
Последняя версия:
gem 'casbin-ruby', github: 'CasbinRuby/casbin-ruby'
Конкретная версия:
gem 'casbin-ruby', '1.0.5'
Что дальше?
Нам потребовалось около месяца на разработку
Сейчас от разработки базовой реализации Ruby мы переходим к написанию хранилищ и менеджеров оповещений. Мы планируем разработать интеграцию в существующие менеджеры ролей, а также собираемся добавить поддержку для различных фреймворков Ruby: Ruby on Rails, Hanami и Roda.
Библиотека