Skip to content

Авторизация

Материал проходит ревью.

НовичокФундамент ~50 мин

Границы темы

Scope: как backend принимает и применяет решение доступа для конкретного действия, объекта, tenant, поля и контекста, а затем доказывает корректность этого решения.

Не рассматриваем: вход пользователя и проверку credential — это authentication. Здесь principal уже получен на доверенной границе.

Что нужно знать заранее

Статья «Аутентификация и авторизация» разделяет identity, principal, session и access decision. Статья «Принцип наименьших привилегий» задаёт цель минимального scope.

Результаты обучения

После статьи читатель сможет:

  1. записать policy через subject, action, resource и context;
  2. разделить управление policy, получение attributes, decision и enforcement;
  3. выбрать подходящую комбинацию access-control models;
  4. защитить одиночный объект, список, поле и изменение состояния;
  5. ограниченно кэшировать решения и отзывать доступ;
  6. построить matrix tests, которые проверяют deny, а не только happy path.

Основная модель

Авторизация — это вычисление разрешения на действие для entity. NIST SP 800-162 формулирует ABAC через attributes субъекта, объекта, операции и условий среды, оцениваемые относительно policy. Та же четырёхчастная модель полезна независимо от конкретного access-control подхода:

text
decision = policy(subject, action, resource, context)
Диаграмма

Правило «admin может всё» является policy, но редко достаточной: оно не ограничивает tenant, опасные actions, separation of duties, время и состояние ресурса.

Основные термины

ТерминРольПример
PolicyНабор правил, по которым вычисляется доступRefund требует permission и состояние paid
PermissionВозможность выполнить action над классом resourcesorders:refund
DecisionРезультат оценки policyallow, deny, not-applicable
ObligationДействие, обязательное вместе с allowMask fields, записать audit, потребовать approval
Enforcement pointКомпонент, не допускающий выполнение без allowAPI middleware/handler boundary
Decision pointКомпонент, вычисляющий policyЛокальная библиотека или policy service
Information pointДоверенный источник attributesIdentity store, resource DB, risk service
Administration pointМесто изменения и публикации policyVersioned policy repository

Архитектура authorization

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

Диаграмма
  • Administration отвечает за review, version, rollout и rollback policy.
  • Information отвечает за происхождение и свежесть attributes.
  • Decision не должен самовольно выполнять business action.
  • Enforcement не должен трактовать отсутствие ответа как allow без явной модели.

End-to-end сценарий: support читает заказ

Требование:

text
Support-инженер может читать заказ только назначенного tenant,
только при активном support case и без полных платёжных реквизитов.

Входы decision:

yaml
subject:
  id: usr_support_7
  roles: [support]
  assigned_tenants: [tenant_42]
action: order.read
resource:
  id: ord_123
  tenant_id: tenant_42
  owner_id: usr_customer_9
  classification: customer-confidential
context:
  support_case: case_88
  case_status: active
  authentication_age: 12m
policy_version: orders-authz-v17

Результат:

yaml
decision: allow
reason: assigned_support_with_active_case
obligations:
  - mask: payment_details
  - audit: support_order_read
  - expires_with: case_88

Allow не означает возврат всей database row: field-level obligation ограничивает representation.

Модели доступа

Один продукт часто комбинирует модели.

МодельОснова решенияСильная сторонаТипичный предел
ACLСписок subjects/permissions у resourceПростое sharing конкретного объектаСложный review на большом масштабе
RBACPermissions сгруппированы по rolesУправляемость стабильных job functionsRole explosion и слабый resource context
ABACAttributes subject/object/action/environmentГибкие контекстные правилаКачество, provenance и сложность attributes
ReBACRelationships между entitiesЕстественно для owner, team, folder graphСтоимость graph traversal и consistency

Пример комбинации:

text
role=editor                           # RBAC: базовая функция
resource.tenant in subject.tenants    # ABAC: tenant boundary
subject member_of resource.team       # ReBAC: relationship
resource ACL grants comment           # ACL: точечное sharing

Object-, collection- и field-level enforcement

Конкретный объект

Проверка должна использовать attributes загруженного ресурса:

sql
SELECT id, tenant_id, owner_id, status
FROM orders
WHERE id = $1;

