Прямой ответ
API авторизация определяет, какие действия может выполнять пользователь, поэтому доступ ограничивается необходимыми разрешениями.
| Модель | Что определяет |
|---|---|
| RBAC | Права по ролям |
| ABAC | Права по атрибутам |
| Scopes | Разрешения в токене |
| Ownership | Права по владению ресурсом |
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import HTTPBearer
app = FastAPI()
security = HTTPBearer()
def require_role(role: str):
def dependency(credentials = Depends(security)):
# Проверка роли в токене
if user_role != role:
raise HTTPException(status_code=403)
return dependency
@app.get("/admin", dependencies=[Depends(require_role("admin"))])
async def admin_endpoint():
pass
Проверка прав доступа выполняется перед выполнением действия, поэтому несанкционированный доступ prevented. О методах аутентификации — в статье про методы аутентификации API.
Модели авторизации и их применение
Модели авторизации определяют, как проверяются права доступа, поэтому выбор модели зависит от требований приложения.
RBAC. Права определяются по ролям, поэтому пользователь с ролью admin имеет доступ к admin endpoints.
ABAC. Права определяются по атрибутам, поэтому доступ зависит от атрибутов пользователя и ресурса.
Scopes. Разрешения определяются в токене, поэтому доступ ограничивается scopes, запрошенными при авторизации.
Практическое следствие: отсутствие проверки прав доступа позволяет любому аутентифицированному пользователю выполнить любое действие.
Отдельный аспект — ownership. Права по владению ресурсом определяют, что пользователь может изменять только свои ресурсы.
Три признака некорректной реализации авторизации.
Отсутствие проверки прав. Любой аутентифицированный пользователь может выполнить любое действие, поэтому несанкционированный доступ не prevented.
Отсутствие ownership check. Пользователь может изменять чужие ресурсы, поэтому данные не защищены.
Избыточные scopes. Все разрешения запрашиваются, поэтому доступ не ограничивается.
О JWT аутентификации — в статье про JWT аутентификацию; об управлении API keys — в статье про управление API keys.
Проверка прав и диагностика
Проверка прав доступа перед выполнением действия предотвращает несанкционированный доступ.
Проверка прав. Проверка выполняется перед выполнением действия, поэтому несанкционированный доступ prevented.
Ownership check. Пользователь может изменять только свои ресурсы, поэтому данные защищены.
Фиксация в логе. Запись авторизации позволяет определить, когда и кем было выполнено действие при диагностике.
Практическое следствие: отсутствие проверки прав приводит к тому, что любой аутентифицированный пользователь может выполнить любое действие.
Практика: настройка авторизации
1. Проверяйте права доступа перед выполнением действия. Проверка предотвращает несанкционированный доступ.
2. Используйте RBAC для простых приложений. Права по ролям проще реализовать, поэтому используется для простых приложений.
3. Используйте ABAC для сложных требований. Права по атрибутам позволяют гибко определять доступ.
4. Проверяйте ownership ресурсов. Пользователь может изменять только свои ресурсы, поэтому данные защищены.
5. Ограничивайте scopes при авторизации. Ограничение scopes предотвращает запрос избыточных разрешений.
6. Фиксируйте авторизацию в логе. Запись авторизации позволяет определить, когда и кем было выполнено действие.
7. Возвращайте 403 при отсутствии прав. Ответ 403 указывает, что пользователь аутентифицирован, но не имеет прав.
Рекомендации:
- Не пропускайте проверку прав. Отсутствие проверки позволяет любому аутентифицированному пользователю выполнить любое действие.
- Учитывайте ownership при проверке. Пользователь может изменять только свои ресурсы, поэтому данные защищены.
- Сопоставляйте модель с требованиями. RBAC для простых приложений, ABAC для сложных требований.
- Фиксируйте авторизацию в ошибке. Признак в записи ошибки позволяет определить, когда было выполнено действие.
- Пересматриваем права при изменении требований. Новые требования могут требовать изменения прав.
Практический сценарий: пользователь изменил чужой ресурс
Контекст: пользователь изменил чужой ресурс, поэтому данные не были защищены.
- Диагностика. Проверка показала, что ownership check не выполнялся. Любой аутентифицированный пользователь мог изменить любой ресурс, поэтому данные не были защищены.
- Причина. Ownership check не был настроен, поэтому пользователь мог изменять чужие ресурсы.
- Действия. (а) Добавили ownership check, чтобы пользователь мог изменять только свои ресурсы; (б) настроили RBAC для простых приложений, чтобы права определялись по ролям; (в) ограничили scopes при авторизации, чтобы доступ ограничивался необходимыми разрешениями; (г) добавили фиксацию авторизации в логе для диагностики; (д) настроили возврат 403 при отсутствии прав.
- Результат. Пользователь может изменять только свои ресурсы, поэтому данные защищены.
Вывод: отсутствие ownership check позволяет пользователю изменять чужие ресурсы. Проверка прав доступа и ownership обеспечивает, что пользователь может изменять только свои ресурсы.
Практический сценарий: пользователь изменил чужой ресурс
Контекст: пользователь изменил чужой ресурс, поэтому данные не были защищены.
- Диагностика. Проверка показала, что ownership check не выполнялся. Любой аутентифицированный пользователь мог изменить любой ресурс, поэтому данные не были защищены.
- Причина. Ownership check не был настроен, поэтому пользователь мог изменять чужие ресурсы.
- Действия. (а) Добавили ownership check, чтобы пользователь мог изменять только свои ресурсы; (б) настроили RBAC для простых приложений, чтобы права определялись по ролям; (в) ограничили scopes при авторизации, чтобы доступ ограничивался необходимыми разрешениями; (г) добавили фиксацию авторизации в логе для диагностики; (д) настроили возврат 403 при отсутствии прав.
- Результат. Пользователь может изменять только свои ресурсы, поэтому данные защищены.
Вывод: отсутствие ownership check позволяет пользователю изменять чужие ресурсы. Проверка прав доступа и ownership обеспечивает, что пользователь может изменять только свои ресурсы.
FAQ
Что такое API авторизация? Определение, какие действия может выполнять пользователь. Проверка прав доступа выполняется перед выполнением действия.
Какие модели авторизации существуют? RBAC (права по ролям), ABAC (права по атрибутам), scopes (разрешения в токене) и ownership (права по владению ресурсом).
Зачем нужен ownership check? Проверка владения ресурсом предотвращает изменение чужих ресурсов. Отсутствие проверки позволяет пользователю изменять любые ресурсы.
Как ограничиваются scopes? Scopes запрашиваются при авторизации и ограничиваются необходимыми разрешениями. Избыточные scopes не запрашиваются.
Источники: OWASP API Security, OAuth.net, FastAPI Security — ссылки в шапке.