Перейти к основному содержимому

Security baseline

Зачем нужно

Документ задаёт минимальный security-уровень, обязательный для всех 7 доменов. Любые специфические правила домена не ослабляют этот baseline.

Секреты

  • Никогда в репозитории.
  • Хранятся в Kubernetes Secrets / sealed-secrets / Vault в prod, в .env локально.
  • .env.example хранит только список ключей с пустыми значениями.
  • Ротация раз в год минимум; критические — раз в 90 дней.
  • Сервисные клиенты используют отдельные client_secret на окружение.

TLS

  • Везде TLS 1.2+.
  • Внутри кластера — mTLS между сервисами или приватная сеть с шифрованием.
  • HSTS на публичных доменах: max-age=31536000; includeSubDomains; preload.

Шифрование

  • В покое: PostgreSQL — encryption at rest, S3 — server-side encryption.
  • В пути: TLS.
  • Чувствительные поля (refresh tokens, recovery secrets, OAuth client secrets) — hashed/encrypted with envelope key.
  • Платёжные данные не хранятся (используется payment provider tokenization).

Cookies

CookieАтрибуты
identity refreshHttpOnly, Secure, SameSite=Strict, домен identity
identity session markerHttpOnly, Secure, SameSite=Lax
CSRF (если используется)Secure, SameSite=Strict

Никаких токенов в cookies, доступных JavaScript.

CORS

  • Публичные API: запрет cross-origin с приватных приложений.
  • Frontend-приложения экосистемы используют origin-allow-list.
  • Preflight кешируется до 24 часов.
  • credentials разрешён только для известных origins.

CSRF

  • Для cookie-based flows (identity oauth screens, frontend-сессии) — double-submit или synchronizer token.
  • Для bearer-token API — не требуется.

HTTP-заголовки безопасности

ЗаголовокЗначение
Strict-Transport-Securitymax-age=31536000; includeSubDomains; preload
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY для API, SAMEORIGIN или CSP frame-ancestors для frontend
Referrer-Policystrict-origin-when-cross-origin
Permissions-Policyминимум camera, microphone, geolocation: deny
Content-Security-Policynonce-based для frontend; список origins для script/style/img/connect

Rate limiting

  • Глобальный лимит на gateway: 600 RPM на IP по умолчанию;
  • На уровне токена: 1200 RPM;
  • Для login/reset password в identity: 5 попыток за 15 минут на пользователя/IP;
  • Доменные лимиты ужесточают, не ослабляют.

Защита от brute force

  • Identity login: задержка после неуспешных попыток, captcha после 3, lockout после 10.
  • Webhook payment provider: подпись + временная метка, защита от replay.

PII

  • Минимизация: храним только то, что нужно.
  • Маскирование в логах и Sentry.
  • Доступ к PII по explicit permissions, любое чтение списка PII логируется.
  • Экспорт данных требует дополнительного permission.

Регуляторы и согласие

  • Согласие на обработку данных собирается при регистрации, версионируется.
  • Право быть забытым: запрос приводит к анонимизации профиля; финансовые и аудит-записи остаются как обезличенные.
  • Cookies: банер согласия для аналитических cookies на витрине.

Зависимости

  • Renovate автообновляет non-major versions;
  • snyk/npm audit в CI; критические — fail build;
  • Sourcemaps публикуются только в Sentry, не наружу.

Файлы

  • Загружаемые файлы валидируются по MIME и размеру.
  • Сканирование на вредоносное содержимое (антивирусный pass) для пользовательских аплоудов в task-bank, lms, competitions.
  • Хранение в S3 с приватными ACL; выдача через signed URLs ограниченного срока.

Webhook signatures

  • Каждый входящий webhook (платежи, внешние LMS) проверяется по подписи.
  • Идемпотентность по уникальному ID provider.

Запрещено

  • Использовать eval, динамическую генерацию SQL без параметров.
  • Логировать пароли/токены/OTP.
  • Передавать токены/секреты в URL.
  • Использовать dangerouslySetInnerHTML без sanitizer.
  • Подключать сторонний JS без аудита.
  • Использовать --no-verify или eslint-disable без объяснения.

Связанные документы