После загрузки policy сравнивает principal.tenant_id и order.tenant_id. Знание непредсказуемого ID не является разрешением.

Коллекция

Нельзя загрузить все заказы и отфильтровать запрещённые после pagination. Scope должен войти в запрос:

sql
SELECT id, status, total
FROM orders
WHERE tenant_id = $1
  AND owner_id = $2
ORDER BY created_at DESC
LIMIT $3;

Иначе возникают утечки через count, pagination, timing, export и memory pressure.

Поля

Один и тот же объект имеет поля разной чувствительности:

ViewerДопустимые поля
ВладелецЗаказ и маскированные payment details
Support с caseЗаказ без secret/payment fields
Финансовый reviewerСумма, provider IDs, audit data
AnonymousНичего

Сериализация из одной общей entity без projection легко раскрывает новое поле после schema evolution.

Действие и переход состояния

orders:write слишком широко. Разделяйте cancel, refund, change_address и approve_refund; каждое действие имеет собственные preconditions и impact.

Что происходит под капотом

Authorization имеет временную семантику:

Диаграмма

Между decision и action resource может измениться. Для high-impact операции policy должна быть связана с транзакцией, version check или atomic state transition. Иначе появляется time-of-check/time-of-use race.

Deny by default и unknown states

Политика должна различать:

СостояниеБезопасное поведение
Явное allowВыполнить только заявленные obligations
Явное denyНе выполнять действие, записать reason
Нет подходящего правилаDeny by default
Attribute отсутствуетDeny или отдельный безопасный fallback по policy
Decision service timeoutBounded fail-closed для sensitive action
Policy version неизвестнаНе использовать случайный local default

OWASP рекомендует deny by default и проверку permission на каждом запросе. Это защищает новый endpoint и неизвестное состояние от неявного allow.

Кэширование и отзыв

Полный cache key включает как минимум:

text
subject version + action + resource id/version + context class + policy version

Ошибка cache[role + action] игнорирует tenant, resource state и relationship.

Для cache определите:

  • максимальный TTL по impact действия;
  • invalidation при revoke роли, membership и relationship;
  • rollout новой policy version;
  • поведение при недоступности attribute source;
  • метрику stale decision и способ emergency revoke.

Критичные actions могут требовать online decision, даже если чтение использует короткий cache.

Минимальный воспроизводимый пример

Создайте decision table до реализации:

CaseSubjectActionResource/contextExpected
1Owner tenant 42order.readСвой order tenant 42Allow
2Owner tenant 42order.readЧужой order tenant 42Deny
3Owner tenant 42order.readOrder tenant 99Deny
4Support tenant 42order.readActive case tenant 42Allow + mask + audit
5Support tenant 42order.readClosed caseDeny
6Finance reviewerrefund.approveСобственный refund requestDeny: separation of duties
7Unknown roleЛюбоеЛюбой resourceDeny
8Known roleUnknown actionЛюбой resourceDeny
9Revoked membershiporder.readCached previous allowDeny after bounded invalidation

Ожидаемый результат

Каждое allow объяснимо конкретным правилом; пропущенные attributes и неизвестные actions дают deny; obligations проверяются так же, как allow/deny.

Property checks

Кроме примеров сформулируйте свойства:

text
Для любого subject: если subject.tenant != resource.tenant, decision != allow.
Для любого refund: requester_id == approver_id => deny.
Для любого support allow: case_status == active и присутствует mask obligation.

Property-based или генеративные tests помогают найти комбинации, не попавшие в ручную таблицу.

Audit и объяснимость

Decision evidence должно отвечать:

  • кто запросил действие;
  • какое action и над каким resource;
  • какие версии identity/resource/policy участвовали;
  • каков outcome и reason code;
  • какие obligations применены;
  • выполнился ли business action;
  • какой request/trace связывает события.

Не записывайте raw tokens, passwords и полный sensitive resource. Audit защищается от несанкционированного чтения и незаметной подмены.

Trade-offs

