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

ADR-0046: Security Coding Standards

Статус

Принято.

Контекст

Gambling/fintech платформа является high-value target: реальные деньги, PII, игровые лицензии. Нарушение security приводит к финансовым потерям, отзыву лицензии, GDPR штрафам, репутационному ущербу.

Без явных security coding standards возникают:

  • endpoints без авторизации;
  • secrets в логах и appsettings;
  • отсутствие tenant isolation в handlers;
  • callback endpoints без signature validation;
  • отсутствие rate limiting на sensitive operations.

Решение

Defence-in-Depth: Четыре Независимых Слоя

  1. Endpoint Policy[Authorize(Policy = "...")] на каждом endpoint.
  2. MediatR AuthorizationBehaviorActorContext.HasPermission() для каждой command.
  3. Handler Ownership Check — явная проверка entity.TenantId == actorContext.TenantId.
  4. Repository Scope Filters — автоматический tenant_id/brand_id в каждом EF query.

Endpoint без [Authorize] — блокер в code review. Исключение только для явно public endpoints с явным [AllowAnonymous] и комментарием.

Secrets И PII В Логах

SensitiveDataMaskingPolicy в Serilog. Поля с [Sensitive] атрибутом не попадают в logs. Password, token, CVV, PAN, IBAN, email+name вместе — запрещены в structured log properties.

Secrets хранятся в Vault/k8s Secrets, читаются через IOptions<T>. appsettings.Production.json не содержит реальных credentials.

Input Validation

Two-level validation: API validator (format/range) + MediatR validator (business rules). Нет mass assignment через AutoMapper в aggregates. URL redirects — whitelist. File uploads — extension whitelist + size limit.

Callback Signature Validation

Каждый webhook callback валидируется по HMAC signature перед любой бизнес-логикой. Callback без подписи → 401 Unauthorized.

Rate Limiting

Auth endpoints — strict per-IP. Sensitive operations — sliding window per-actor. Rejection → 429 ProblemDetails.

Последствия

  • Endpoint без авторизации не проходит architecture test.
  • Secrets в логах обнаруживаются через log scanning в CI/CD.
  • Tenant isolation проверяется интеграционными тестами (cross-tenant data access тест fail closed).
  • Callback без подписи никогда не обрабатывается.

Ссылки

Обратные ссылки

Автоссылки: где используется этот документ.