Назад до блогу

Як компанії захистити свої API: Практичні кроки

Опубліковано 10 лютого 2025

Цей гайд — про те, як побудувати практичну і відтворювану модель безпеки API: від інвентаризації й аутентифікації до тестування, моніторингу та реагування.

1) Інвентаризація та базова гігієна

  • Повний реєстр API. Продукційні, стейджинг, внутрішні, експериментальні. Зв’яжи кожен ендпойнт з командою-власником.
  • Контракти. Зберігай OpenAPI/AsyncAPI схеми в репозиторії. Увімкни перевірку схеми в CI.
  • Життєвий цикл. Вказуй статус (alpha/beta/GA/deprecated) і дату EOL. Версіонуй: /v1, /v2.

2) Сильна аутентифікація та авторизація

  • OAuth2/OIDC + JWT для публічних/мобільних клієнтів; mTLS або підписані ключі для сервіс-ту-сервіс.
  • Scopes/permissions. Принцип найменших привілеїв, окремі токени на кожен use-case.
  • Ротація та короткий TTL. Access-токени короткі, refresh-токени з ротацією.
  • BOLA/BFLA-захист. Перевіряй право доступу до кожного ресурсу, а не лише роль користувача.
Приклад (OpenAPI securitySchemes)
{
  "components": {
    "securitySchemes": {
      "oauth2": {
        "type": "oauth2",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://auth.example.com/oauth/authorize",
            "tokenUrl": "https://auth.example.com/oauth/token",
            "scopes": {
              "orders:read": "Read orders",
              "orders:write": "Create/modify orders"
            }
          }
        }
      }
    }
  },
  "security": [{ "oauth2": ["orders:read"] }]
}

3) Транспорт і заголовки

  • TLS 1.2+ обов’язково, HSTS, заборона HTTP. Для внутрішніх — mTLS.
  • CORS: дозволяй тільки довірені origin, credentials — off за замовчуванням.
  • Безпечні заголовки: Content-Security-Policy, X-Content-Type-Options: nosniff, Referrer-Policy.

4) Валідація вхідних даних та захист від ін’єкцій

  • Схеми: JSON Schema/DTO-валідація перед бізнес-логікою.
  • Ліміти полів: max length, allowed enums, strict types; заборона зайвих полів (масове присвоєння).
  • Sanitize для HTML/SQL/LDAP/NoSQL. Параметризовані запити.

5) Ліміти, квоти, анти-аб’юз

  • Rate limiting (per-IP, per-token, per-user) і burst control.
  • Quotas на день/місяць, окремі для бекграунд-джобів і інтерактивних клієнтів.
  • Pagination + server-side filtering — проти масового витоку (scraping).
Приклад (nginx rate limit)
limit_req_zone $binary_remote_addr zone=api_zone:10m rate=10r/s;
server {
  location /api/ {
    limit_req zone=api_zone burst=30 nodelay;
  }
}

6) Секрети та ключі

  • Vault/KMS, жодних секретів у git або у змінних середовища без шифрування.
  • Прив’язка ключів до середовищ, регулярна ротація, детальні audit logs.

7) Логи, моніторинг і виявлення загроз

  • Стандартизовані логи: request id, subject (userId/clientId), scope, ресурс, результат, latency.
  • Аномалії: різкий сплеск 401/403/429, незвичні гео, нетипові scopes — тригери для alerting/SIEM.
  • Ідемпотентність для POST (ключ-ідемпотентності) + ретраї на клієнті.

8) Вебхуки

  • Підпис повідомлень (HMAC) + timestamp, перевірка відхилення за часом.
  • Retry з backoff, ідемпотентні обробники, allowlist IP або mTLS.
Приклад перевірки підпису (PHP)
<?php
$payload = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_TS'] ?? '';
$sig = $_SERVER['HTTP_X_SIG'] ?? '';
$secret = getenv('WEBHOOK_SECRET');

$base = $ts . '.' . $payload;
$calc = base64_encode(hash_hmac('sha256', $base, $secret, true));

if (!hash_equals($calc, $sig) || abs(time() - (int)$ts) > 300) {
  http_response_code(401);
  exit('invalid signature');
}
echo 'ok';

9) Тестування безпеки (безперервне)

  • SAST/DAST у CI, fuzzing за контрактом OpenAPI.
  • Контракт-тестування провайдер ↔ споживач (Pact тощо).
  • Перевірки OWASP API Top-10 (BOLA, BFLA, Excessive Data Exposure, Mass Assignment, SSRF тощо).
  • Багбаунті або приватні дослідники — до/після релізу великих змін.

10) Процеси інцидент-респонсу

  • Runbook для витоків ключів, компрометації токенів, масового brute-force.
  • Кнопка «kill-switch»: відкликання ключів/токенів, блок локацій/клієнтів, зниження лімітів.
  • Комунікаційний план для клієнтів та регуляторні зобов’язання.

Швидкий чекліст перед релізом

  • ✅ OpenAPI схема оновлена та валідована в CI
  • ✅ OAuth2/OIDC або mTLS, короткоживучі токени, ротація
  • ✅ Перевірки авторизації на рівні ресурсу (BOLA)
  • ✅ Валідація даних, заборона зайвих полів
  • ✅ Rate limiting + квоти, CORS лише для trusted origin
  • ✅ Секрети у Vault/KMS, ротація ключів
  • ✅ Логи з request id, алерти за аномаліями
  • ✅ Вебхуки підписані, ідемпотентні
  • ✅ SAST/DAST/fuzz у CI, перевірка OWASP API Top-10
  • ✅ Runbook інцидентів та «kill-switch» перевірені

Захист API — це не одноразовий аудит, а дисципліна. Почни з базових контролів, автоматизуй перевірки в CI/CD і підтримуй прозорість: чіткі контракти, логи та відповідальні власники сервісів.