AI-Ops Documentation

Русский English
  • Главная
  • Карта документации
0. С чего начать
  • Что это за продукт
  • Для кого он
  • Как устроена документация
  • Быстрые ссылки
  • Как начать разработку
  • Как найти нужный сервис
  • К кому идти по вопросам
1. Продукт
Обзор продукта
  • Миссия продукта
  • Ценность для бизнеса
  • Основные сценарии
  • Границы системы
Пользователи и персоны
  • Сегменты пользователей
  • Роли пользователей
  • Основные потребности
Пользовательские сценарии
  • Регистрация / логин
  • Основной пользовательский сценарий
  • Оплата / заказ / действие
  • Поддержка и сценарий восстановления
Функции продукта
Фича: Аутентификация
  • Цель
  • Пользовательская история
  • Бизнес-правила
  • Ограничения
  • Метрики успеха
  • Связанные сервисы
  • Связанные события / данные
  • Фича: Профиль
  • Фича: Организации
  • Фича: Топология
  • Фича: Вычислительные ресурсы
  • Фича: Кластеры
  • Фича: Каталог сервисов
Требования
  • Функциональные требования
  • Нефункциональные требования
  • Требования к производительности
  • Требования к безопасности
  • Конфиденциальность и соответствие
  • Доступность
Метрики
  • Ключевая метрика (North Star)
  • Продуктовые KPI
  • Метрики воронки
  • Метрики качества
  • Метрики экспериментов
2. Домены
Домен: Identity
  • Назначение
  • Основные концепции
  • Сущности
  • Бизнес-правила
  • Сервисы домена
  • Данные домена
  • Связанные фичи
  • Домен: Профиль пользователя
  • Домен: Поиск
  • Домен: Заказы / транзакции
  • Домен: Уведомления
  • Домен: Аналитика
  • Домен: Рекомендации
3. Архитектура
Обзор системы
  • Что входит в систему
  • Что не входит
  • Высокоуровневая диаграмма
C4 Model
  • Контекстная диаграмма
  • Диаграмма контейнеров
  • Диаграмма компонентов
  • Диаграмма развёртывания
Интеграционная архитектура
  • Внешние системы
  • Интеграции API
  • Webhooks
  • Сторонние провайдеры
Потоки данных
  • Онлайн-поток данных
  • Пакетный поток данных
  • Поток событий
  • Владение данными
Архитектура безопасности
  • Аутентификация
  • Авторизация
  • Управление секретами
  • Шифрование
  • Аудит и логирование
Надежность и масштабируемость
  • SLA / SLO
  • Планирование мощностей
  • Отказоустойчивость
  • Обратное давление и повторы
  • Восстановление после сбоев
Архитектурные принципы
  • Границы доменов
  • Принципы проектирования API
  • Принципы проектирования событий
  • Принципы контрактов данных
  • Диаграмма: auth микросервисы
Control plane
  • Архитектура компонентов (control plane)
  • Доменная модель v0
  • Протокол v0 (control plane)
  • Примеры (control plane)
Сервисы (control plane)
Сервис control plane
  • API
  • Модель данных
  • События
  • Модули
  • Операции
Сервис execution plane
  • API
  • Модель данных
  • События
  • Модули
  • Операции
Сервис resource catalog
  • API
  • Модель данных
  • События
  • Модули
  • Операции
4. Инженерия
Сервисы
Каталог сервисов
  • Все сервисы списком
  • Владельцы
  • Критичность
  • Уровень / домен / статус
  • Сервис аутентификации
  • Сервис аккаунтов
  • Облачный сервис
  • Сервис учётных данных
  • Herald
  • Сервис идентификации
  • API Gateway
  • Сервис токенов
Фронтенд
  • Обзор фронтенда
  • Структура приложения
  • Routing (фронтенд)
  • State management (фронтенд)
  • Design system (фронтенд)
  • UI components (фронтенд)
  • API контракты фронтенда
  • Обработка ошибок (фронтенд)
  • Performance (фронтенд)
  • Feature flags (фронтенд)
  • Тестирование фронтенда