РешениеВыигрышЦена или риск
Central PDPЕдиная policy и rolloutNetwork latency и availability dependency
Embedded PDPНизкая latencyVersion drift между сервисами
RBACПростое назначение и reviewRole explosion и недостаток context
ABAC/ReBACТочные динамические решенияFreshness, provenance и сложность policy
Decision cacheAvailability и latencyStale permissions и сложная invalidation
DB-enforced tenant scopeДополнительная границаКонтекст identity в соединении и migration complexity

Failure modes и типичные ошибки

  1. Allow по умолчанию. Новый action доступен до появления deny rule.
  2. Проверка только endpoint. Object ID и tenant не участвуют в decision.
  3. Фильтрация после pagination. Collection metadata и строки уже утекли.
  4. Role explosion. Для каждой комбинации tenant/context создаётся новая роль.
  5. Недоверенные attributes. Клиент присылает tenant_id или is_admin.
  6. Stale cache. Revoke не влияет на ранее вычисленный allow.
  7. TOCTOU. Resource state меняется между decision и update.
  8. Policy drift. Сервисы используют разные версии без наблюдаемого rollout.
  9. Obligations игнорируются. PDP вернул mask, но serializer отдал полную entity.
  10. Нет negative testing. Проверены только разрешённые роли.

Практическое задание

Задача: спроектируйте authorization для shared-документа или заказа.

Подготовьте:

  1. actions вместо общего write;
  2. subject/resource/context attributes с provenance;
  3. комбинацию ACL/RBAC/ABAC/ReBAC и обоснование;
  4. object, collection и field enforcement;
  5. decision table минимум из 12 cases;
  6. три properties;
  7. cache/revocation strategy;
  8. audit schema и failure behavior PDP/PIP.

Критерии готовности: unknown и missing states дают deny; cross-tenant allow невозможен; obligations тестируются; policy version видна в logs и может быть откачена.

Подсказка

Начните с business actions и отношений, а не с ролей. Роль удобно добавить позже как группу permissions, но трудно извлечь точные правила из уже раздутой role hierarchy.

Проверка знаний

ИНТЕРАКТИВНАЯ ПРОВЕРКА

Проверка знаний

0 / 4
01Какое правило точнее описывает доступ support-инженера к заказу?
02Какие уровни нужно защищать отдельно?
03Authorization decision можно кэшировать бессрочно, если principal уже аутентифицирован.
04Восстановите путь authorization request.
  1. Enforcement применяет allow/deny и obligations
  2. Получить доверенные attributes subject/resource/context
  3. Сформировать subject, action и resource
  4. Policy engine вычисляет решение и reason
Проверено: 0 из 4

Самопроверка

  1. Почему role — только один вход authorization decision?
  2. Чем collection-level enforcement отличается от object-level?
  3. Какие поля нужны в decision cache key?
  4. Как обнаружить TOCTOU между policy и update?
  5. Что должно произойти при неизвестной policy version?
Ответы и критерии
  1. Role не описывает resource, tenant, relationships, environment и state.
  2. Object check защищает один resource; collection scope должен ограничить сам query, count, pagination и export до получения данных.
  3. Версии subject, resource и policy, action, resource identity и значимый context.
  4. Связать decision с resource version/transaction и проверить конкурентное изменение негативным тестом.
  5. Sensitive action не выполняется; система создаёт наблюдаемый deny/degraded outcome, а не выбирает неявный default.

Краткое резюме

  • Authorization вычисляет policy над subject, action, resource и context.
  • Administration, attributes, decision и enforcement — разные ответственности.
  • RBAC, ABAC, ACL и relationships можно безопасно комбинировать.
  • Защита нужна для функций, объектов, коллекций, полей и state transitions.
  • Cache, revocation, policy rollout и audit являются частью correctness.

Следующие шаги

Следующие статьи разбирают RBAC, ABAC, ACL, DAC, MAC и PBAC по отдельности. Начните с RBAC как модели управляемого группирования permissions, сохраняя resource/context checks из этой статьи.

Источники

  • NIST SP 800-162 Update 2 — определение ABAC через subject, object, operations, environment и policy.
  • NIST RBAC Project — модель users, roles, permissions, operations, objects и ограничения; страница помечена NIST как архивная.
  • OWASP Authorization Cheat Sheet — deny by default, проверка каждого запроса, object access, logging и tests.
  • NIST SP 800-53 Rev. 5 — семейство Access Control и связанные operational controls.