Статьи

Контроль доступа на основе выражений

1. Обзор

Сегодня мы рассмотрим различия между управлением доступом на основе выражений (EBAC), управлением доступом на основе ролей (RBAC) и управлением доступом на основе атрибутов (ABAC), с более глубоким акцентом на EBAC.

2. Что такое контроль доступа на основе выражений?

Проще говоря, управление доступом на основе выражений — это использование выражений для написания авторизации.

Фраза Управление доступом на основе выражений (EBAC) в настоящее время чаще всего ассоциируется с использованием выражений Spring Expression Language для авторизации записи.

Именно в Spring Security 3.0 появилась возможность использовать выражения Spring EL в качестве механизма авторизации в дополнение к простому использованию атрибутов конфигурации и избирателей, принимающих решения о доступе.

Однако использование выражений для контроля доступа не ограничивается только Spring Security! Этот пост в блоге частично является просьбой к большему сообществу признать использование выражений в авторизации как контроль доступа на основе выражений (EBAC), поскольку он уникально отличается от других форм контроля доступа благодаря своей способности позволять вам реализовывать другие формы контроля доступа, такие как RBAC и ABAC.

Другие примеры EBAC включают выражения контроля доступа (ACE) в MapR и динамическое управление доступом в Windows . Там могут быть и другие, такие как PHP Framework Symfony .

Эквивалентное управление доступом (EBAC) эквивалентно управлению доступом на основе атрибутов (ABAC)?

Нет, но ABAC можно реализовать с помощью EBAC.

Вот определение ABAC высокого уровня согласно Специальной публикации NIST 800-162 :

Метод управления доступом, при котором запросы субъекта на выполнение операций над объектами предоставляются или отклоняются на основе назначенных атрибутов субъекта, назначенных атрибутов объекта, условий среды и набора политик, которые указаны в терминах этих атрибутов и условий.

Имея это в виду, мы могли бы написать свой собственный, используя язык выражений, например выражения на основе Spring Expression Language, которые затем можно вызывать с существующими тегами @PreAuthorize , @PostAuthorize , @PreFilter и @PostFiler , sec: authorize и даже из intercept условия

Является ли управление доступом на основе выражений (EBAC) эквивалентным управлением доступом на основе ролей (RBAC)?

Нет, EBAC не эквивалентен RBAC, но RBAC встроен в некоторые языки выражений, такие как Spring EL. Например, есть два общих выражения, которые позволяют нам легко реализовать RBAC:

  • hasRole ([роль])
  • hasAnyRole ([роль1, роль2])

Однако при написании детализированных правил авторизации мы легко начинаем писать выражения, превосходящие уровень детализации RBAC.

3. Выражения веб-безопасности

Реализации EBAC, такие как Spring Security, позволяют нам защищать URL-адреса. Выражения должны иметь значение true или false, определяя, предоставляется ли доступ. Пример ограничения доступа в приложении RESTful на основе идентификатора пользователя в конфигурации Java:

1
2
3
4
http
.authorizeRequests()
.antMatchers("/user/{userId}/**").access("@webSecurity.checkUserId(authentication,#userId)")
...

4. Метод выражения безопасности

Безопасность метода сложнее, чем разрешить или запретить.

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

@PreAuthorize , наиболее часто используемый, решает, может ли метод быть вызван на самом деле или нет.

@PostAuthorize , необычно используемая аннотация, выполняет проверку контроля доступа после вызова метода.

С помощью @PostFilter Spring Security выполняет итерацию по возвращенной коллекции и удаляет все элементы, для которых предоставленное выражение является ложным.

@PreFilter позволяет нам фильтровать перед вызовом метода, но он используется реже.

Ниже приведен пример объединения PreAuthorize с @PostFilter для более детальной защиты:

1
2
3
@PreAuthorize("hasRole('USER')")
@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, 'admin')")
public List<contact> getAll();

5. Когда использовать экспресс-контроль доступа (EBAC)?

Если необходимая нам безопасность требует большей детализации, чем простые списки контроля доступа (ACL), тогда нам нужно использовать EBAC. То, как мы решаем внедрить EBAC, зависит от того, какие ресурсы у нас есть. Например, в организации, которая использует Spring Security, почему бы не использовать их Spring EL? Аналогично, если бы у нас был MapR, мы бы использовали их выражения контроля доступа.

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

6. Заключение

Различное программное обеспечение поставляется с возможностью написания авторизации с использованием выражений, таких как MapR, Windows и, конечно, Spring Security. Если детальное управление доступом может быть выполнено с использованием выражений, я называю его — и предлагаю вам обратиться к нему — как управление доступом на основе выражений (EBAC). Дав ему имя, мы с большей вероятностью используем его для защиты наших систем по сравнению с традиционным RBAC. Это хорошо, потому что детальный контроль доступа, если все сделано правильно, с большей вероятностью предотвратит нарушения.

Опубликовано на Java Code Geeks с разрешения Майкла Гуда, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Контроль доступа на основе выражений

Мнения, высказанные участниками Java Code Geeks, являются их собственными.