Бэкенд
  • Обзор бэкенда
  • Паттерны сервисов
  • Рекомендации по API
  • Событийные паттерны
  • Паттерны доступа к БД
  • Кэширование
  • Асинхронные задачи и воркеры
  • Идемпотентность
  • Обработка ошибок
  • Тестирование бэкенда
Данные
  • Обзор данных
  • Системы-источники
  • Контракты данных
  • Каталог схем событий
  • Хранилище данных
  • Витрины данных
  • ETL / ELT-пайплайны
  • Качество данных
  • Происхождение данных
  • Политики хранения
  • Политики доступа
ML / DS
  • Обзор ML/DS
  • Сценарии (ML)
  • Каталог моделей
  • Feature store
  • Training pipelines
  • Inference pipelines
  • Offline evaluation
  • Online evaluation / A-B
  • Мониторинг (ML)
  • ML runbooks
QA / Качество
  • Стратегия качества
  • Пирамида тестов
  • Тестовые окружения
  • Тестовые данные
  • Ручное тестирование
  • Автоматизированное тестирование
  • Нагрузочное тестирование
  • Тестирование безопасности
  • Критерии приёмки релиза
  • Процесс разбора багов
5. Платформа
Инфраструктура
  • Ansible
  • WireGuard
  • Kubernetes
  • Longhorn
  • Ingress
  • PostgreSQL Cluster
  • Redis
  • Kafka
  • Vault
  • MinIO
  • Authentik
  • Monitoring
  • Logging
  • Tracing
  • Nexus
  • SonarQube
  • GlitchTip
  • GitLab Runner
  • Kubernetes Dashboard
  • OLM
  • Deploy
  • Internal DNS
  • Обзор (инфраструктура)
  • Config generator
  • Пример (инфраструктура)
  • Скрипты (инфраструктура)
Окружения
  • Локальное
  • Stage
  • Pre
  • Продакшен (prod)
  • Tech
  • Облако
  • Объектное хранилище
  • CI/CD
  • Секреты и сертификаты
Наблюдаемость
  • Логирование
  • Метрики
  • Трейсинг
  • Алертинг
  • Резервное копирование и восстановление
6. Разработка
  • Быстрый старт
  • Локальная настройка
  • Карта репозиториев
  • Стандарты кода
  • Git-процесс
  • Стратегия ветвления
  • Руководство по код-ревью
  • Критерии готовности
  • Процесс релиза
  • Флаги фич
  • FAQ разработчика
  • Миграция secure auth
7. Эксплуатация
  • Дежурство
  • Управление инцидентами
  • Уровни критичности
  • Политика эскалации
  • Постмортемы
  • Ранбуки
  • Управление изменениями
  • Непрерывность бизнеса
8. Аналитика
  • План трекинга событий
  • Определения KPI
  • Каталог дашбордов
  • Словарь метрик
  • Эксперименты
  • Стандарты отчётности
9. Управление
  • Решения (ADR)
  • Политика статуса контента
  • Changelog обновлений документации
Безопасность и соответствие
  • Модель угроз
  • Безопасная разработка
  • Управление доступом
  • Конфиденциальность
  • Реагирование на инциденты
Ответственность и владельцы
  • Команды
  • Зоны ответственности команд
  • Владельцы сервисов
  • Владельцы доменов
  • Контакты
Глоссарий
  • Бизнес-термины
  • Продуктовые термины
  • Технические термины
  • Сокращения

Аутентификация

Previous Next

Аутентификация в AIOps реализована как распределенная система из нескольких микросервисов, каждый из которых отвечает за свою часть процесса. Используется JWT-based authentication с разделением на access и refresh токены.

Архитектура аутентификации

