RBAC и Авторизация¶
Техническая документация для команд ИТ и информационной безопасности
Содержание¶
- Обзор
- Ключевые возможности
- Архитектура RBAC
- Иерархия ролей
- Наследование разрешений
- Каталог разрешений
- Разрешения по категориям
- Методы аутентификации
- 1. JWT Bearer Token
- 2. API-ключи
- 3. OAuth2/OIDC
- 4. LDAP/Active Directory
- API Reference
- Middleware зависимости
- Примеры использования в FastAPI
- AuthContext
- Аудит и логирование
- События авторизации
- Формат лога
- RBAC на уровне групп (мультитенантность)
- Роли в группах
- Как это работает
- Привязка API-ключей к группе
- Контекст аудита
- Миграция
- Лучшие практики
- Для администраторов
- Для разработчиков
- Связанные документы
Обзор¶
CodeGraph реализует комплексную систему контроля доступа на основе ролей (RBAC) с поддержкой множества методов аутентификации. Система обеспечивает гранулярный контроль доступа к функциям платформы.
Ключевые возможности¶
- 4 уровня ролей с иерархическим наследованием
- 21 гранулярное разрешение по категориям функциональности
- Множество методов аутентификации: JWT, API-ключи, OAuth2, LDAP
- Внесение токенов в чёрный список для мгновенного отзыва доступа
- Интеграция с SIEM для аудита событий авторизации
Архитектура RBAC¶
Иерархия ролей¶
┌─────────────────────┐
│ ADMIN │
│ (admin:all) │
│ Полный доступ │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ REVIEWER │
│ Проверка кода + GitHub │
│ + GitLab │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ ANALYST │
│ Выполнение запросов│
│ + API-ключи │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ VIEWER │
│ Только чтение │
└─────────────────────┘
Наследование разрешений¶
Каждая роль наследует все разрешения нижестоящих ролей:
- ADMIN → все разрешения (admin:all)
- REVIEWER → разрешения ANALYST + проверка кода
- ANALYST → разрешения VIEWER + выполнение/экспорт
- VIEWER → только чтение (базовый уровень)
Каталог разрешений¶
Разрешения по категориям¶
Сценарии (scenarios:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
scenarios:read |
Просмотр списка сценариев | ✓ | ✓ | ✓ | ✓ |
scenarios:execute |
Запуск сценариев анализа | ✓ | ✓ | ✓ |
Запросы (query:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
query:execute |
Выполнение SQL-запросов к CPG | ✓ | ✓ | ✓ | |
query:validate |
Валидация синтаксиса запросов | ✓ | ✓ | ✓ |
Проверка кода (review:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
review:execute |
Запуск автоматической проверки кода | ✓ | ✓ | ||
review:github |
Интеграция с GitHub PR | ✓ | ✓ | ||
review:gitlab |
Интеграция с GitLab MR | ✓ | ✓ |
Сессии (sessions:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
sessions:read |
Просмотр сессий | ✓ | ✓ | ✓ | ✓ |
sessions:write |
Создание/изменение сессий | ✓ | ✓ | ✓ | |
sessions:delete |
Удаление сессий | ✓ | ✓ | ✓ |
История (history:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
history:read |
Просмотр истории запросов | ✓ | ✓ | ✓ | ✓ |
history:export |
Экспорт истории | ✓ | ✓ | ✓ |
Пользователи (users:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
users:read |
Просмотр списка пользователей | ✓ | |||
users:write |
Создание/редактирование | ✓ | |||
users:delete |
Удаление пользователей | ✓ |
API-ключи (api_keys:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
api_keys:read |
Просмотр своих ключей | ✓ | ✓ | ✓ | |
api_keys:write |
Создание ключей | ✓ | ✓ | ✓ | |
api_keys:delete |
Удаление любых ключей | ✓ |
Метрики (stats:*, metrics:*)¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
stats:read |
Просмотр статистики | ✓ | ✓ | ✓ | ✓ |
metrics:read |
Prometheus метрики | ✓ |
Администрирование¶
| Разрешение | Описание | VIEWER | ANALYST | REVIEWER | ADMIN |
|---|---|---|---|---|---|
admin:all |
Полный доступ | ✓ |
Методы аутентификации¶
1. JWT Bearer Token¶
Основной метод для веб-приложений и интерактивных сессий.
Структура токена¶
class TokenPayload:
sub: str # User ID
jti: str # JWT ID (уникальный идентификатор)
exp: datetime # Время истечения
iat: datetime # Время выдачи
type: str # "access" или "refresh"
scopes: list # Список разрешений
role: str # Роль пользователя
Параметры токенов¶
| Тип токена | TTL | Назначение |
|---|---|---|
| Access Token | 30 минут | Авторизация API-запросов |
| Refresh Token | 7 дней | Обновление access-токена |
Пример использования¶
# Получение токена
curl -X POST /api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "analyst", "password": "***"}'
# Response:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_in": 1800
}
# Использование токена
curl -X GET /api/v1/scenarios \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
Отзыв токена (внесение в чёрный список)¶
# Выход из системы — добавление токена в чёрный список
curl -X POST /api/v1/auth/logout \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
После внесения в чёрный список токен мгновенно становится недействительным.
2. API-ключи¶
Для интеграций, CI/CD и автоматизации.
Формат API-ключа¶
Prefix: cgk_ (CodeGraph Key)
Secret: [36 символов] (UUID v4)
Пример: cgk_550e8400-e29b-41d4-a716-446655440000
Безопасность хранения¶
- Ключи хешируются SHA-256 перед сохранением
- Полный ключ показывается только при создании
- Поддержка срока действия и отзыва
Пример использования¶
# Создание API-ключа
curl -X POST /api/v1/auth/api-keys \
-H "Authorization: Bearer <admin_token>" \
-d '{"name": "CI Pipeline", "scopes": ["query:execute", "scenarios:execute"]}'
# Response:
{
"id": "key_123",
"key": "cgk_550e8400-e29b-41d4-a716-446655440000", # Показывается только один раз!
"name": "CI Pipeline",
"scopes": ["query:execute", "scenarios:execute"],
"expires_at": "2026-01-01T00:00:00Z"
}
# Использование API-ключа
curl -X GET /api/v1/scenarios \
-H "X-API-Key: cgk_550e8400-e29b-41d4-a716-446655440000"
Разрешения по умолчанию для API-ключей¶
default_scopes = [
"scenarios:read",
"scenarios:execute",
"query:execute",
"sessions:read",
"sessions:write",
"history:read",
]
3. OAuth2/OIDC¶
Поддержка корпоративных поставщиков идентификации. См. Интеграция OAuth2/OIDC и LDAP/AD — полное руководство по настройке.
Поддерживаемые поставщики¶
| Поставщик | Статус | Сценарий |
|---|---|---|
| GitHub | Готово | Разработчики, open-source |
| GitLab | Готово | Корпоративные GitLab |
| Готово | Google Workspace | |
| Keycloak | Готово | Enterprise IdP |
| Azure AD | Готово | Microsoft 365 |
Конфигурация (пример для Keycloak)¶
oauth2:
providers:
keycloak:
enabled: true
client_id: "codegraph"
client_secret: "${KEYCLOAK_SECRET}"
authorize_url: "https://keycloak.company.com/realms/main/protocol/openid-connect/auth"
token_url: "https://keycloak.company.com/realms/main/protocol/openid-connect/token"
userinfo_url: "https://keycloak.company.com/realms/main/protocol/openid-connect/userinfo"
scopes: ["openid", "profile", "email", "groups"]
role_claim: "realm_access.roles"
role_mapping:
codegraph-admin: admin
codegraph-reviewer: reviewer
codegraph-analyst: analyst
codegraph-viewer: viewer
4. LDAP/Active Directory¶
Интеграция с корпоративным каталогом. См. Интеграция OAuth2/OIDC и LDAP/AD — полное руководство по настройке.
Конфигурация¶
ldap:
enabled: true
server: "ldaps://ldap.company.com:636"
base_dn: "dc=company,dc=com"
bind_dn: "cn=codegraph,ou=services,dc=company,dc=com"
bind_password: "${LDAP_PASSWORD}"
user_search_base: "ou=users,dc=company,dc=com"
user_search_filter: "(sAMAccountName={username})"
group_search_base: "ou=groups,dc=company,dc=com"
group_membership_attr: "memberOf"
group_mapping:
"CN=CodeGraph-Admins,OU=Groups,DC=company,DC=com": admin
"CN=CodeGraph-Reviewers,OU=Groups,DC=company,DC=com": reviewer
"CN=CodeGraph-Analysts,OU=Groups,DC=company,DC=com": analyst
"CN=CodeGraph-Viewers,OU=Groups,DC=company,DC=com": viewer
sync_interval_minutes: 15
Синхронизация групп¶
- Автоматическая синхронизация ролей с группами AD
- Поддержка вложенных групп
- Кеширование с настраиваемым TTL
Справочник API¶
Middleware зависимости¶
from src.api.auth.middleware import (
get_auth_context, # Получить контекст (без ошибки если не авторизован)
require_auth, # Требовать любую аутентификацию
require_permission, # Требовать конкретное разрешение
require_role, # Требовать конкретную роль
require_admin, # Shortcut для admin
require_analyst, # Shortcut для analyst+
require_reviewer, # Shortcut для reviewer+
)
Примеры использования в FastAPI¶
from fastapi import Depends, APIRouter
from src.api.auth.middleware import require_permission, require_admin
from src.api.auth.permissions import Permission
router = APIRouter()
# Требовать конкретное разрешение
@router.post("/query/execute")
async def execute_query(
query: str,
auth = Depends(require_permission(Permission.QUERY_EXECUTE))
):
# auth.user_id, auth.role, auth.scopes доступны
return {"result": "..."}
# Требовать одно из нескольких разрешений
@router.get("/reviews")
async def list_reviews(
auth = Depends(require_any_permission(
Permission.REVIEW_EXECUTE,
Permission.REVIEW_GITHUB,
Permission.REVIEW_GITLAB
))
):
return {"reviews": [...]}
# Требовать роль Admin
@router.delete("/users/{user_id}")
async def delete_user(
user_id: str,
auth = Depends(require_admin)
):
return {"deleted": user_id}
AuthContext¶
class AuthContext:
user_id: str # ID пользователя
username: str # Имя пользователя
role: Role # Роль (VIEWER, ANALYST, REVIEWER, ADMIN)
scopes: List[str] # Список разрешений
auth_method: str # "jwt", "api_key", "oauth2", "ldap"
@property
def is_authenticated(self) -> bool:
"""Проверка аутентификации"""
def has_permission(self, permission: Permission) -> bool:
"""Проверка конкретного разрешения"""
Аудит и логирование¶
События авторизации¶
Все события авторизации логируются и отправляются в SIEM:
| Событие | Severity | Описание |
|---|---|---|
AUTH_SUCCESS |
INFO | Успешная аутентификация |
AUTH_FAILURE |
WARNING | Неудачная попытка |
TOKEN_ISSUED |
INFO | Выдан новый токен |
TOKEN_REVOKED |
INFO | Токен отозван |
PERMISSION_DENIED |
WARNING | Отказ в доступе |
API_KEY_CREATED |
INFO | Создан API-ключ |
API_KEY_REVOKED |
INFO | API-ключ отозван |
Формат лога¶
{
"timestamp": "2026-02-26T10:30:00.000Z",
"event_type": "AUTH_SUCCESS",
"user_id": "user_123",
"username": "analyst@company.com",
"role": "analyst",
"auth_method": "jwt",
"ip_address": "10.0.0.50",
"user_agent": "Mozilla/5.0...",
"request_path": "/api/v1/scenarios",
"request_method": "GET"
}
RBAC на уровне групп (мультитенантность)¶
При multi_tenant.enabled: true в config.yaml CodeGraph применяет контроль доступа на уровне групп для всех эндпоинтов данных. Проекты принадлежат группам, пользователи имеют роли в каждой группе.
Роли в группах¶
| Роль | Разрешения |
|---|---|
VIEWER |
Только чтение: запросы, статистика, списки |
EDITOR |
Чтение + запись: импорт, редактирование, активация |
ADMIN |
Полный доступ: удаление проектов, управление участниками группы |
Системные администраторы (Role.ADMIN) обходят все проверки групп.
Как это работает¶
Каждый API-запрос разрешает ProjectContext, содержащий project_id, group_id и db_path. Зависимость require_project_access(min_group_role) проверяет:
- Если
multi_tenant.enabled=false→ пропуск (без проверок) - Если пользователь — системный администратор → обход проверок групп
- Иначе → проверка таблицы
user_group_accessна минимальную роль
Привязка API-ключей к группе¶
API-ключи могут быть привязаны к конкретной группе через столбец group_id:
- NULL — доступ ко всем группам пользователя (обратная совместимость)
- Указан — ограничивает разрешение проектов только этой группой
Контекст аудита¶
При включённой мультитенантности записи журнала аудита включают поля project_id и group_id для тенант-зависимых аудиторских следов.
Миграция¶
Для существующих однотенантных установок выполните скрипт миграции один раз:
python scripts/migrate_default_group.py # Создаёт группу "default", назначает всех пользователей как ADMIN
python scripts/migrate_default_group.py --dry-run # Предпросмотр изменений без применения
Лучшие практики¶
Для администраторов¶
- Принцип наименьших привилегий — назначайте минимально необходимые роли
- Используйте API-ключи с ограниченными scopes для автоматизации
- Настройте синхронизацию с LDAP/AD для централизованного управления
- Включите SIEM-интеграцию для мониторинга событий безопасности
- Регулярно проводите аудит активных сессий и API-ключей
Для разработчиков¶
- Используйте JWT для веб-приложений, API-ключи для CI/CD
- Храните refresh-токены безопасно (httpOnly cookies)
- Обрабатывайте 401/403 корректно в UI
- Не логируйте токены и ключи в открытом виде
Связанные документы¶
- Enterprise Security Brief — Обзор безопасности
- DLP Security — Защита от утечки данных
- SIEM Integration — Интеграция с SIEM
- REST API Reference — Справочник API
Версия: 1.1 | Февраль 2026