XACML, как эффективно контролировать доступ к коллекциям (спискам) ресурсов
Допустим, у меня есть коллекция transactions
и политика, которая предоставляет read access
для транзакции в этой коллекции для пользователей с ролью user
если пользователь department
такой же, как на записи.
Проблема: если я получаю доступ к отдельным ресурсам, у меня нет проблем с проверкой доступа к каждому ресурсу. Но если я хочу перечислить / перечислить всю коллекцию, мне нужно будет проверить каждый элемент в коллекции, который неэффективен (особенно, если количество записей "высокое").
Было бы более эффективно, если бы PDP мог вернуть PEP информацию о том, что список записей должен быть отфильтрован отделом (а PEP мог бы передать это в основное хранилище данных).
Я думал об использовании обязательств для этого, но, насколько я понимаю, они не должны содержать информацию, относящуюся к AuthZ.
Так как же это можно решить?
1 ответ
Вы подняли отличную точку. XACML был разработан для того, что я бы назвал авторизацией транзакций, т.е. авторизацией конкретной транзакции или потока. Например:
- Политика: Медсестра может просматривать медицинскую карту пациента в своем отделении.
- Запрос: Может ли Джо медсестра просмотреть медицинскую карту № 123?
Проблема в том, когда вы хотите контролировать доступ к большому или даже неизвестному количеству предметов. В этом случае вы можете (теоретически) просто отправить большое количество запросов. Вы даже можете использовать профиль множественных решений XACML, который позволяет создавать запросы, такие как:
- Запрос: Может ли Джо медсестра просмотреть медицинскую карту № 123, № 124, № 125, № 126...?
Затем вы получите столько ответов, сколько было элементов MDP в запросе. Вы можете даже сделать матрицу, например,
- Запрос: Может ли Джо медсестра просмотреть и отредактировать медицинскую карту № 123, № 124, № 125, № 126...?
- Ответ: 2х4 = 8 решений.
Тем не менее, он все еще не так хорошо масштабируется (он может доходить до тысяч, но вряд ли миллионов) и не будет работать в сценариях нумерации страниц и когда вы не знаете, сколько у вас предметов. Он не работает при разбиении на страницы, потому что представьте, что вы извлекаете 10 элементов (с помощью нумерации страниц), которые вы будете отображать, а затем авторизуете каждый. Вы рискуете иметь менее 10 элементов на своей странице, что нарушает пользовательский опыт.
В своем вопросе вы намекаете на использование обязательств и советов. Это вариант, но вы правы насчет недостатка. Он скрывает семантику authZ в рекомендациях и усложняет отдельный случай. Это то, что ваша политика станет
- Политика: медсестра может просматривать медицинскую карту пациента + обязательство: фильтр по отделу
Это налагает большую работу на точку реализации политики (PEP).
Так какая альтернатива?
Использование обратного запроса (ARQ)
Компания Axiomatics (которая - заявление об отказе от ответственности - это то место, где я работаю) разработала новый API поверх PDP, который позволяет запрашивать политики открытым способом, называемым обратным запросом. Вот пост разработчика по теме.
Вместо отправки полноценных запросов XACML, вы отправляете частичный запрос (открытый вопрос), например
- Что Алиса может посмотреть?
Запрос может быть настолько общим или конкретным, насколько это необходимо. Ниже приведены все действительные запросы:
- Что может случиться?
- Что может сделать Алиса?
- Что Алиса может посмотреть?
- Какую медицинскую карту может просматривать Алиса?
- Какую медицинскую карту в отделении ER может просматривать Алиса?
- ...
Ответом будет набор выражений фильтра, вычисленных из политик, которые должны быть выполнены.
Учитывая ранее заявленную политику
- Политика: Медсестра может просматривать медицинскую карту пациента в своем отделении.
- Метаданные пользователя: Алиса работает медсестрой в больнице округа Кук в Чикаго в онкологическом отделении.
Возможные ответы будут
- Что может случиться?
- Ответ: Медсестра может просматривать медицинскую карту пациента в своем отделении.
- Что может сделать Алиса?
- Ответ: просмотреть медицинскую карту пациента в онкологии.
- Что Алиса может посмотреть?
- Ответ: медицинская карта пациента в онкологии.
- Какую медицинскую карту может просматривать Алиса?
- Ответ: один из пациентов в онкологии.
- Какую медицинскую карту в отделении ER может просматривать Алиса?
- Ответ: ничего
Запросы в примере выше сфокусированы на Алисе. Вместо этого вы могли бы сосредоточиться на ресурсе (медицинской карте) или даже на действии. Вы можете выбрать.
Надеюсь, это поможет, Дэвид.