graph TB subgraph "Client" WebApp[Web Application] end subgraph "API Gateway" Envoy[Envoy Proxy
JWT Validation] end subgraph "Auth Platform" Identity[Identity Service
Users & Status] Credential[Credential Service
Password Verification] Auth[Auth Service
Session Management] Token[Session Token service
JWT Generation] end subgraph "Data Layer" RedisSession[(Redis
Sessions)] PostgresIdentity[(PostgreSQL
Users)] PostgresCredential[(PostgreSQL
Passwords)] end WebApp -->|1. POST /auth/login| Envoy Envoy -->|2. GetUserByUsername| Identity Identity --> PostgresIdentity Envoy -->|3. VerifyPassword| Credential Credential --> PostgresCredential Envoy -->|4. CreateSession| Auth Auth --> RedisSession Auth -->|5. GenerateTokens| Token Token -->|6. access + refresh| Envoy Envoy -->|7. access, refresh tokens| WebApp WebApp -->|8. API request + JWT| Envoy Envoy -->|9. Validate JWT| Envoy Envoy -->|10. Forward with user_id| Identity style Envoy fill:#4A90E2 style Auth fill:#51B749 style Token fill:#FFA500

Компоненты системы

1. Identity Service

Ответственность: Source of truth для пользователей и их статуса.

API:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
service IdentityService {
  rpc GetUserByUsername(GetUserByUsernameRequest) returns (GetUserResponse);
  rpc GetUser(GetUserRequest) returns (GetUserResponse);
}

message User {
  string id = 1;                  // UUID
  string username = 2;
  UserStatus status = 3;          // ACTIVE, DISABLED, DELETED
  google.protobuf.Timestamp created_at = 4;
  google.protobuf.Timestamp disabled_at = 6;
}

enum UserStatus {
  USER_STATUS_ACTIVE = 1;
  USER_STATUS_DISABLED = 2;
  USER_STATUS_DELETED = 3;
}

Логика: - Проверяет существование пользователя по username - Возвращает статус (active, disabled, deleted) - Блокирует аутентификацию для неактивных пользователей

2. Credential Service

Ответственность: Безопасное хранение и верификация паролей.

API:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
service CredentialService {
  rpc VerifyPassword(VerifyPasswordRequest) returns (VerifyPasswordResponse);
  rpc SetPassword(SetPasswordRequest) returns (SetPasswordResponse);
  rpc ChangePassword(ChangePasswordRequest) returns (ChangePasswordResponse);
}

message VerifyPasswordRequest {
  string user_id = 1;
  string password = 2;
}

message VerifyPasswordResponse {
  bool is_valid = 1;  // Constant-time response
}

Защита:

Argon2id хеширование:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class PasswordDomainService:
    def __init__(self, hasher: argon2.PasswordHasher | None = None):
        self._hasher = hasher or argon2.PasswordHasher()

    async def hash_password(self, password: str) -> str:
        """CPU-bound операция в отдельном потоке"""
        async with self._hash_semaphore:
            return await asyncio.to_thread(self._hasher.hash, password)

    async def verify_password_hash(self, password: str, password_hash: str) -> bool:
        """Constant-time верификация"""
        try:
            is_valid = await asyncio.to_thread(
                self._hasher.verify, password_hash, password
            )
        except argon2.exceptions.VerifyMismatchError:
            return False
        return is_valid

Защита от DDoS: - Semaphore ограничивает конкурентные операции хеширования - Максимум 10 одновременных hash операций - Защита CPU от перегрузки при атаке

Constant-time verification: - Всегда выполняет полную верификацию, даже если пользователь не существует - Защита от timing attacks - Защита от user enumeration

3. Auth Service

Ответственность: Управление сессиями пользователей.

Session Model:

1
2
3
4
5
6
7
8
9
class Session:
    id: UUID                    # Session identifier
    user_id: UUID              # Associated user
    refresh_token_hash: str    # Hashed refresh token
    created_at: datetime
    expires_at: datetime
    last_used_at: datetime
    user_agent: str | None
    ip_address: str | None

Хранение: Redis с TTL

API:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class AuthService:
    async def create_session(
        self,
        user_id: UUID,
        user_agent: str | None = None,
        ip_address: str | None = None
    ) -> Session:
        """Создает новую сессию и возвращает refresh token"""

    async def refresh_tokens(
        self,
        refresh_token: str
    ) -> tuple[str, str]:
        """Обновляет access и refresh токены"""

    async def revoke_session(self, session_id: UUID) -> None:
        """Отзывает сессию (logout)"""

4. Session Token service

Ответственность: Генерация и валидация JWT токенов.

Token Structure:

Access Token (short-lived, 15 минут):

1
2
3
4
5
6
7
8
{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "username": "john_doe",
  "session_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "type": "access",
  "iat": 1678886400,
  "exp": 1678887300
}

Refresh Token (long-lived, 30 дней):

1
2
3
4
5
6
7
{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "session_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "type": "refresh",
  "iat": 1678886400,
  "exp": 1681478400
}

Key Management: - RS256 (RSA with SHA-256) - Периодическая ротация ключей - Старые ключи хранятся для валидации существующих токенов

5. API Gateway (Envoy)

Ответственность: Валидация JWT и маршрутизация запросов.

JWT Validation:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Envoy JWT Filter
jwt_authn:
  providers:
    aiops_jwt:
      issuer: "https://api.aiops.io"
      audiences:
        - "aiops-api"
      remote_jwks:
        http_uri:
          uri: "http://session-token-service:8080/jwks"
          cluster: token_service
        cache_duration:
          seconds: 300
      forward_payload_header: "x-jwt-payload"

Flow: 1. Envoy извлекает JWT из Authorization: Bearer <token> 2. Валидирует подпись через JWKS endpoint Session Token service 3. Проверяет exp, iss, aud 4. Извлекает user_id и добавляет в заголовок x-user-id 5. Форвардит запрос к целевому сервису

Процесс аутентификации

Login Flow

sequenceDiagram participant Client participant Gateway participant Identity participant Credential participant Auth participant Token participant Redis Client->>Gateway: "POST /auth/login, body username password" Gateway->>Identity: GetUserByUsername(username) Identity-->>Gateway: User id, status ACTIVE alt User не найден или disabled Gateway-->>Client: 401 Unauthorized end Gateway->>Credential: VerifyPassword(user_id, password) Note over Credential: Constant-time verification Credential-->>Gateway: is_valid true alt Неверный пароль Gateway-->>Client: 401 Unauthorized end Gateway->>Auth: CreateSession(user_id, metadata) Auth->>Redis: SET session, EX 2592000 Auth->>Token: GenerateTokens(user_id, session_id) Token-->>Auth: access_token, refresh_token Auth-->>Gateway: access, refresh, session Gateway-->>Client: "200 OK, access_token refresh_token"

Authenticated Request Flow

sequenceDiagram participant Client participant Gateway participant Service Client->>Gateway: "GET /api/users/me, Authorization Bearer token" Note over Gateway: Validate JWT signature Note over Gateway: Check exp, iss, aud Note over Gateway: Extract user_id from sub Gateway->>Service: "GET /users/me, x-user-id" Service-->>Gateway: User data Gateway-->>Client: 200 OK

Token Refresh Flow

sequenceDiagram participant Client participant Gateway participant Auth participant Token participant Redis Client->>Gateway: "POST /auth/refresh, body refresh_token" Gateway->>Token: ParseToken(refresh_token) Token-->>Gateway: session_id, user_id Gateway->>Auth: RefreshTokens(session_id, token_hash) Auth->>Redis: GET session by id Redis-->>Auth: user_id, refresh_token_hash alt Session истекла или токен не совпадает Auth->>Redis: DEL session Auth-->>Gateway: 401 Unauthorized Gateway-->>Client: 401 Unauthorized end Auth->>Token: GenerateTokens(user_id, session_id) Token-->>Auth: access_token, refresh_token Auth->>Redis: SET session updated_data Auth-->>Gateway: access, refresh Gateway-->>Client: "200 OK, access_token refresh_token"

