Перейти к содержанию

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

JWT + CSRF + HMAC + Rate Limiting + RLS

Многоуровневая защита платформы Red Petroleum EV

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

JWT Token Flow

Токен Тип Срок Хранение
Access Token JWT 15 минут HTTP-only Cookie (evp_access)
Refresh Token JWT 7 дней HTTP-only Cookie (evp_refresh)
CSRF Token Random Сессия Cookie + Header (XSRF-TOKEN)

JWT Structure

{
  "sub": "user_uuid",
  "role": "client",
  "phone": "+996700123456",
  "exp": 1740000000,
  "iat": 1739999100
}

RBAC — Role-Based Access Control

flowchart TD R["HTTP Request"] --> MW["Auth Middleware"] MW --> JV["JWT Verify"] JV -->|Invalid| E401["401 Unauthorized"] JV -->|Valid| RC["Role Check"] RC -->|Insufficient| E403["403 Forbidden"] RC -->|OK| EP["Endpoint Handler"] style E401 fill:#EF4444,color:#fff style E403 fill:#F59E0B,color:#000 style EP fill:#22C55E,color:#000

CSRF Protection

Двойная Cookie защита:

  1. Сервер устанавливает XSRF-TOKEN cookie (readable)
  2. Клиент читает cookie и отправляет в header X-XSRF-TOKEN
  3. Сервер сравнивает cookie и header
# Пример проверки
def verify_csrf(request):
    cookie_token = request.cookies.get("XSRF-TOKEN")
    header_token = request.headers.get("X-XSRF-TOKEN")
    if not cookie_token or cookie_token != header_token:
        raise HTTPException(403, "CSRF validation failed")

HMAC-SHA512 (Namba One)

Все запросы к платёжному API подписываются:

import hmac, hashlib

def sign_request(merchant_guid: str, secret: str, payload: str) -> str:
    message = f"{merchant_guid}:{payload}"
    return hmac.new(
        secret.encode(), message.encode(), hashlib.sha512
    ).hexdigest()

Webhook верификация

Проверка Описание
IP Whitelist Только IP-адреса Namba One
Webhook Secret HMAC подпись тела
Idempotency Дедупликация по payment_id

Rate Limiting

REST API

Эндпоинт Лимит Окно
/auth/otp/request 3 запроса 5 минут
/auth/otp/verify 5 попыток 5 минут
/charging/start 10 запросов 1 минута
Общий API 100 запросов 1 минута
Admin API 200 запросов 1 минута

OCPP WebSocket

Параметр Лимит
Heartbeat интервал 30 секунд (мин)
MeterValues интервал 15 секунд (мин)
Сообщений / минута / станция 20
Reconnect backoff Экспоненциальный (1s → 2s → 4s → ... → 60s)

Защита базы данных

Row Level Security (RLS)

-- Клиент видит только свои данные
CREATE POLICY user_own_data ON charging_sessions
  FOR ALL USING (user_id = auth.uid());

-- Партнёр видит только свои станции
CREATE POLICY partner_stations ON stations
  FOR SELECT USING (partner_id = auth.uid());

-- Админ видит всё
CREATE POLICY admin_all ON charging_sessions
  FOR ALL USING (auth.jwt() ->> 'role' IN ('superadmin', 'admin'));

SQL Injection Protection

Мера Реализация
ORM SQLAlchemy 2.0 (параметризованные запросы)
Pydantic Валидация всех входных данных
Prepared Statements Для raw SQL запросов
Input Sanitization Escape на уровне ORM

Idempotency

Зарядные сессии

# Предотвращение двойного старта
async def start_charging(user_id, connector_id):
    # Проверка активной сессии
    active = await get_active_session(user_id)
    if active:
        raise HTTPException(409, "Active session exists")

    # Идемпотентный ключ
    idempotency_key = f"charge:{user_id}:{connector_id}"
    if await redis.get(idempotency_key):
        raise HTTPException(409, "Duplicate request")
    await redis.set(idempotency_key, "1", ex=30)

Платежи

  • Каждый webhook от Namba One содержит уникальный payment_id
  • Дедупликация: проверка в таблице balance_transactions
  • Атомарность: SELECT FOR UPDATE на баланс

OCPP Security

Мера Описание
WSS (TLS) Все OCPP соединения через WSS
Station Auth Проверка charge_point_id при подключении
IP Whitelist Опционально для станций
Message Validation Валидация JSON по OCPP schema
Heartbeat Monitor Детекция offline станций (>2 мин без heartbeat)

Compliance

Стандарт Статус Описание
OCPP 1.6J Полная совместимость
OCPP 2.0.1 Базовые операции
PCI DSS N/A Платежи через Namba One (они сертифицированы)
GDPR/ЗЗПД Минимум персональных данных
ISO 27001 🟡 Планируется

Security Checklist

  • JWT с коротким TTL (15 мин)
  • HTTP-only cookies (XSS защита)
  • CSRF double-cookie pattern
  • HMAC-SHA512 для платежей
  • Rate limiting на все эндпоинты
  • RLS в базе данных
  • RBAC на каждом эндпоинте
  • Idempotency для критических операций
  • WSS для OCPP
  • Input validation (Pydantic)
  • Penetration testing (планируется)
  • Security audit (планируется)