Logout Flow

sequenceDiagram participant Client participant Gateway participant Auth participant Redis participant Kafka Client->>Gateway: "POST /auth/logout, Authorization Bearer token" Note over Gateway: Extract session_id from JWT Gateway->>Auth: RevokeSession(session_id) Auth->>Redis: DEL session Auth->>Kafka: SessionRevokedEvent Auth-->>Gateway: 204 No Content Gateway-->>Client: 204 No Content

Безопасность

Защита от атак

Timing Attacks:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
async def verify_password(self, user_id: UUID, password: str) -> bool:
    """Всегда выполняет хеширование, даже если пользователя нет"""
    credential = await self._repo.get_by_user_id(user_id)

    if credential is None:
        # Фиктивная верификация против несуществующего хеша
        dummy_hash = "$argon2id$v=19$m=65536,t=3,p=4$..."
        await self._domain_service.verify_password_hash(password, dummy_hash)
        return False

    return await self._domain_service.verify_password_hash(
        password, credential.password_hash
    )

Brute Force Protection: - Rate limiting на API Gateway (по IP, по username) - Account lockout после N неудачных попыток - Exponential backoff

Session Security: - Refresh token rotation (при каждом refresh выдается новый) - Session binding к IP/User-Agent (опционально) - Automatic session revocation при suspicious activity

Password Requirements

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class PasswordDomainService:
    def validate_password_strength(self, password: str) -> None:
        """Валидация сложности пароля"""
        if len(password) < 8:
            raise PasswordTooWeakError("Min 8 characters")

        if not any(c.isupper() for c in password):
            raise PasswordMissingUppercaseError()

        if not any(c.islower() for c in password):
            raise PasswordMissingLowercaseError()

        if not any(c.isdigit() for c in password):
            raise PasswordMissingDigitError()

        if not any(not c.isalnum() for c in password):
            raise PasswordMissingSpecialCharError()

        # Entropy check via zxcvbn
        result = zxcvbn.zxcvbn(password)
        if result["score"] < 3:
            raise PasswordTooWeakError(result["feedback"]["warning"])

Связанные страницы

  • Authorization — права доступа и RBAC
  • Secrets Management — управление секретами
  • API Design Principles — REST API guidelines
  • Identity Domain — доменная модель Identity
Архитектура безопасности Авторизация
Меню
Главная Карта документации
0. С чего начать
С чего начать Что это за продукт Для кого он Как устроена документация Быстрые ссылки Как начать разработку Как найти нужный сервис К кому идти по вопросам
1. Продукт
Продукт
2. Домены
Домены Домен: Профиль пользователя Домен: Поиск Домен: Заказы / транзакции Домен: Уведомления Домен: Аналитика Домен: Рекомендации
3. Архитектура
Архитектура Диаграмма: auth микросервисы
4. Инженерия
Инженерия
5. Платформа
Платформа Облако Объектное хранилище CI/CD Секреты и сертификаты Резервное копирование и восстановление
6. Разработка
Разработка Быстрый старт Локальная настройка Карта репозиториев Стандарты кода Git-процесс Стратегия ветвления Руководство по код-ревью Критерии готовности Процесс релиза Флаги фич FAQ разработчика Миграция secure auth
7. Эксплуатация
Эксплуатация Дежурство Управление инцидентами Уровни критичности Политика эскалации Постмортемы Ранбуки Управление изменениями Непрерывность бизнеса
8. Аналитика
Аналитика План трекинга событий Определения KPI Каталог дашбордов Словарь метрик Эксперименты Стандарты отчётности
9. Управление
Управление Решения (ADR) Политика статуса контента Changelog обновлений документации

На странице

Архитектура аутентификации Компоненты системы 1. Identity Service 2. Credential Service 3. Auth Service 4. Session Token service 5. API Gateway (Envoy) Процесс аутентификации Login Flow Authenticated Request Flow Token Refresh Flow Logout Flow Безопасность Защита от атак Password Requirements Связанные страницы